準備好使用 Pod 快照

Google Kubernetes Engine (GKE) Pod 快照可讓您儲存及還原執行中的 Pod 狀態,縮短工作負載啟動延遲時間。您必須先準備叢集和儲存空間環境,才能擷取工作負載的快照。

本文說明如何在叢集啟用及設定 Pod 快照,以及如何設定 Cloud Storage 來儲存快照。如要進一步瞭解 Pod 快照的運作方式,請參閱「關於 GKE Pod 快照」。

平台管理員和營運人員以及應用程式開發人員,可以參考這份文件設定叢集、建立儲存空間值區,以及設定 Pod 快照的存取權。如要進一步瞭解 Cloud de Confiance by S3NS 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

啟用 Pod 快照

您可以在新的或現有的叢集上啟用 Pod 快照。Pod 快照需要 GKE Sandbox 和 Workload Identity Federation for GKE。Autopilot 叢集預設會啟用這兩項功能。如果是 Standard 叢集,您必須在叢集上啟用 Workload Identity Federation for GKE,並設定節點集區在 GKE Sandbox 中執行。

如要在叢集上啟用 Pod 快照,請按照要使用的 GKE 運作模式執行下列步驟:

Autopilot

  • 如要在新叢集啟用 Pod 快照,請執行下列指令:

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

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的位置。
    • CLUSTER_VERSION:新叢集的版本,必須是 1.35.3-gke.1234000 以上版本。
  • 如要在現有叢集啟用 Pod 快照,請按照下列步驟操作:

    1. 將叢集升級至 1.35.3-gke.1234000 以上版本:

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

      更改下列內容:

      • CLUSTER_NAME:叢集名稱。
      • CLUSTER_VERSION:叢集升級的版本,必須為 1.35.3-gke.1234000 以上版本。
      • CONTROL_PLANE_LOCATION:叢集控制層的位置。
    2. 在叢集上啟用 Pod 快照:

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

      更改下列內容:

      • CLUSTER_NAME:叢集名稱。
      • CONTROL_PLANE_LOCATION:叢集控制層的位置。

預設 whole-pod 範圍的 Pod 快照不支援 E2 機器類型,但檔案系統快照 (rootfs-only) 支援。在 Autopilot 叢集中,GKE 預設可能會將 Pod 排定在 E2 節點上。如果使用 whole-pod 範圍,請使用 ComputeClass 自訂資源,確保工作負載在相容的硬體上執行。

如要建立及使用 ComputeClass 自訂資源,請按照下列步驟操作:

  1. 將下列資訊清單儲存為 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. 套用資訊清單:

      kubectl apply -f non-e2-class.yaml
    
  3. 在 Pod 規格中,使用 cloud.google.com/compute-class 節點選取器參照 ComputeClass 自訂資源:

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

標準

  • 如要在新叢集啟用 Pod 快照,請執行下列指令:

      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
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CLUSTER_VERSION:新叢集的版本,必須是 1.35.3-gke.1234000 以上版本。
    • PROJECT_ID:您的專案 ID。
    • CONTROL_PLANE_LOCATION:叢集控制層的位置。
  • 如要在現有叢集上啟用 Pod 快照,請按照下列步驟操作:

    1. 將叢集升級至 1.35.3-gke.1234000 以上版本:

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

      更改下列內容:

      • CLUSTER_NAME:叢集名稱。
      • NODE_POOL_NAME:節點集區的名稱。
      • CLUSTER_VERSION:叢集要升級至的版本,必須是 1.35.3-gke.1234000 以上版本。
      • CONTROL_PLANE_LOCATION:叢集控制層的位置。
    2. 在叢集上啟用 Pod 快照:

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

      更改下列內容:

      • CLUSTER_NAME:叢集名稱。
      • CONTROL_PLANE_LOCATION:叢集控制層的位置。

如要在 Standard 叢集上透過 GKE Sandbox 執行 Pod,您必須建立或更新節點集區,並啟用 GKE Sandbox。如要更新節點集區,請使用 --sandbox type=gvisor 旗標。如要建立啟用 GKE Sandbox 的節點集區,請執行下列指令:

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

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • CLUSTER_NAME:叢集名稱。
  • NODE_VERSION:節點集區要使用的版本。
  • MACHINE_TYPE:節點要使用的機器類型。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

如要進一步瞭解 GKE Sandbox,請參閱「使用 GKE Sandbox 強化工作負載隔離」。

儲存快照

GKE 會將 Pod 快照儲存在 Cloud Storage bucket。每個快照都包含應用程式記憶體,以及 Pod 的 GPU 狀態 (選用)。如要向 Cloud Storage 進行驗證,Pod 快照會使用 Pod 的 ServiceAccount 物件,這需要 Workload Identity Federation for GKE。

Pod 快照需要下列 bucket 設定:

  • 階層命名空間:必須啟用階層命名空間,才能支援更高的每秒讀取和寫入查詢次數。階層命名空間也需要啟用統一 bucket 層級存取權。
  • 虛刪除:由於 Pod 快照會使用平行複合上傳,因此請停用虛刪除等資料保護功能。如果啟用這些功能,暫時物件的虛刪除作業可能會大幅增加儲存空間費用。
  • 位置:Cloud Storage 值區位置必須與 GKE 叢集位於相同位置,因為跨區域傳輸快照可能會影響效能。

執行下列指令,建立具有必要設定的 bucket:

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

更改下列內容:

  • BUCKET_NAME:bucket 名稱。
  • LOCATION:bucket 的位置。

如需完整的 bucket 建立選項清單,請參閱buckets create  指令說明文件中的「 旗標」。

授予工作負載 Cloud Storage bucket 的存取權

