Menggunakan boot disk sekunder untuk melakukan pramuat data atau image container


Halaman ini menunjukkan cara meningkatkan latensi pengaktifan beban kerja dengan menggunakan sekunder boot disk di Google Kubernetes Engine (GKE) untuk melakukan pramuat data atau image container pada node baru. Hal ini memungkinkan beban kerja untuk mencapai cold start yang cepat dan untuk meningkatkan pemanfaatan keseluruhan sumber daya yang disediakan.

Sebelum membaca dokumen ini, pastikan Anda sudah memahami Google Cloud, Kubernetes, container, YAML, containerd, dan Google Cloud CLI.

Ringkasan

Mulai GKE versi 1.28.3-gke.1067000 dalam Standard dan GKE versi 1.30.1-gke.1329000 in Cluster Autopilot, Anda dapat mengonfigurasi kumpulan node dengan booting sekunder {i>disk<i}. Anda dapat mengetahui GKE untuk menyediakan node dan melakukan pramuat dengan data, seperti model machine learning (ML), atau image container. Menggunakan image container yang dimuat sebelumnya 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 mengkonfigurasi boot disk sekunder di Cluster Standard dan Autopilot GKE.

Cara kerja boot disk sekunder

Beban kerja Anda dapat dimulai lebih cepat menggunakan penampung yang dimuat sebelumnya atau data pada disk booting sekunder. Disk booting sekunder memiliki karakteristik berikut:

  • Boot disk sekunder 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 cepat.
  • 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 meningkatkan jumlah node untuk waktu penyediaan. GKE menyediakan boot disk sekunder dari sebuah secara paralel dengan proses penyediaan node.

Praktik terbaik:

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

Pramuat lapisan dasar besar ke lapisan sekunder sementara lapisan atas yang kecil dapat diambil dari kontainer {i>registry<i}.

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 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 boot disk sekunder:

  1. Cluster Anda menjalankan versi GKE 1.28.3-gke.1067000 di GKE Standard atau versi 1.30.1-gke.1329000 di GKE Autopilot.
  2. Saat mengubah disk image, Anda harus membuat node pool baru. Memperbarui {i>disk image <i}pada {i>node <i}yang ada tidak didukung.
  3. Mengonfigurasi Streaming gambar untuk menggunakan fitur {i>booting disk<i} sekunder.
  4. Menggunakan Container-Optimized OS dengan node dalam container gambar. Node Autopilot menggunakan gambar node ini secara default.
  5. Menyiapkan disk image dengan data yang siap selama waktu build atau dengan pramuat image container. Pastikan cluster Anda memiliki akses ke disk image untuk dimuat node tersebut.

    Praktik terbaik:

    Mengotomatiskan disk image dalam pipeline CI/CD.

Batasan

Disk booting sekunder memiliki batasan berikut:

  • Anda tidak dapat mengupdate boot disk sekunder untuk node yang sudah ada. Untuk melampirkan disk image baru, buat node pool baru.

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:

Image

GKE menyediakan alat yang disebut gke-disk-image-builder membuat virtual machine (VM), menarik image container ke disk, lalu membuat disk image aplikasi dari disk tersebut.

Untuk membuat disk image dengan beberapa image container bawaan, selesaikan langkah langkah-langkah berikut:

  1. Membuat 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 gambar {i>disk<i}. Contoh, nginx-python-image.
  • LOCATION: lokasi cluster.
  • LOG_BUCKET_NAME: nama Cloud Storage bucket untuk menyimpan log eksekusi. Contohnya, gke-secondary-disk-image-logs/

Saat Anda membuat {i>disk image <i}dengan gke-disk-image-builder, Google Cloud membuat beberapa resource untuk menyelesaikan proses (untuk misalnya, instance VM, disk sementara, dan persistent disk). Setelah eksekusinya, metode image builder membersihkan semua resource, kecuali disk image yang dibuat.

Data

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

  1. Buat 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 boot disk sekunder

Anda dapat mengonfigurasi boot disk sekunder di GKE Autopilot atau cluster Standar.

Praktik terbaik:

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 disk image yang diizinkan untuk mengizinkan disk image GKE yang sudah ada Cluster Autopilot. Kemudian, ubah pemilih node Pod untuk menggunakan boot disk sekunder.

Izinkan disk image di project Anda

