Buat gambar OS kustom dengan Alicloud Image Builder untuk mempercepat penyediaan node di kelompok node ACK.
Prasyarat
-
Kluster ACK yang dikelola telah dibuat.
Klien kubectl telah terhubung ke kluster ACK. Untuk informasi selengkapnya, lihat Menghubungkan ke kluster ACK menggunakan kubectl.
Mengapa menggunakan gambar kustom untuk penskalaan
Kelompok node ACK mendukung Auto Scaling dengan gambar OS bawaan, seperti Alibaba Cloud Linux dan CentOS, yang mencakup sebagian besar kasus penggunaan. Untuk skenario yang memerlukan perangkat lunak pra-instal atau konfigurasi berkinerja tinggi, gunakan Alicloud Image Builder untuk membuat gambar OS kustom.
Kirimkan tugas pembuatan gambar ke kluster sebagai Job atau CronJob.
Membuat gambar kustom dengan ACK Job
Contoh berikut menggunakan ConfigMap bernama build-config dan Job bernama build.
Langkah 1: Konfigurasikan parameter pembuatan
Buat ConfigMap bernama build-config untuk mengonfigurasi parameter pembuatan gambar.
-
Buat file bernama build-config.yaml dengan konten YAML berikut.
Tabel berikut mencantumkan parameter YAML tersebut.
Tabel 1. Parameter dalam file konfigurasi Alicloud Image Builder
Parameter
Contoh
Deskripsi
variables{"<variable1>":"<value>"}variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
variablesuntuk Alicloud Image Builder.CatatanMenyematkan informasi sensitif seperti
access_keydansecret_keysecara langsung dalam file konfigurasi menimbulkan risiko keamanan. Definisikan sebagai variabel yang menerima nilai saat runtime.builders{"type":"<value>"}builders{"type":"alicloud-ecs"}
Image builder (
builders). Ketika type bernilai alicloud-ecs, instans ECS sementara dibuat untuk membangun gambar dan dilepas setelah selesai.provisioners{"type":"<value>"}provisioners{"type":"shell"}
Provisioner gambar (
provisioners) yang mendefinisikan operasi pada instans sementara. Ketika type bernilai shell, skrip shell dijalankan secara otomatis pada instans tersebut. Misalnya,yum install redis.x86_64 -ymenginstal Redis.Lihat Konfigurasi provisioner.
Tabel 2. Parameter pembuatan gambar
Parameter
Contoh
Deskripsi
Wajib
access_keyyourAccessKeyID
ID pasangan AccessKey. Lihat Mendapatkan pasangan AccessKey.
Ya
secret_keyyourAccessKeySecret
Rahasia pasangan AccessKey.
Ya
regioncn-beijing
Wilayah gambar kustom.
Ya
image_nameack-custom_image
Nama gambar kustom. Harus unik di antara gambar yang sudah ada.
Ya
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
ID gambar publik Alibaba Cloud dengan OS yang sesuai. Lihat Gambar OS yang didukung oleh ACK.
Ya
instance_typeecs.c6.xlarge
Tipe instans ECS untuk instans pembuatan sementara. Tentukan tipe GPU-accelerated untuk gambar GPU.
Ya
RUNTIMEcontainerd
Container runtime. Nilai yang valid:
dockerdancontainerd.Ya
RUNTIME_VERSION1.6.28
-
Jika container runtime adalah docker, nilai default
RUNTIME_VERSIONadalah 19.03.15. -
Jika container runtime adalah containerd, nilai default
RUNTIME_VERSIONadalah 1.6.20.
Ya
SKIP_SECURITY_FIXtrue
Menentukan apakah pembaruan keamanan dilewati.
Ya
KUBE_VERSION1.30.1-aliyun.1
Versi kluster.
Ya
PRESET_GPUtrue
Menentukan apakah driver GPU dipra-instal untuk mempercepat startup.
Tidak
NVIDIA_DRIVER_VERSION460.91.03
Versi driver GPU yang akan dipra-instal. Nilai default: 460.91.03.
Tidak
OS_ARCHamd64
Arsitektur CPU. Nilai yang valid:
amd64danarm64.Ya
MOUNT_RUNTIME_DATADISK
true
Atur ke true jika gambar kustom memiliki cache gambar aplikasi dan disk data perlu dimount ke instans ECS saat digunakan.
Tidak
Penting-
Sebelum menetapkan gambar kustom ke kelompok node, pastikan konfigurasi kelompok node (versi kluster, wilayah, container runtime, tipe instans GPU) sesuai dengan pengaturan pembuatan gambar. Jika tidak, node tidak dapat bergabung ke kluster.
-
Untuk validasi, tambahkan gambar ke kelompok node biasa dengan parameter yang sesuai dan verifikasi beban kerja Anda berjalan sebagaimana mestinya.
-
-
Deploy Alicloud Image Builder ke kluster:
kubectl apply -f build-config.yaml
Langkah 2: Buat Job pembuatan
-
Berikan izin yang diperlukan kepada pasangan AccessKey dengan kebijakan berikut.
-
Hasilkan string Base64-encoded untuk pasangan AccessKey Anda:
echo -n "yourAccessKeyID" | base64 echo -n "yourAccessKeySecret" | base64 -
Buat Secret bernama my-secret dengan YAML berikut.
apiVersion: v1 kind: Secret metadata: name: my-secret namespace: default type: Opaque data: ALICLOUD_ACCESS_KEY: TFRI**************** # String Base64-encoded dari langkah sebelumnya. ALICLOUD_SECRET_KEY: a0zY**************** -
Buat file bernama build.yaml dengan konten YAML berikut.
Job ini membuat instans ECS sementara dari
source_image, menjalankan skripprovisioners, lalu membuat gambar kustom dan mendorongnya ke wilayah yang ditentukan. -
Deploy Job untuk memulai pembuatan gambar.
kubectl apply -f build.yaml
Langkah 3: (Opsional) Lihat log pembuatan
Proses pembuatan menghasilkan log yang mencatat langkah-langkah seperti validasi parameter, pembuatan resource sementara, pra-instalasi perangkat lunak, dan pembersihan.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Dalam daftar Jobs, temukan Job yang Anda buat. Pada kolom Actions, klik Details, lalu klik tab Logs untuk melihat log pembuatan.
Konfigurasi provisioner
Provisioner menginstal dan mengonfigurasi perangkat lunak pada mesin yang sedang berjalan sebelum mengambil snapshot-nya sebagai gambar OS. Kasus penggunaan umum:
-
Menginstal paket perangkat lunak.
-
Memperbarui kernel.
-
Membuat pengguna.
-
Mengunduh kode aplikasi.
-
Membuat gambar kustom Alibaba Cloud Linux 3.
Jalankan skrip shell
"provisioners": [{
"type": "shell",
"script": "script.sh"
}]
Jalankan playbook Ansible
"provisioners": [
{
"type": "ansible",
"playbook_file": "./playbook.yml"
}
]
Instal klien CPFS
Pemasangan klien CPFS memerlukan banyak paket dan kompilasi on-the-fly, yang bisa lambat. Gambar kustom mengurangi biaya instalasi saat diskalakan.
Buat gambar kustom untuk arsitektur Arm
Buat gambar OS node GPU
Gambar kustom GPU dan gambar kustom CPU tidak dapat digunakan bersamaan.
Cache gambar aplikasi
Menambahkan instans ECS dengan disk data yang disambungkan ke kelompok node akan menginisialisasi disk data, sehingga menghapus gambar aplikasi yang telah di-cache sebelumnya. Untuk mempertahankannya, buat snapshot disk data saat membangun gambar kustom.
{
"variables": {
"image_name": "ack-custom_image",
"source_image": "aliyun_3_x64_20G_alibase_20240528.vhd",
"instance_type": "ecs.c6.xlarge",
"access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
"region": "{{env `ALICLOUD_REGION`}}",
"secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
},
"builders": [
{
"type": "alicloud-ecs",
"system_disk_mapping": {
"disk_size": 120,
"disk_category": "cloud_essd"
},
"image_disk_mappings": {
"disk_size": 40,
"disk_category": "cloud_auto"
}, # Konfigurasikan disk data saat Anda membangun gambar kustom. Setelah pembuatan gambar selesai, proses secara otomatis membuat snapshot dari disk data tersebut.
"access_key": "{{user `access_key`}}",
"secret_key": "{{user `secret_key`}}",
"region": "{{user `region`}}",
"image_name": "{{user `image_name`}}",
"source_image": "{{user `source_image`}}",
"instance_type": "{{user `instance_type`}}",
"ssh_username": "root",
"skip_image_validation": "true",
"io_optimized": "true"
}
],
"provisioners": [
{
"type": "file",
"source": "scripts/ack-optimized-os-linux3-all.sh",
"destination": "/root/"
},
{
"type": "shell",
"inline": [
"export RUNTIME=containerd",
"export RUNTIME_VERSION=2.1.6",
"export SKIP_SECURITY_FIX=true",
"export KUBE_VERSION=1.30.1-aliyun.1",
"export OS_ARCH=amd64",
"export MOUNT_RUNTIME_DATADISK=true", # Mount path file container runtime ke disk data.
"bash /root/ack-optimized-os-linux3-all.sh",
"ctr -n k8s.io i pull registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/pause:3.9", # Masukkan gambar aplikasi ke dalam gambar OS.
"mv /var/lib/containerd /var/lib/container/containerd" # Pindahkan file gambar ke disk data.
]
}
]
}
Saat mengonfigurasi kelompok node, pilih gambar kustom dengan snapshot disk data. Sistem akan memberi prompt bahwa snapshot disk data dimuat secara otomatis, dengan tipe disk diatur ke ESSD AutoPL, kapasitas 120 GiB, serta opsi untuk performa burst dan release-with-instance. Disk diinisialisasi dalam format container runtime menggunakan ext4. Jika Anda mengubah kapasitas disk data, Anda harus memperluas partisi dan sistem file secara manual setelah instans ECS dibuat.

