瞭解如何在叢集上啟用及設定 Google Kubernetes Engine (GKE) Pod 快照,並設定 Cloud Storage 來儲存快照。
如要進一步瞭解 Pod 快照的運作方式,請參閱「關於 Pod 快照」一文。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
啟用 Pod 快照
如要啟用 Pod 快照,請建立或更新叢集,並啟用 Pod 快照功能。如果是 Standard 叢集,您也必須建立或更新節點集區,才能在 GKE Sandbox 中執行。Autopilot 叢集預設支援 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.35.3-gke.1234000 以上版本:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的位置。CLUSTER_VERSION:新叢集的版本,必須是 1.35.3-gke.1234000 以上版本。
在叢集上啟用 Pod 快照:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION
預設
whole-pod範圍 Pod 快照不支援 E2 機器類型。在 Autopilot 中,GKE 可能會預設為不支援 Pod 快照的機器類型。如果您使用whole-pod範圍快照,為確保工作負載在相容的硬體上執行,請使用自訂 ComputeClass 優先處理相容的機器系列。檔案系統快照 (rootfs-only) 支援 E2 機器類型。
如要建立及使用自訂 ComputeClass,請完成下列步驟:
將下列資訊清單儲存為
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套用資訊清單:
kubectl apply -f non-e2-class.yaml在 Pod 規格中,使用
cloud.google.com/compute-class節點選取器參照 ComputeClass:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class ...
標準
如要在新叢集上啟用 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.35.3-gke.1234000 以上版本:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODEPOOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION更改下列內容:
CLUSTER_NAME:叢集名稱。NODEPOOL_NAME:節點集區的名稱。CLUSTER_VERSION:新叢集的更新版本,必須為 1.35.3-gke.1234000 以上版本。CONTROL_PLANE_LOCATION:叢集控制層的位置。
在叢集上啟用 Pod 快照:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的位置。
如要在標準叢集上透過 GKE Sandbox 執行 Pod,請建立或更新已啟用 gVisor 的節點集區。如要更新節點集區,請使用 --sandbox type=gvisor 旗標。如要建立啟用 gVisor 的節點集區,請執行下列指令:
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:叢集控制層的位置。
如要進一步瞭解如何使用 gVisor,請參閱「使用 GKE Sandbox 隔離工作負載」。
儲存快照
Pod 快照會儲存在 Cloud Storage bucket 中,其中包含記憶體和 (選用) GPU 狀態。Pod 快照需要 Workload Identity Federation for GKE,才能啟用及使用 Pod 的服務帳戶向 Cloud Storage 進行驗證。
Pod 快照需要為 bucket 設定下列項目:
- 階層命名空間:必須啟用這項功能,才能提高每秒讀取和寫入查詢的次數。階層命名空間也必須啟用統一 bucket 層級存取權。
- 虛刪除:由於 Pod 快照使用平行複合上傳,您應停用虛刪除等資料保護功能。如果這些功能維持啟用狀態,暫時物件的軟刪除作業可能會大幅增加儲存空間費用。
- 位置:Cloud Storage bucket 位置必須與 GKE 叢集位置相同,因為如果快照在不同區域之間轉移,效能可能會受到影響。
如要建立必要值區和權限,請完成下列步驟:
建立 Cloud Storage 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。 如要讀取及寫入快照檔案,您必須將含有相應權限的 IAM 角色授予工作負載 Pod 使用的 Kubernetes ServiceAccount (KSA),或授予短期權杖。
將角色授予特定 Kubernetes ServiceAccount
取得憑證,以便使用
kubectl指令與叢集通訊:gcloud container clusters get-credentials "CLUSTER_NAME"針對每個 Pod,完成下列步驟:
為每個 Pod 建立 KSA:
kubectl create serviceaccount "KSA_NAME" \ --namespace "NAMESPACE"更改下列內容:
KSA_NAME:KSA 名稱。NAMESPACE:Pod 的命名空間。
授予 KSA 存取值區的權限:
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/KSA_NAME" \ --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/KSA_NAME" \ --role="roles/storage.objectUser"更改下列內容:
BUCKET_NAME:bucket 名稱。PROJECT_NUMBER:您的專案編號。PROJECT_ID:您的專案 ID。NAMESPACE:Pod 的命名空間。KSA_NAME:KSA 名稱。
使用短期權杖啟用多租戶架構
除了授予個別 KSA 權限,您也可以啟用多重租戶,並使用效期短暫且範圍受限的權杖。這個方法有助於避免與手動 IAM 繫結相關聯的傳播延遲。您不需要為每個 KSA 授予權限,只要對 GKE 節點服務帳戶,在快照儲存空間值區上執行一次 roles/storage.admin 角色授予作業即可。節點服務帳戶隨即會為特定路徑建立短期權杖。
如要透過 Pod 快照啟用權杖,必須使用 GKE 1.35.3-gke.1737000 以上版本。
如要啟用多用戶群架構,請完成下列步驟:
如要授予節點服務帳戶存取 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"設定快照的儲存空間時,請將
tokenSource欄位的值設為federatedP4SA。
授予 Pod 快照控制器 Cloud Storage bucket 的存取權
如要允許 Pod 快照控制器刪除 Cloud Storage 值區內的快照,請在專案中授予 GKE 服務代理 Storage Object User (roles/storage.objectUser) 角色。執行下列指令,授予 roles/storage.objectUser 角色:
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_NUMBER:您的專案編號。PROJECT_ID:您的專案 ID。BUCKET_NAME:bucket 名稱。
(選用) 為 Cloud Storage bucket 建立受管理資料夾
建立資料夾可讓您隔離互不信任的 Pod 快照權限,這在多租戶用途中相當實用。如要設定受管理資料夾,請完成下列步驟:
建立自訂 IAM 角色,只包含 Pod 快照的必要權限:
gcloud iam roles create podSnapshotGcsReadWriter \ --project="PROJECT_ID" \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"將
roles/storage.bucketViewer角色授予目標命名空間中的所有 KSA。這個角色可讓 KSA 讀取 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 的命名空間。
針對每個需要儲存 Pod 快照的 KSA,完成下列步驟:
為 KSA 建立代管資料夾:
gcloud storage managed-folders create "gs://BUCKET_NAME/FOLDER_PATH/"更改下列內容:
BUCKET_NAME:bucket 名稱。FOLDER_PATH:代管資料夾的路徑,例如my-app-snapshots。
在受管理資料夾中,將自訂
podSnapshotGcsReadWriter角色授予 KSA: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/KSA_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"更改下列內容:
BUCKET_NAME:bucket 名稱。FOLDER_PATH:代管資料夾的路徑,例如my-app-snapshots。PROJECT_NUMBER:您的專案編號。PROJECT_ID:您的專案 ID。NAMESPACE:Pod 的命名空間。KSA_NAME:KSA 名稱。
設定快照的儲存空間
如要指定快照檔案的儲存位置,請建立 PodSnapshotStorageConfig 資源。
下列範例會將 GKE 設定為將 Pod 快照儲存在 Cloud Storage bucket BUCKET_NAME 內的
FOLDER_PATH/路徑中。將下列資訊清單儲存為example-pod-snapshot-storage-config: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進行多用戶群架構。
套用資訊清單:
kubectl apply -f example-pod-snapshot-storage-config.yaml
後續步驟
- 瞭解如何觸發 Pod 快照。