Menggunakan boot disk sekunder untuk melakukan pramuat data atau image container


Halaman ini menunjukkan cara meningkatkan latensi startup workload menggunakan disk booting sekunder di Google Kubernetes Engine (GKE) untuk memuat data atau image container secara offline di node baru. Hal ini memungkinkan workload mencapai cold start yang cepat dan meningkatkan pemanfaatan resource yang disediakan secara keseluruhan.

Sebelum membaca halaman ini, pastikan Anda sudah memahami Google Cloud, Kubernetes, penampung, YAML, runtime container, dan Google Cloud CLI.

Ringkasan

Mulai 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 node pool dengan disk booting sekunder. Anda dapat memberi tahu GKE untuk menyediakan node dan memuat data secara otomatis, seperti model machine learning (ML), atau image container. Menggunakan image container atau data yang dimuat sebelumnya di disk sekunder memiliki manfaat berikut untuk workload Anda:

  • Mengurangi latensi saat mengambil image penampung 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 booting 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 dimuat sebelumnya di disk booting sekunder. Disk booting sekunder memiliki karakteristik berikut:

  • Disk booting sekunder adalah Persistent Disk yang didukung oleh block storage terdistribusi. Jika image disk sudah digunakan di zona, waktu pembuatan semua disk berikutnya dari image disk yang sama akan lebih rendah.
  • Jenis boot disk sekunder sama dengan boot disk node.
  • Ukuran disk booting sekunder ditentukan oleh ukuran disk image.

Menambahkan disk booting sekunder ke node pool tidak akan meningkatkan waktu penyediaan node. GKE menyediakan disk booting sekunder dari image disk secara paralel dengan proses penyediaan node.

Praktik terbaik:

Untuk mendukung image container yang dimuat sebelumnya, GKE memperluas runtime containerd dengan plugin yang membaca image container dari disk booting sekunder. Image container digunakan kembali oleh lapisan dasar.

Muat lapisan dasar besar ke dalam disk booting sekunder, sedangkan lapisan atas kecil dapat diambil dari registry penampung.

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.

Persyaratan

Persyaratan berikut berlaku untuk penggunaan disk booting sekunder:

  1. Cluster Anda menjalankan GKE versi 1.28.3-gke.1067000 di GKE Standard atau versi 1.30.1-gke.1329000 di GKE Autopilot.
  2. Saat mengubah image disk, Anda harus membuat kumpulan node baru. Memperbarui image disk pada node yang ada tidak didukung.
  3. Konfigurasikan Image streaming untuk menggunakan fitur disk booting sekunder.
  4. Gunakan Container-Optimized OS dengan image node containerd. Node Autopilot menggunakan image node ini secara default.
  5. Siapkan image disk dengan data yang siap selama waktu build atau dengan image penampung yang dimuat sebelumnya. Pastikan cluster Anda memiliki akses ke disk image untuk dimuat ke node.

    Praktik terbaik:

    Mengotomatiskan image disk di pipeline CI/CD.

Batasan

Disk booting sekunder memiliki batasan berikut:

  • Anda tidak dapat memperbarui disk booting sekunder untuk node yang ada. Untuk melampirkan image disk baru, buat kumpulan node baru.

Menyiapkan disk booting sekunder

Untuk menyiapkan disk booting sekunder, pilih tab Images untuk melakukan pramuat image container atau pilih tab Data untuk melakukan pramuat data, lalu selesaikan petunjuk berikut:

Image

GKE menyediakan alat yang disebut gke-disk-image-builder untuk membuat virtual machine (VM), mengambil image penampung di disk, lalu membuat image disk dari disk tersebut.

Untuk membuat image disk dengan beberapa image container yang dimuat sebelumnya, selesaikan langkah-langkah berikut:

  1. Buat bucket Cloud Storage untuk menyimpan log eksekusi gke-disk-image-builder.
  2. 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 akan membuat beberapa resource untuk menyelesaikan proses (misalnya, instance VM, disk sementara, dan persistent disk). Setelah dieksekusi, pembuat image akan membersihkan semua resource, kecuali disk image yang Anda buat.

Data

Buat image disk kustom sebagai sumber data dengan menyelesaikan langkah-langkah berikut:

  1. Membuat VM dengan disk kosong.
  2. Gunakan SSH untuk terhubung ke VM.
    1. Pasang disk kosong.
    2. Download data ke disk kosong.
  3. Buat image kustom dari disk.

Mengonfigurasi disk booting sekunder

Anda dapat mengonfigurasi disk booting sekunder di cluster GKE Autopilot atau Standard.

Praktik terbaik:

Gunakan cluster Autopilot untuk pengalaman Kubernetes yang dikelola 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 guna mengizinkan image disk di cluster GKE Autopilot yang ada. Kemudian, Anda mengubah pemilih node Pod untuk menggunakan disk booting sekunder.

Mengizinkan image disk dalam project Anda

Di bagian ini, Anda akan membuat GCPResourceAllowlist untuk mengizinkan GKE membuat node dengan disk booting sekunder dari image disk di project Google Cloud Anda.

  1. 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.

  2. Terapkan manifes:

    kubectl apply -f allowlist-disk.yaml
    

    GKE membuat node dengan disk booting sekunder dari semua image disk dalam project.

Memperbarui pemilih node Pod untuk menggunakan disk booting sekunder

