Mempersiapkan snapshot Pod

Snapshot Pod Google Kubernetes Engine (GKE) memungkinkan Anda menyimpan dan memulihkan status Pod yang berjalan untuk meningkatkan latensi startup workload. Sebelum dapat mengambil snapshot workload, Anda harus menyiapkan cluster dan lingkungan penyimpanan.

Gunakan dokumen ini untuk mempelajari cara mengaktifkan dan mengonfigurasi snapshot Pod di cluster Anda serta menyiapkan Cloud Storage untuk menyimpan snapshot. Untuk mengetahui informasi selengkapnya tentang cara kerja snapshot Pod, lihat Tentang snapshot Pod GKE.

Admin dan operator platform serta Developer aplikasi dapat menggunakan dokumen ini untuk mengonfigurasi cluster, membuat bucket penyimpanan, dan menyiapkan izin akses untuk snapshot Pod. Untuk mengetahui informasi selengkapnya tentang peran umum dan tugas contoh yang dirujuk dalam Cloud de Confiance by S3NS konten, lihat Peran dan tugas pengguna GKE umum umum.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan 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 perintah gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung perintah yang dijalankan dalam dokumen ini.

Mengaktifkan snapshot Pod

Anda dapat mengaktifkan snapshot Pod di cluster baru atau yang sudah ada. Snapshot Pod memerlukan GKE Sandbox dan Workload Identity Federation untuk GKE. Cluster Autopilot mengaktifkan kedua fitur tersebut secara default. Untuk cluster Standar, Anda harus mengaktifkan Workload Identity Federation untuk GKE di cluster dan mengonfigurasi node pool untuk berjalan di GKE Sandbox.

Untuk mengaktifkan snapshot Pod di cluster, ikuti langkah-langkah untuk mode operasi GKE yang ingin Anda gunakan:

Autopilot

  • Untuk mengaktifkan snapshot Pod di cluster baru, jalankan perintah berikut:

      gcloud container clusters create-auto CLUSTER_NAME \
          --enable-pod-snapshots \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.
    • CLUSTER_VERSION: versi cluster baru Anda, yang harus 1.35.3-gke.1234000 atau yang lebih baru.
  • Untuk mengaktifkan snapshot Pod di cluster yang sudah ada, ikuti langkah-langkah berikut:

    1. Upgrade cluster ke versi 1.35.3-gke.1234000 atau yang lebih baru:

        gcloud container clusters upgrade CLUSTER_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      Ganti kode berikut:

      • CLUSTER_NAME: nama cluster Anda.
      • CLUSTER_VERSION: versi untuk mengupgrade cluster Anda, yang harus 1.35.3-gke.1234000 atau yang lebih baru.
      • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.
    2. Aktifkan snapshot Pod di cluster Anda:

        gcloud container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

      Ganti kode berikut:

      • CLUSTER_NAME: nama cluster Anda.
      • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.

Snapshot Pod dengan cakupan whole-pod default tidak mendukung jenis mesin E2, sedangkan snapshot sistem file (rootfs-only) mendukung. Di cluster Autopilot, GKE mungkin menjadwalkan Pod di node E2 secara default. Jika Anda menggunakan cakupan whole-pod, gunakan resource kustom ComputeClass untuk membantu memastikan workload Anda berjalan di hardware yang kompatibel.

Untuk membuat dan menggunakan resource kustom ComputeClass, ikuti langkah-langkah berikut:

  1. Simpan manifes berikut sebagai non-e2-class.yaml:

      apiVersion: cloud.google.com/v1
      kind: ComputeClass
      metadata:
        name: non-e2-class
      spec:
        priorities:
        - machineFamily: n2
        - machineFamily: c3
        activeMigration:
          optimizeRulePriority: false
        whenUnsatisfiable: DoNotScaleUp
    
  2. Terapkan manifes:

      kubectl apply -f non-e2-class.yaml
    
  3. Dalam spesifikasi Pod Anda, referensikan resource kustom ComputeClass menggunakan pemilih node cloud.google.com/compute-class:

      spec:
        nodeSelector:
          cloud.google.com/compute-class: non-e2-class
        # Multiple lines are omitted here
    