Tarik dari registri privat (Docker)
docker login <image_address> -u user -p password
docker pull nginx
Tarik dari registri privat (containerd)
ctr -n k8s.io i pull --user=username:password nginx
Tarik dari registri privat selama pembuatan
-
Pada mesin Linux dengan Docker terinstal, jalankan
docker loginuntuk menghasilkan kredensial.docker login --username=zhongwei.***@aliyun-test.com --password xxxxxxxxxx registry.cn-beijing.aliyuncs.comdocker loginyang berhasil membuat config.json di direktori/root/.docker.
-
Buat ConfigMap dari config.json yang dihasilkan.
apiVersion: v1 kind: ConfigMap metadata: name: docker-config data: config.json: |- { "auths": { "registry.cn-beijing.aliyuncs.com": { "auth": "xxxxxxxxxxxxxx" } }, "HttpHeaders": { "User-Agent": "Docker-Client/19.03.15 (linux)" } } -
Modifikasi YAML Job untuk memount ConfigMap ke dalam Pod.

-
Modifikasi file build-config sebagai berikut.

-
Jalankan Job.
Atur unggahan dan unduhan gambar konkuren
Masuk ke Konsol ACK atau . Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Klik nama kelompok node target. Pada tab Basic Information, temukan bagian Node Pool Information dan klik tautan di samping Auto Scaling Group.
-
Klik tab Instance Configuration Sources. Temukan konfigurasi penskalaan target, klik Modify di kolom Actions, lalu klik OK.
-
Pada halaman Modify scaling configuration, perluas Advanced Settings dan salin konten User Data. Decode data Base64 dalam kotak User Data.
-
Decode dan modifikasi user data.
Decode Instance User Data dalam Base64 dan tambahkan kode berikut ke skrip.
Kode ini menginstal
jq, memperbarui konfigurasi daemon Docker untuk meningkatkan unduhan dan unggahan konkuren, lalu merestart Docker.yum install -y jq echo "$(jq '. += {"max-concurrent-downloads": 20,"max-concurrent-uploads": 20}' /etc/docker/daemon.json)" > /etc/docker/daemon.json service docker restart
-
Encode ulang dan perbarui data.
Encode skrip yang telah dimodifikasi ke dalam Base64. Ganti konten dalam kotak User Data dengan output hasil encode dan klik OK.