Halaman ini menunjukkan cara meningkatkan latensi startup workload menggunakan boot disk sekunder di Google Kubernetes Engine (GKE) untuk melakukan pramuat data atau image container pada node baru. Hal ini memungkinkan workload mencapai cold start yang cepat dan meningkatkan pemanfaatan resource yang disediakan secara keseluruhan.
Halaman ini mengasumsikan pengetahuan tentang Google Cloud, Kubernetes, container, YAML, runtime dalam container, dan Google Cloud CLI.
Ringkasan
Mulai dari GKE versi 1.28.3-gke.1067000 di cluster Standar dan di GKE versi 1.30.1-gke.1329000 di cluster Autopilot, Anda dapat mengonfigurasi kumpulan node dengan disk booting sekunder. Anda dapat memberi tahu GKE untuk menyediakan node dan melakukan pramuat data, seperti model machine learning, atau image container. Penggunaan image container bawaan atau data dalam disk sekunder memiliki manfaat berikut untuk workload Anda:
- Mengurangi latensi saat mengambil image container besar, atau mendownload data
- Penskalaan otomatis yang lebih cepat
- Pemulihan yang lebih cepat dari gangguan seperti peristiwa pemeliharaan dan kesalahan sistem
Bagian berikut menjelaskan cara mengonfigurasi boot disk sekunder di cluster GKE Autopilot dan Standard.
Cara kerja boot disk sekunder
Beban kerja Anda dapat dimulai lebih cepat menggunakan image container bawaan atau data pada boot disk sekunder. Disk booting sekunder memiliki karakteristik berikut:
- Boot disk sekunder adalah Persistent Disk yang didukung oleh block storage terdistribusi. Jika disk image sudah digunakan di zona tersebut, waktu pembuatan semua disk berikutnya dari disk image yang sama akan lebih singkat.
- Jenis boot disk sekunder sama dengan boot disk node.
- Ukuran boot disk sekunder ditentukan oleh ukuran disk image.
Menambahkan disk booting sekunder ke kumpulan node tidak akan memperpanjang waktu penyediaan node. GKE menyediakan disk booting sekunder dari image disk secara paralel dengan proses penyediaan node.
Untuk mendukung image container yang telah dimuat sebelumnya, GKE memperluas runtime containerd dengan plugin yang membaca image container dari boot disk sekunder. Image container digunakan kembali oleh lapisan dasar—sebaiknya Anda melakukan pramuat lapisan dasar yang besar ke dalam boot disk sekunder, sedangkan lapisan kecil di atas dapat diambil dari registry container.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Mengaktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
initialize
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan
gcloud components update
.
Mengaktifkan Container File System API.
Persyaratan
Persyaratan berikut berlaku untuk penggunaan boot disk sekunder:
- Cluster Anda menjalankan GKE versi 1.28.3-gke.1067000 di GKE Standard atau versi 1.30.1-gke.1329000 di GKE Autopilot.
- Saat Anda mengubah disk image, buat node pool baru. Memperbarui image disk pada node yang ada tidak didukung.
- Konfigurasikan Streaming image untuk menggunakan fitur boot disk sekunder.
- Gunakan Container-Optimized OS dengan image node dalam container. Node Autopilot menggunakan gambar node ini secara default.
- Siapkan disk image dengan data yang siap selama waktu build atau dengan image container yang dimuat sebelumnya. Pastikan cluster Anda memiliki akses ke disk image untuk dimuat di node. Sebaiknya otomatiskan disk image di pipeline CI/CD.
Menyiapkan boot disk sekunder
Untuk menyiapkan boot disk sekunder, pilih tab Images untuk melakukan pramuat image container atau pilih tab Data untuk melakukan pramuat data, lalu selesaikan petunjuk berikut:
Gambar
GKE menyediakan alat bernama
gke-disk-image-builder
untuk membuat virtual machine (VM) dan menarik image container ke disk, lalu membuat disk
image dari disk tersebut.
Untuk membuat disk image dengan beberapa image container bawaan, selesaikan langkah-langkah berikut:
- Buat bucket Cloud Storage untuk menyimpan log eksekusi
gke-disk-image-builder
. - Buat disk image dengan
gke-disk-image-builder
.
go run ./cli \
--project-name=PROJECT_ID \
--image-name=DISK_IMAGE_NAME \
--zone=LOCATION \
--gcs-path=gs://LOG_BUCKET_NAME \
--disk-size-gb=10 \
--container-image=docker.io/library/python:latest \
--container-image=docker.io/library/nginx:latest
Ganti kode berikut:
- PROJECT_ID: nama project Google Cloud Anda.
- DISK_IMAGE_NAME: nama image
disk. Misalnya,
nginx-python-image
. - LOCATION: lokasi cluster.
- LOG_BUCKET_NAME: nama bucket Cloud Storage
untuk menyimpan log eksekusi. Contohnya,
gke-secondary-disk-image-logs/
Saat Anda membuat disk image dengan gke-disk-image-builder
, Google Cloud akan membuat beberapa resource untuk menyelesaikan proses ini (misalnya, instance VM, disk sementara, dan persistent disk). Setelah dieksekusi, pembuat gambar akan membersihkan semua resource kecuali disk image yang
Anda buat.
Data
Buat disk image kustom sebagai sumber data dengan menyelesaikan langkah-langkah berikut:
Mengonfigurasi boot disk sekunder
Anda dapat mengonfigurasi boot disk sekunder di cluster GKE Autopilot atau Standard. Sebaiknya gunakan cluster Autopilot untuk pengalaman Kubernetes yang terkelola sepenuhnya. Untuk memilih mode operasi GKE yang paling sesuai dengan workload Anda, lihat Memilih mode operasi GKE.
Menggunakan Autopilot GKE
Di bagian ini, Anda akan membuat daftar disk image yang diizinkan untuk mengizinkan disk image di cluster GKE Autopilot yang ada. Kemudian, Anda akan memodifikasi pemilih node Pod untuk menggunakan boot disk sekunder.
Izinkan disk image di project Anda
Di bagian ini, Anda akan membuat GCPResourceAllowlist
untuk memungkinkan GKE membuat node dengan boot disk sekunder dari disk image di project Google Cloud Anda.
Simpan manifes berikut sebagai
allowlist-disk.yaml
:apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/PROJECT_ID/global/images/.*"
Ganti PROJECT_ID dengan project ID Anda untuk menghosting image disk.
Terapkan manifes:
kubectl apply -f allowlist-disk.yaml
GKE membuat node dengan boot disk sekunder dari semua disk image dalam project.
Mengupdate pemilih node Pod untuk menggunakan boot disk sekunder
Di bagian ini, Anda akan memodifikasi spesifikasi Pod agar GKE membuat node dengan boot disk sekunder.
Tambahkan
nodeSelector
ke template Pod Anda:nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME=CONTAINER_IMAGE_CACHE.PROJECT_ID
Ganti kode berikut:
- DISK_IMAGE_NAME: nama disk image Anda.
- PROJECT_ID: project ID Anda untuk menghosting disk image.
Gunakan perintah
kubectl apply
untuk menerapkan spesifikasi Kubernetes dengan template Pod.Pastikan cache boot disk sekunder sedang digunakan:
kubectl get events --all-namespaces
Outputnya mirip dengan hal berikut ini:
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Periksa latensi pull image:
kubectl describe pod POD_NAME
Ganti POD_NAME dengan nama Pod.
Outputnya mirip dengan berikut ini:
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
Latensi pull image yang diharapkan untuk image container yang di-cache harus dikurangi secara signifikan, berapa pun ukuran image-nya.
Gunakan GKE Standard
Untuk membuat cluster GKE Standar dan kumpulan node, selesaikan petunjuk berikut, pilih tab Gambar atau Data berdasarkan apakah Anda ingin melakukan pramuat image container atau data di pramuat disk boot sekunder:
Gambar
Anda dapat mengonfigurasi boot disk sekunder menggunakan Google Cloud CLI atau Terraform:
gcloud
Buat cluster GKE Standard dengan streaming gambar yang diaktifkan:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-image-streaming
Ganti kode berikut:
- CLUSTER_NAME: nama cluster Anda.
- LOCATION: lokasi cluster.
- VERSION: versi GKE yang akan digunakan. Versi GKE harus
1.28.3-gke.106700
atau yang lebih baru.
Buat kumpulan node dengan boot disk sekunder dalam project yang sama:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Ganti kode berikut:
- NODE_POOL_NAME: nama node pool.
- CLUSTER_NAME: nama cluster yang ada.
- LOCATION: zona atau zona komputasi yang dipisahkan oleh koma cluster.
- DISK_IMAGE_NAME: nama disk image Anda.
Untuk membuat kumpulan node dengan boot disk sekunder dari disk image dalam project lain, selesaikan langkah-langkah dalam Menggunakan boot disk sekunder di project yang berbeda.
Tambahkan
nodeSelector
ke template Pod Anda:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Pastikan cache boot disk sekunder sedang digunakan:
kubectl get events --all-namespaces
Outputnya mirip dengan hal berikut ini:
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Periksa latensi pull image dengan menjalankan perintah berikut:
kubectl describe pod POD_NAME
Ganti
POD_NAME
dengan nama Pod.Outputnya mirip dengan berikut ini:
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
Latensi pull image yang diharapkan untuk image container yang di-cache tidak boleh lebih dari beberapa detik, berapa pun ukuran image-nya.
Terraform
Untuk membuat cluster dengan kumpulan node default menggunakan Terraform, lihat contoh berikut:
Tambahkan
nodeSelector
ke template Pod Anda:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Pastikan cache boot disk sekunder sedang digunakan:
kubectl get events --all-namespaces
Outputnya mirip dengan hal berikut ini:
75s Normal SecondaryDiskCachin node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
Periksa latensi pull image dengan menjalankan perintah berikut:
kubectl describe pod POD_NAME
Ganti POD_NAME dengan nama Pod.
Outputnya mirip dengan berikut ini:
… Normal Pulled 15m kubelet Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s …
Latensi pull image yang diharapkan untuk image container yang di-cache tidak boleh lebih dari beberapa detik, berapa pun ukuran image-nya.
Untuk mempelajari penggunaan Terraform lebih lanjut, lihat Dukungan Terraform untuk GKE.
Data
Anda dapat mengonfigurasi boot disk sekunder dan melakukan pramuat data dengan menggunakan Google Cloud CLI atau Terraform:
gcloud
Buat cluster GKE Standard dengan streaming gambar yang diaktifkan:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-image-streaming
Ganti kode berikut:
- CLUSTER_NAME: nama cluster Anda.
- LOCATION: lokasi cluster.
- VERSION: versi GKE yang akan digunakan. Versi GKE harus 1.28.3-gke.106700 atau yang lebih baru.
Buat kumpulan node dengan boot disk sekunder menggunakan tanda
--secondary-boot-disk
:gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME
Ganti kode berikut:
- NODE_POOL_NAME: nama node pool.
- CLUSTER_NAME: nama cluster yang ada.
- LOCATION: zona atau zona komputasi yang dipisahkan oleh koma cluster.
- DISK_IMAGE_NAME: nama disk image Anda.
Untuk membuat kumpulan node dengan boot disk sekunder dari disk image dalam project lain, selesaikan langkah-langkah dalam Menggunakan boot disk sekunder di project yang berbeda.
GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data yang dimuat sebelumnya. GKE memasang dan memasang boot disk sekunder pada node.
Anda juga dapat memasang disk image sekunder di container Pod menggunakan pemasangan volume hostPath. Gunakan manifes berikut untuk menentukan resource Pod dan menggunakan pemasangan volume hostPath untuk melakukan pramuat disk data di container-nya:
apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data_path_sbd ... volumes: - name: data_path_sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
Ganti DISK_IMAGE_NAME dengan nama disk image Anda.
Terraform
Untuk membuat cluster dengan kumpulan node default menggunakan Terraform, lihat contoh berikut:
Untuk mempelajari penggunaan Terraform lebih lanjut, baca artikel Dukungan Terraform untuk GKE.
Anda juga dapat memasang disk image sekunder di container Pod menggunakan pemasangan volume hostPath. Gunakan manifes berikut untuk menentukan resource Pod dan menggunakan pemasangan volume hostPath untuk melakukan pramuat disk data di container-nya:
apiVersion: v1 kind: Pod metadata: name: pod-name spec: containers: ... volumeMounts: - mountPath: /usr/local/data_path_sbd name: data_path_sbd ... volumes: - name: data_path_sbd hostPath: path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
Ganti DISK_IMAGE_NAME dengan nama disk image Anda.
Penskalaan otomatis cluster dengan boot disk sekunder
Anda dapat membuat kumpulan node dan mengonfigurasi penskalaan otomatis cluster di boot disk sekunder menggunakan Google Cloud CLI:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location LOCATION \
--enable-image-streaming \
--secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE \
--enable-autoscaling \
--num-nodes NUM_NODES \
--min-nodes MIN_NODES \
--max-nodes MAX_NODES
Ganti kode berikut:
- NODE_POOL_NAME: nama node pool.
- CLUSTER_NAME: nama cluster yang ada.
- LOCATION: zona atau zona komputasi yang dipisahkan oleh koma cluster.
- DISK_IMAGE_NAME: nama disk image Anda.
- MIN_NODES: jumlah minimum node yang akan diskalakan secara otomatis untuk node pool yang ditentukan per zona. Guna menentukan jumlah minimum node untuk seluruh node pool di GKE versi 1.24 dan yang lebih baru, gunakan
--total-min-nodes
. Flag--total-min-nodes
dan--total-max-nodes
tidak dapat muncul bersamaan dengan flag--min-nodes
dan--max-nodes
. - MAX_NODES: jumlah maksimum node yang akan diskalakan secara otomatis untuk node pool yang ditentukan per zona. Guna menentukan jumlah maksimum node untuk seluruh node pool di GKE versi 1.24 dan yang lebih baru, gunakan
--total-max-nodes
. Flag--total-min-nodes
dan--total-max-nodes
tidak dapat muncul bersamaan dengan flag--min-nodes
dan--max-nodes
.
Penyediaan otomatis node dengan boot disk sekunder
Di GKE 1.30.1-gke.1329000 dan yang lebih baru, Anda dapat mengonfigurasi penyediaan otomatis node agar secara otomatis membuat dan menghapus kumpulan node guna memenuhi kebutuhan resource dari beban kerja Anda.
Buat resource kustom daftar image disk yang diizinkan untuk boot disk sekunder untuk penyediaan otomatis node GKE seperti berikut:
apiVersion: "node.gke.io/v1" kind: GCPResourceAllowlist metadata: name: gke-secondary-boot-disk-allowlist spec: allowedResourcePatterns: - "projects/<PROJECT_ID>/global/images/.*"
Ganti PROJECT_ID dengan project ID Anda untuk menghosting disk image.
Deploy resource kustom daftar yang diizinkan di cluster, jalankan perintah berikut:
kubectl apply -f ALLOWLIST_FILE
Ganti ALLOWLIST_FILE dengan nama file manifes.
Update pemilih node Pod untuk menggunakan boot disk sekunder:
nodeSelector: cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME=CONTAINER_IMAGE_CACHE.PROJECT_ID
Ganti kode berikut:
- DISK_IMAGE_NAME: nama disk image Anda.
- PROJECT_ID: project ID Anda untuk menghosting disk image.
Menggunakan boot disk sekunder di project lain
Saat membuat kumpulan node dengan boot disk sekunder, Anda dapat memberi tahu GKE untuk menggunakan disk image di project yang berbeda menggunakan flag --secondary-boot-disk
.
Buat kumpulan node dengan boot disk sekunder dari disk image di project lain menggunakan tanda
--secondary-boot-disk
. Contoh:gcloud beta container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION \ --enable-image-streaming \ --secondary-boot-disk=disk-image=projects/IMAGE_PROJECT_ID/global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
Ganti kode berikut:
- DISK_IMAGE_NAME: nama disk image Anda.
- IMAGE_PROJECT_ID: nama project tempat disk image berada.
GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data yang dimuat sebelumnya. Tindakan ini akan memasang dan memasang boot disk sekunder ke node.
Berikan akses ke disk image milik project yang berbeda dengan menambahkan peran "Compute Image User" untuk akun layanan cluster:
- Akun layanan komputasi default: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
- Akun layanan GKE: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \ --role roles/compute.imageUser gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \ --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role roles/compute.imageUser
Langkah selanjutnya
- Gunakan Gunakan Streaming gambar untuk mengambil image container guna mengambil image container dengan melakukan streaming data image sesuai kebutuhan workload Anda.
- Lihat Meningkatkan efisiensi workload menggunakan NCCL Fast Socket untuk mempelajari cara menggunakan plugin Fast Socket NVIDIA Collective Communication Library (NCCL).