Halaman ini menunjukkan cara meningkatkan latensi startup workload menggunakan disk boot sekunder di Google Kubernetes Engine (GKE) untuk memuat data atau image container di node baru. Hal ini memungkinkan workload mencapai cold start yang cepat dan meningkatkan pemanfaatan keseluruhan resource yang disediakan.
Sebelum membaca halaman ini, pastikan Anda memahami Google Cloud, Kubernetes, container, YAML, runtime containerd, dan Google Cloud CLI.
Ringkasan
Mulai GKE versi 1.28.3-gke.1067000 di cluster Standard dan GKE versi 1.30.1-gke.1329000 di cluster Autopilot, Anda dapat mengonfigurasi node pool dengan disk boot sekunder. Anda dapat memberi tahu GKE untuk menyediakan node dan memuat datanya terlebih dahulu, seperti model machine learning (ML), atau image container. Menggunakan image container atau data yang sudah dimuat sebelumnya di disk sekunder memiliki manfaat berikut untuk workload Anda:
- Mengurangi latensi saat menarik image container berukuran besar, atau mendownload data
- Penskalaan otomatis yang lebih cepat
- Pemulihan yang lebih cepat dari gangguan seperti peristiwa pemeliharaan dan error sistem
Bagian berikut menjelaskan cara mengonfigurasi disk boot sekunder di cluster GKE Autopilot dan Standard.
Cara kerja disk booting sekunder
Beban kerja Anda dapat dimulai lebih cepat dengan menggunakan image atau data container yang telah dimuat sebelumnya di boot disk sekunder. Boot disk sekunder memiliki karakteristik berikut:
- Boot disk sekunder adalah Persistent Disk yang didukung oleh block storage terdistribusi.
- Persistent Disk di-instantiate dari image disk yang Anda buat sebelumnya.
- Untuk alasan skalabilitas, setiap node mendapatkan instance Persistent Disk-nya sendiri yang dibuat dari image disk. Instance Persistent Disk ini dihapus saat node dihapus.
- Jika image disk sudah digunakan di zona, waktu pembuatan semua disk berikutnya yang dibuat dari image disk yang sama akan lebih rendah.
- Jenis boot disk sekunder sama dengan boot disk node.
- Ukuran disk boot sekunder ditentukan oleh ukuran image disk.
Menambahkan disk boot sekunder ke kumpulan node biasanya tidak akan meningkatkan waktu penyediaan node. GKE menyediakan boot disk 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.
Lakukan pramuat lapisan dasar yang besar ke dalam disk boot sekunder, sementara lapisan atas yang kecil dapat ditarik dari registry container.
Sebelum memulai
Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
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 disk boot 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 mengubah image disk, Anda harus membuat kumpulan node baru. Memperbarui image disk pada node yang ada tidak didukung.
- Konfigurasi Image streaming untuk menggunakan fitur disk boot sekunder.
- Gunakan Container-Optimized OS dengan image node containerd. Node Autopilot menggunakan image node ini secara default.
Siapkan image disk dengan data yang siap selama waktu build atau dengan image container yang sudah dimuat sebelumnya. Pastikan cluster Anda memiliki akses ke image disk untuk dimuat ke node.
Praktik terbaik: Mengotomatiskan image disk dalam pipeline CI/CD.
Batasan
Anda tidak dapat mengupdate disk boot sekunder untuk node yang ada. Untuk melampirkan image disk baru, buat kumpulan node baru.
Harga
Saat Anda membuat node pool dengan disk booting sekunder, GKE akan melampirkan Persistent Disk ke setiap node dalam node pool. Persistent Disk ditagih berdasarkan harga disk Compute Engine.
Menyiapkan image boot disk sekunder
Untuk menyiapkan image boot disk sekunder, pilih tab Image untuk melakukan pramuat image container atau pilih tab Data untuk melakukan pramuat data, lalu selesaikan petunjuk berikut:
Gambar
GKE menyediakan alat yang disebut
gke-disk-image-builder
untuk membuat virtual machine (VM), menarik image container pada disk, lalu membuat disk
image dari disk tersebut.
Untuk membuat image disk dengan beberapa image container yang sudah dimuat sebelumnya, 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. Contoh,
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 image disk dengan
gke-disk-image-builder
,
Google Cloud membuat beberapa resource untuk menyelesaikan proses (misalnya, instance VM, disk sementara, dan persistent disk). Setelah dieksekusi, pembuat
image akan membersihkan semua resource, kecuali image disk yang Anda
buat.
Data
Buat image disk kustom sebagai sumber data dengan menyelesaikan langkah-langkah berikut:
Mengonfigurasi boot disk sekunder
Anda dapat mengonfigurasi disk boot sekunder di cluster GKE Autopilot atau Standard.
Gunakan cluster Autopilot untuk pengalaman Kubernetes yang terkelola sepenuhnya. Untuk memilih mode operasi GKE yang paling sesuai untuk workload Anda, lihat Memilih mode operasi GKE.
Menggunakan Autopilot GKE
Di bagian ini, Anda akan membuat daftar yang diizinkan untuk image disk agar image disk diizinkan di cluster Autopilot GKE yang ada. Kemudian, Anda mengubah pemilih node Pod untuk menggunakan disk boot sekunder.
Mengizinkan image disk dalam project Anda
Di bagian ini, Anda akan membuat GCPResourceAllowlist
untuk mengizinkan GKE membuat node dengan boot disk sekunder dari image disk di projectGoogle 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 image disk dalam project.
Memperbarui pemilih node Pod untuk menggunakan disk boot sekunder
Di bagian ini, Anda akan mengubah spesifikasi Pod sehingga 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 disk boot 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
Cara yang lebih andal untuk mengonfirmasi bahwa cache disk boot sekunder sedang digunakan:
Kueri log dari node yang Anda minati menggunakan nama log ini:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Ganti
PROJECT_ID
dengan Google Cloud project ID Anda.Log yang mirip dengan:
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
menunjukkan bahwa cache disk boot sekunder digunakan.Periksa latensi penarikan 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 penarikan image yang diharapkan untuk image container yang di-cache harus berkurang secara signifikan, terlepas dari ukuran image.
Menggunakan GKE Standard
Untuk membuat cluster Standar GKE dan node pool, selesaikan petunjuk berikut, dengan memilih tab Image atau Data berdasarkan apakah Anda ingin melakukan pramuat image container atau pramuat data ke boot disk sekunder:
Gambar
Untuk mengonfigurasi disk boot sekunder, gunakan 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.1067000
atau yang lebih baru.
Buat node pool dengan boot disk sekunder di 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 komputasi atau zona yang dipisahkan dengan koma dari cluster.
- DISK_IMAGE_NAME: nama disk image Anda.
Untuk membuat node pool dengan disk boot sekunder dari image disk dalam project yang berbeda, selesaikan langkah-langkah di Menggunakan disk boot sekunder dalam project yang berbeda.
Tambahkan
nodeSelector
ke template Pod Anda:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Pastikan cache disk boot 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
Cara yang lebih andal untuk mengonfirmasi bahwa cache disk boot sekunder sedang digunakan:
Kueri log dari node yang Anda minati menggunakan nama log ini:
logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
Ganti
PROJECT_ID
dengan Google Cloud project ID Anda.Log yang mirip dengan:
Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%...
menunjukkan bahwa cache disk boot sekunder digunakan.Periksa latensi penarikan 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 penarikan image yang diharapkan untuk image container yang di-cache tidak boleh lebih dari beberapa detik, terlepas dari ukuran image.
Terraform
Untuk membuat cluster dengan node pool default menggunakan Terraform, lihat contoh berikut:
Buat node pool dengan boot disk sekunder di project yang sama:
Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.
Tambahkan
nodeSelector
ke template Pod Anda:nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
Pastikan cache disk boot 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 penarikan 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 penarikan image yang diharapkan untuk image container yang di-cache tidak boleh lebih dari beberapa detik, terlepas dari ukuran image.
Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.
Data
Anda dapat mengonfigurasi boot disk sekunder dan memuat data terlebih dahulu 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.1067000 atau yang lebih baru.
Buat node pool dengan boot disk sekunder menggunakan flag
--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 komputasi atau zona yang dipisahkan dengan koma dari cluster.
- DISK_IMAGE_NAME: nama disk image Anda.
Untuk membuat node pool dengan disk boot sekunder dari image disk dalam project yang berbeda, selesaikan langkah-langkah di Menggunakan disk boot sekunder dalam project yang berbeda.
GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data yang sudah dimuat sebelumnya. GKE memasang dan mem-mount disk boot sekunder di node.
Untuk mengakses data, pasang image boot disk sekunder di container Pod menggunakan pemasangan volume hostPath. Tetapkan
/usr/local/data_path_sbd
ke jalur di penampung tempat Anda ingin data berada: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 image disk Anda.
Terraform
Untuk membuat cluster dengan node pool default menggunakan Terraform, lihat contoh berikut:
Buat node pool dengan boot disk sekunder di project yang sama:
Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.
Untuk mengakses data, pasang image boot disk sekunder di container Pod menggunakan pemasangan volume hostPath. Tetapkan
/usr/local/data_path_sbd
ke jalur di penampung tempat Anda ingin data berada: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 image disk Anda.
Penskalaan otomatis cluster dengan boot disk sekunder
Untuk membuat node pool dan mengonfigurasi penskalaan otomatis cluster pada disk boot sekunder, gunakan 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 komputasi atau zona yang dipisahkan dengan koma dari 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 untuk membuat dan menghapus node pool secara otomatis guna memenuhi permintaan resource dari workload Anda.
Buat resource kustom daftar yang diizinkan image disk untuk boot disk sekunder untuk penyediaan otomatis node GKE yang serupa dengan berikut ini:
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.
Deploy resource kustom daftar yang diizinkan di cluster, jalankan perintah berikut:
kubectl apply -f ALLOWLIST_FILE
Ganti ALLOWLIST_FILE dengan nama file manifes.
Perbarui pemilih node Pod untuk menggunakan disk boot 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 disk booting sekunder dalam project yang berbeda
Saat membuat node pool dengan boot disk sekunder, Anda dapat memberi tahu GKE untuk menggunakan image disk di project lain dengan menggunakan flag --secondary-boot-disk
.
Buat node pool dengan boot disk sekunder dari image disk di project yang berbeda menggunakan flag
--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 yang memiliki disk image.
GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data yang telah dimuat sebelumnya. GKE memasang dan mem-mount boot disk sekunder ke node.
Berikan akses ke image disk milik project lain 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 berikutnya
- Gunakan Menggunakan streaming Image untuk menarik image container guna menarik image container dengan melakukan streaming data image sesuai kebutuhan beban kerja Anda.
- Lihat Meningkatkan efisiensi workload menggunakan NCCL Fast Socket untuk mempelajari cara menggunakan plugin Fast Socket NVIDIA Collective Communication Library (NCCL).