Standar

  • Untuk mengaktifkan snapshot Pod di cluster baru, jalankan perintah berikut:

      gcloud container clusters create CLUSTER_NAME \
          --enable-pod-snapshots \
          --cluster-version=CLUSTER_VERSION \
          --workload-pool=PROJECT_ID.s3ns.svc.id.goog \
          --workload-metadata=GKE_METADATA \
          --location=CONTROL_PLANE_LOCATION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • CLUSTER_VERSION: versi cluster baru Anda, yang harus 1.35.3-gke.1234000 atau yang lebih baru.
    • PROJECT_ID: project ID Anda.
    • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.
  • Untuk mengaktifkan snapshot Pod di cluster yang sudah ada, ikuti langkah-langkah berikut:

    1. Upgrade cluster ke versi 1.35.3-gke.1234000 atau yang lebih baru:

        gcloud container clusters upgrade CLUSTER_NAME \
            --node-pool=NODE_POOL_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      Ganti kode berikut:

    2. Aktifkan snapshot Pod di cluster Anda:

        gcloud beta container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

      Ganti kode berikut:

      • CLUSTER_NAME: nama cluster Anda.
      • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.

Untuk menjalankan Pod di GKE Sandbox pada cluster Standar, Anda harus membuat atau mengupdate node pool dengan GKE Sandbox yang diaktifkan. Untuk mengupdate node pool, gunakan flag --sandbox type=gvisor. Untuk membuat node pool dengan GKE Sandbox yang diaktifkan, jalankan perintah berikut:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --node-version=NODE_VERSION \
    --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION \
    --image-type=cos_containerd \
    --sandbox type=gvisor

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool baru Anda.
  • CLUSTER_NAME: nama cluster Anda.
  • NODE_VERSION: versi yang akan digunakan untuk node pool.
  • MACHINE_TYPE: jenis mesin yang akan digunakan untuk node.
  • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.

Untuk mengetahui informasi selengkapnya tentang GKE Sandbox, lihat Melakukan hardening pada pemisahan workload dengan GKE Sandbox.

Menyimpan snapshot

GKE menyimpan snapshot Pod di bucket Cloud Storage. Setiap snapshot berisi memori aplikasi dan, secara opsional, status GPU Pod. Untuk melakukan autentikasi ke Cloud Storage, snapshot Pod menggunakan objek ServiceAccount Pod, yang memerlukan Workload Identity Federation for GKE.

Snapshot Pod memerlukan konfigurasi bucket berikut:

  • Namespace hierarkis: Anda harus mengaktifkan namespace hierarkis untuk mendukung kueri baca dan tulis yang lebih tinggi per detik. Namespace hierarkis juga mengharuskan Anda mengaktifkan akses level bucket yang seragam.
  • Penghapusan sementara: karena snapshot Pod menggunakan upload gabungan paralel, nonaktifkan fitur perlindungan data seperti penghapusan sementara. Jika Anda mengaktifkan fitur ini, penghapusan sementara objek sementara dapat meningkatkan tagihan penyimpanan Anda secara signifikan.
  • Lokasi: lokasi bucket Cloud Storage harus berada di lokasi yang sama dengan cluster GKE karena mentransfer snapshot di berbagai region dapat memengaruhi performa.

Untuk membuat bucket dengan konfigurasi yang diperlukan, jalankan perintah berikut:

gcloud storage buckets create gs://BUCKET_NAME \
    --uniform-bucket-level-access \
    --enable-hierarchical-namespace \
    --soft-delete-duration=0d \
    --location=LOCATION

Ganti kode berikut:

  • BUCKET_NAME: nama bucket Anda.
  • LOCATION: lokasi bucket Anda.