Di bagian ini, Anda akan mengubah spesifikasi Pod sehingga GKE membuat node dengan boot disk sekunder.

  1. 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.
  2. Gunakan perintah kubectl apply untuk menerapkan spesifikasi Kubernetes dengan template Pod.

  3. Pastikan cache disk booting 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
    
  4. 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 gambar yang diharapkan untuk image container yang di-cache harus dikurangi secara signifikan, terlepas dari ukuran gambar.

Menggunakan GKE Standard

Untuk membuat cluster GKE Standard dan node pool, selesaikan petunjuk berikut, dengan memilih tab Images atau Data berdasarkan apakah Anda ingin melakukan pramuat image container atau pramuat data ke boot disk sekunder:

Image

Untuk mengonfigurasi disk booting sekunder, gunakan Google Cloud CLI atau Terraform:

gcloud

  1. Buat cluster GKE Standard dengan streaming image 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.
  2. Buat node pool dengan disk booting 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 yang dipisahkan dengan koma cluster.
    • DISK_IMAGE_NAME: nama disk image Anda.

    Untuk membuat node pool dengan disk booting sekunder dari image disk di project lain, selesaikan langkah-langkah di Menggunakan disk booting sekunder di project lain.

  3. Tambahkan nodeSelector ke template Pod Anda:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. Pastikan cache disk booting 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
    
  5. 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, terlepas dari ukuran image.

Terraform

  1. Untuk membuat cluster dengan node pool default menggunakan Terraform, lihat contoh berikut:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
      # Set `min_master_version` because secondary_boot_disks require GKE 1.28.3-gke.106700 or later.
      min_master_version = "1.28"
      # Setting `deletion_protection` to `true` would prevent
      # accidental deletion of this instance using Terraform.
      deletion_protection = false
    }
  2. Buat node pool dengan disk booting sekunder di project yang sama:

    resource "google_container_node_pool" "secondary-boot-disk-container" {
      name               = "secondary-boot-disk-container"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
          mode       = "CONTAINER_IMAGE_CACHE"
        }
      }
    }

    Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.

  3. Tambahkan nodeSelector ke template Pod Anda:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. Pastikan cache disk booting 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
    
  5. 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, terlepas dari ukuran image.

Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.

Data

Anda dapat mengonfigurasi disk booting sekunder dan memuat data secara otomatis menggunakan Google Cloud CLI atau Terraform:

gcloud

  1. Buat cluster GKE Standard dengan streaming image 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.
  2. Buat node pool dengan disk booting 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 yang dipisahkan dengan koma cluster.
    • DISK_IMAGE_NAME: nama disk image Anda.

    Untuk membuat node pool dengan disk booting sekunder dari image disk di project lain, selesaikan langkah-langkah di Menggunakan disk booting sekunder di project lain.

    GKE membuat node pool dengan setiap node memiliki disk sekunder dengan data yang dimuat sebelumnya. GKE memasang dan me-mount disk booting sekunder di node.

  3. Secara opsional, Anda dapat memasang image disk sekunder di penampung Pod menggunakan pemasangan volume hostPath. Gunakan manifes berikut untuk menentukan resource Pod dan gunakan pemasangan volume hostPath untuk memuat disk data di penampung-nya terlebih dahulu:

    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

  1. Untuk membuat cluster dengan node pool default menggunakan Terraform, lihat contoh berikut:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
      # Set `min_master_version` because secondary_boot_disks require GKE 1.28.3-gke.106700 or later.
      min_master_version = "1.28"
      # Setting `deletion_protection` to `true` would prevent
      # accidental deletion of this instance using Terraform.
      deletion_protection = false
    }
  2. Buat node pool dengan disk booting sekunder di project yang sama:

    resource "google_container_node_pool" "secondary-boot-disk-data" {
      name               = "secondary-boot-disk-data"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
        }
      }
    }

    Untuk mempelajari lebih lanjut cara menggunakan Terraform, lihat Dukungan Terraform untuk GKE.

  3. Secara opsional, Anda dapat memasang image disk sekunder di penampung Pod menggunakan pemasangan volume hostPath. Gunakan manifes berikut untuk menentukan resource Pod dan gunakan pemasangan volume hostPath untuk memuat disk data di penampung-nya terlebih dahulu:

    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 disk booting sekunder

Untuk membuat node pool dan mengonfigurasi penskalaan otomatis cluster di disk booting 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 yang dipisahkan dengan 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 disk booting 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.

  1. Buat resource kustom daftar yang diizinkan image disk untuk disk booting sekunder untuk penyediaan otomatis node GKE yang mirip dengan 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 image disk.

  2. Deploy resource kustom daftar yang diizinkan di cluster, jalankan perintah berikut:

    kubectl apply -f ALLOWLIST_FILE
    

    Ganti ALLOWLIST_FILE dengan nama file manifes.

  3. Perbarui pemilih node Pod untuk menggunakan disk booting 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 di project lain

Saat membuat node pool dengan disk booting sekunder, Anda dapat memberi tahu GKE untuk menggunakan image disk di project yang berbeda menggunakan flag --secondary-boot-disk.

  1. Buat node pool dengan disk booting sekunder dari image disk di project lain 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 menjadi milik disk image.

    GKE membuat node pool dengan setiap node memiliki disk sekunder dengan data yang dimuat sebelumnya. GKE memasang dan melampirkan disk booting sekunder ke node.

  2. Berikan akses ke image disk yang termasuk dalam 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 selanjutnya