Di bagian ini, Anda akan membuat GCPResourceAllowlist untuk mengizinkan GKE untuk membuat node dengan boot disk sekunder dari {i>disk image <i}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 {i>disk image <i}tersebut.

  2. 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 dapat memodifikasi spesifikasi Pod agar 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 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
    
  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 image yang diharapkan untuk image container yang di-cache harus berkurang secara signifikan, terlepas dari ukuran gambar.

Gunakan GKE Standard

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

Image

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

gcloud

  1. Membuat cluster GKE Standard dengan gambar streaming 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. Tujuan Versi GKE harus 1.28.3-gke.1067000 atau yang lebih baru.
  2. 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 komputasi atau zona yang dipisahkan oleh koma untuk cluster tersebut.
    • DISK_IMAGE_NAME: nama disk image Anda.

    Untuk membuat kumpulan node dengan boot disk sekunder dari disk image di project lain, selesaikan langkah-langkah dalam artikel Menggunakan boot disk sekunder di project yang berbeda.

  3. Tambahkan nodeSelector ke template Pod Anda:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. 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
    
  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 harus tidak lebih dari beberapa detik, berapa pun ukuran gambarnya.

Terraform

  1. Untuk membuat cluster dengan kumpulan node default menggunakan Terraform, lihat referensi 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 kumpulan node dengan boot disk sekunder dalam 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 penggunaan Terraform lebih lanjut, lihat Dukungan Terraform untuk GKE.

  3. Tambahkan nodeSelector ke template Pod Anda:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. 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
    
  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, berapa pun ukuran gambarnya.

Untuk mempelajari penggunaan Terraform lebih lanjut, lihat Dukungan Terraform untuk GKE.

Data

Anda dapat mengonfigurasi {i>boot disk<i} sekunder dan melakukan pramuat data dengan menggunakan Google Cloud CLI atau Terraform:

gcloud

  1. Membuat cluster GKE Standard dengan gambar streaming 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. Tujuan Versi GKE harus 1.28.3-gke.1067000 atau yang lebih baru.
  2. Buat kumpulan node dengan boot disk sekunder menggunakan metode 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 komputasi atau zona yang dipisahkan oleh koma untuk cluster tersebut.
    • DISK_IMAGE_NAME: nama disk image Anda.

    Untuk membuat kumpulan node dengan boot disk sekunder dari disk image di project lain, selesaikan langkah-langkah dalam artikel Menggunakan boot disk sekunder di project yang berbeda.

    GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data bawaan. GKE memasang dan memasang boot disk sekunder pada node.

  3. Jika ingin, Anda dapat memasang disk image sekunder di container Pod menggunakan pemasangan volume hostPath. Menggunakan manifes berikut untuk menentukan Pod dan menggunakan pemasangan volume hostPath untuk melakukan pramuat disk data pada container:

    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 {i>disk image <i}Anda.

Terraform

  1. Untuk membuat cluster dengan kumpulan node default menggunakan Terraform, lihat referensi 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 kumpulan node dengan boot disk sekunder dalam 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 penggunaan Terraform lebih lanjut, lihat Dukungan Terraform untuk GKE.

  3. Jika ingin, Anda dapat memasang disk image sekunder di container Pod menggunakan pemasangan volume hostPath. Menggunakan manifes berikut untuk menentukan Pod dan menggunakan pemasangan volume hostPath untuk melakukan pramuat disk data pada container:

    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

Untuk membuat kumpulan node dan mengonfigurasi penskalaan otomatis cluster pada booting sekunder disk, 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 oleh koma untuk cluster tersebut.
  • 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 otomatis membuat dan menghapus kumpulan node untuk memenuhi kebutuhan resource sebagian besar workload standar dan berbasis cloud.

  1. Membuat resource kustom daftar image disk yang diizinkan untuk boot disk sekunder Penyediaan otomatis node GKE mirip 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 {i>disk image<i}.

  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. 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 project yang berbeda menggunakan flag --secondary-boot-disk.

  1. Membuat kumpulan node dengan boot disk sekunder dari disk image 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 yang dimiliki oleh {i>disk image<i}.

    GKE membuat node pool tempat setiap node memiliki disk sekunder dengan data bawaan. GKE memasang dan memasang {i>boot disk<i} sekunder ke {i>node<i}.

  2. Berikan akses ke disk image milik project lain dengan menambahkan "Compute Image User" peran untuk akun layanan cluster:

    • Akun layanan komputasi default: CLUSTER_PROJECT_NUMBER@cloudservices.
    • Akun layanan GKE: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices. \
        --role roles/compute.imageUser
    
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot. \
        --role roles/compute.imageUser
    

Langkah selanjutnya