Untuk mengetahui daftar lengkap opsi pembuatan bucket, lihat Flag dalam dokumentasi untuk perintah buckets create.

Memberikan akses workload ke bucket Cloud Storage

Secara default, GKE tidak memiliki akses ke Cloud Storage. Untuk membaca dan menulis snapshot Pod, Anda harus memberikan peran IAM yang berisi izin yang sesuai ke objek ServiceAccount Kubernetes yang digunakan Pod workload Anda, atau mengaktifkan multi-tenancy menggunakan token yang berlaku singkat.

Memberikan peran ke objek ServiceAccount Kubernetes tertentu

Untuk memberikan peran ke objek ServiceAccount Kubernetes tertentu, ikuti langkah-langkah berikut:

  1. Untuk berkomunikasi dengan cluster Anda menggunakan perintah kubectl, dapatkan kredensial untuk cluster Anda:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • CONTROL_PLANE_LOCATION: lokasi bidang kontrol cluster Anda.
  2. Untuk setiap Pod, ikuti langkah-langkah berikut:

    1. Buat objek ServiceAccount:

      kubectl create serviceaccount SERVICEACCOUNT_NAME \
          --namespace=NAMESPACE
      

      Ganti kode berikut:

      • SERVICEACCOUNT_NAME: nama objek ServiceAccount Anda.
      • NAMESPACE: namespace untuk Pod Anda.
    2. Untuk mengizinkan objek ServiceAccount membaca metadata bucket, berikan it the Storage Bucket Viewer role (roles/storage.bucketViewer):

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="roles/storage.bucketViewer"
      

      Ganti kode berikut:

      • BUCKET_NAME: nama bucket Anda.
      • PROJECT_NUMBER: nomor project Anda.
      • PROJECT_ID: project ID Anda.
      • NAMESPACE: namespace untuk Pod Anda.
      • SERVICEACCOUNT_NAME: nama objek ServiceAccount Anda.
    3. Untuk mengizinkan objek ServiceAccount membaca dan menulis objek snapshot di bucket, berikan peran Storage Object User (roles/storage.objectUser):

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="roles/storage.objectUser"
      

Mengaktifkan multi-tenancy menggunakan token yang berlaku singkat

Sebagai alternatif untuk memberikan izin ke objek ServiceAccount individual, Anda dapat mengaktifkan multi-tenancy dengan token yang berlaku singkat dan dibatasi cakupannya. Pendekatan ini membantu menghindari penundaan propagasi yang terkait dengan binding IAM manual. Daripada memberikan izin ke setiap objek ServiceAccount, Anda melakukan pemberian peran Storage Admin (roles/storage.admin) satu kali di bucket penyimpanan snapshot ke akun layanan node GKE. Akun layanan node kemudian membuat token yang berlaku singkat sesuai permintaan untuk jalur tertentu.

Mengaktifkan token dengan snapshot Pod memerlukan GKE versi 1.35.3-gke.1737000 atau yang lebih baru.

Untuk mengaktifkan multi-tenancy, ikuti langkah-langkah berikut:

  1. Untuk memberikan izin akun layanan node untuk menggunakan bucket, jalankan perintah berikut:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.s3ns-system.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
    

    Ganti kode berikut:

    • BUCKET_NAME: nama bucket Anda.
    • PROJECT_NUMBER: nomor project Anda.
  2. Saat Anda mengonfigurasi penyimpanan untuk snapshot, tetapkan nilai kolom tokenSource ke federatedP4SA.

Memberikan akses pengontrol snapshot Pod ke bucket Cloud Storage

Untuk mengizinkan pengontrol snapshot Pod menghapus snapshot di dalam bucket Cloud Storage, Anda harus memberikan peran Storage Object User (roles/storage.objectUser) ke agen layanan GKE di project. Untuk memberikan peran, jalankan perintah berikut:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
    --role="roles/storage.objectUser" \
    --condition="expression=resource.name.startsWith(\"projects/_/buckets/BUCKET_NAME\"),title=restrict_to_bucket,description=Restricts access to one bucket only"