根據預設,GKE 無法存取 Cloud Storage。 如要讀取及寫入 Pod 快照,您必須將包含對應權限的 IAM 角色,授予工作負載 Pod 使用的 Kubernetes ServiceAccount 物件,或使用短期權杖啟用多租戶功能。

將角色授予特定 Kubernetes ServiceAccount 物件

如要將角色授予特定 Kubernetes ServiceAccount 物件,請按照下列步驟操作:

  1. 如要使用 kubectl 指令與叢集通訊,請取得叢集的憑證:

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

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的位置。
  2. 請按照下列步驟操作,逐一處理各個 Pod:

    1. 建立 ServiceAccount 物件:

      kubectl create serviceaccount SERVICEACCOUNT_NAME \
          --namespace=NAMESPACE
      

      更改下列內容:

      • SERVICEACCOUNT_NAME:ServiceAccount 物件的名稱。
      • NAMESPACE:Pod 的命名空間。
    2. 如要讓 ServiceAccount 物件讀取 bucket 中繼資料,請授予「Storage bucket 檢視者」角色 (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"
      

      更改下列內容:

      • BUCKET_NAME:bucket 名稱。
      • PROJECT_NUMBER:您的專案編號。
      • PROJECT_ID:您的專案 ID。
      • NAMESPACE:Pod 的命名空間。
      • SERVICEACCOUNT_NAME:ServiceAccount 物件的名稱。
    3. 如要讓 ServiceAccount 物件讀取及寫入 bucket 中的快照物件,請授予「Storage 物件使用者」角色 (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"
      

使用短期權杖啟用多租戶架構

除了授予個別 ServiceAccount 物件權限,您也可以啟用多用戶群,並使用短期、範圍受限的權杖。這種做法有助於避免與手動 IAM 繫結相關的傳播延遲。您不必為每個 ServiceAccount 物件授予權限,只要一次性將快照儲存空間 bucket 的儲存空間管理員角色 (roles/storage.admin) 授予 GKE 節點服務帳戶即可。接著,節點服務帳戶會視需要為特定路徑建立短期權杖。

如要啟用 Pod 快照權杖,必須使用 GKE 1.35.3-gke.1737000 以上版本。

如要啟用多租戶功能,請按照下列步驟操作:

  1. 如要授予節點服務帳戶使用 bucket 的權限,請執行下列指令:

    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"
    

    更改下列內容:

    • BUCKET_NAME:bucket 名稱。
    • PROJECT_NUMBER:您的專案編號。
  2. 設定快照的儲存空間時,請將 tokenSource 欄位的值設為 federatedP4SA。

授予 Pod 快照控制器 Cloud Storage bucket 的存取權

如要讓 Pod 快照控制器刪除 Cloud Storage bucket 內的快照,您必須將專案的「Storage 物件使用者」角色 (roles/storage.objectUser) 授予 GKE 服務代理。如要授予角色,請執行下列指令:

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"

更改下列內容:

  • PROJECT_ID:您的專案 ID。
  • PROJECT_NUMBER:您的專案編號。
  • BUCKET_NAME:bucket 名稱。

選用:為 Cloud Storage bucket 建立受管理資料夾

如要隔離互不信任的 Pod 快照權限 (適用於多租戶用途),請建立代管資料夾。如要設定受管理資料夾,請按照下列步驟操作:

  1. 建立自訂 IAM 角色,僅包含 Pod 快照所需的權限:

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

    將 PROJECT_ID 替換為專案 ID。

  2. 將 Storage bucket 檢視者角色 (roles/storage.bucketViewer) 授予目標命名空間中的所有 ServiceAccount 物件。這個角色可讓 ServiceAccount 物件讀取 bucket 中繼資料,但不會授予讀取或寫入 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"
    

    更改下列內容:

    • BUCKET_NAME:bucket 名稱。
    • PROJECT_NUMBER:您的專案編號。
    • PROJECT_ID:您的專案 ID。
    • NAMESPACE:Pod 的命名空間。
  3. 針對每個需要儲存 Pod 快照的 ServiceAccount 物件,請按照下列步驟操作:

    1. 為 ServiceAccount 物件建立代管資料夾:

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

      更改下列內容:

      • BUCKET_NAME:bucket 名稱。
      • FOLDER_PATH:代管資料夾的路徑 (例如 my-app-snapshots)。
    2. 將代管資料夾的自訂 podSnapshotGcsReadWriter 角色授予 ServiceAccount 物件:

      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"
      

      更改下列內容:

      • BUCKET_NAME:bucket 名稱。
      • FOLDER_PATH:代管資料夾的路徑 (例如 my-app-snapshots)。
      • PROJECT_NUMBER:您的專案編號。
      • PROJECT_ID:您的專案 ID。
      • NAMESPACE:Pod 的命名空間。
      • SERVICEACCOUNT_NAME:ServiceAccount 物件的名稱。

設定快照的儲存空間

如要指定 Pod 快照的儲存位置,請建立 PodSnapshotStorageConfig 自訂資源:

  1. 將下列資訊清單儲存為 example-pod-snapshot-storage-config.yaml。這個範例會設定 GKE,將 Pod 快照儲存在 Cloud Storage bucket BUCKET_NAME 內的 FOLDER_PATH/ 路徑:

    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"
    

    更改下列內容:

    • BUCKET_NAME:Cloud Storage bucket 的名稱。
    • FOLDER_PATH:Cloud Storage 代管資料夾的路徑。
    • TOKEN_SOURCE:存取權的識別資訊提供者。使用 podKSA (預設) 或 federatedP4SA 進行多用戶群。
  2. 套用資訊清單:

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

後續步驟

瞭解如何觸發 Pod 快照。