Ganti kode berikut:

  • PROJECT_ID: project ID Anda.
  • PROJECT_NUMBER: nomor project Anda.
  • BUCKET_NAME: nama bucket Anda.

Opsional: Membuat folder terkelola untuk bucket Cloud Storage

Untuk mengisolasi izin snapshot dari Pod yang tidak saling dipercaya, yang berguna dalam kasus penggunaan multi-tenant, buat folder terkelola. Untuk menyiapkan folder terkelola, ikuti langkah-langkah berikut:

  1. Buat peran IAM kustom yang hanya berisi izin yang diperlukan untuk snapshot Pod:

    gcloud iam roles create podSnapshotGcsReadWriter \
        --project=PROJECT_ID \
        --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"
    

    Ganti PROJECT_ID dengan project ID Anda.

  2. Berikan peran Storage Bucket Viewer (roles/storage.bucketViewer) ke semua objek ServiceAccount di namespace target. Peran ini memungkinkan objek ServiceAccount membaca metadata bucket, tetapi tidak memberikan izin untuk membaca atau menulis objek di bucket.

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/namespace/NAMESPACE" \
        --role="roles/storage.bucketViewer"
    

    Ganti kode berikut:

    • BUCKET_NAME: nama bucket Anda.
    • PROJECT_NUMBER: nomor project Anda.
    • PROJECT_ID: project ID Anda.
    • NAMESPACE: namespace untuk Pod Anda.
  3. Untuk setiap objek ServiceAccount yang perlu menyimpan snapshot Pod, ikuti langkah-langkah berikut:

    1. Buat folder terkelola untuk objek ServiceAccount:

      gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/
      

      Ganti kode berikut:

      • BUCKET_NAME: nama bucket Anda.
      • FOLDER_PATH: jalur untuk folder terkelola (misalnya, my-app-snapshots).
    2. Berikan peran podSnapshotGcsReadWriter kustom ke objek ServiceAccount di folder terkelola:

      gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/FOLDER_PATH/ \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT_NAME" \
          --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"
      

      Ganti kode berikut:

      • BUCKET_NAME: nama bucket Anda.
      • FOLDER_PATH: jalur untuk folder terkelola (misalnya, my-app-snapshots).
      • PROJECT_NUMBER: nomor project Anda.
      • PROJECT_ID: project ID Anda.
      • NAMESPACE: namespace untuk Pod Anda.
      • SERVICEACCOUNT_NAME: nama objek ServiceAccount Anda.

Mengonfigurasi penyimpanan untuk snapshot

Untuk menentukan tempat penyimpanan snapshot Pod, buat resource kustom PodSnapshotStorageConfig:

  1. Simpan manifes berikut sebagai example-pod-snapshot-storage-config.yaml. Contoh ini mengonfigurasi GKE untuk menyimpan snapshot Pod di jalur FOLDER_PATH/ di dalam bucket Cloud Storage BUCKET_NAME:

    apiVersion: podsnapshot.gke.io/v1
    kind: PodSnapshotStorageConfig
    metadata:
      name: example-pod-snapshot-storage-config
    spec:
      snapshotStorageConfig:
        gcs:
          bucket: "BUCKET_NAME"
          path: "FOLDER_PATH"
          tokenSource: "TOKEN_SOURCE"
    

    Ganti kode berikut:

    • BUCKET_NAME: nama bucket Cloud Storage Anda.
    • FOLDER_PATH: jalur untuk folder terkelola Cloud Storage.
    • TOKEN_SOURCE: penyedia identitas untuk akses. Gunakan podKSA (default) atau federatedP4SA untuk multi-tenancy.
  2. Terapkan manifes:

    kubectl apply -f example-pod-snapshot-storage-config.yaml
    

Langkah berikutnya

Pelajari cara memicu snapshot Pod.