使用 Pod 快照儲存及還原 Agent Sandbox 環境

本文說明如何使用 GKE Pod 快照儲存執行中的 Agent Sandbox 環境狀態。

代理沙箱提供隔離環境,可執行不受信任的程式碼 (例如大型語言模型 (LLM) 生成的程式碼),進而提升安全性。直接在叢集中執行這類程式碼會造成安全風險,因為不受信任的程式碼可能會存取或干擾其他應用程式,或底層叢集節點本身。

您可以透過 GKE Pod 快照儲存及還原沙箱環境的狀態。這項功能相當實用,原因如下:

  • 快速啟動:從預先暖機的快照還原,縮短沙箱啟動時間。
  • 長時間執行的代理程式:暫停長時間執行的沙箱,稍後再繼續執行,或將沙箱移至其他節點,進度不會遺失。
  • 有狀態的工作負載:儲存及還原沙箱環境的狀態,藉此保留代理程式的脈絡,例如對話記錄或中間計算。
  • 可重現性:擷取特定狀態,並做為基礎,以相同的初始狀態啟動多個新沙箱。

你可以透過兩種方式觸發快照:

  • 手動觸發:您建立 PodSnapshotManualTrigger 資源來觸發快照。
  • 工作負載觸發條件:沙箱應用程式本身會發出信號,表示已準備好儲存。

本文說明如何手動觸發快照。

事前準備

  1. 在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色

    前往專案選取器

  2. 確認專案已啟用計費功能 Google Cloud

  3. 啟用 Google Kubernetes Engine、Cloud Storage 和 Identity and Access Management (IAM) API。

    啟用 API 時所需的角色

    如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

  4. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

需求條件

GKE Pod 快照需要 GKE 1.35.3-gke.1234000 以上版本。支援 Autopilot 和 Standard 模式。

由於 Pod 快照需要 GKE Sandbox,因此您的環境會受到某些限制。舉例來說,Pod 快照不支援 E2 機器類型。因此,本教學課程會建立由 N2 機器組成的節點集區。

如需相關限制的完整清單,包括使用 GPU 型機器類型的相關資訊,請參閱限制和規定

定義環境變數

如要簡化本文中執行的指令,可以在 Cloud Shell 中設定環境變數。這些變數會儲存專案 ID、用於儲存快照的 Cloud Storage bucket 名稱,以及 GKE 叢集位置等值。 Google Cloud

定義這些變數後,您就可以重複使用這些變數,方法是參照變數名稱 (例如 $CLUSTER_NAME),而不必每次都重新輸入或替換值。這種做法可簡化程序,並降低出錯風險。

如要在 Cloud Shell 中定義下列實用的環境變數,請執行下列指令:

export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export GKE_LOCATION="us-central1"
export CLUSTER_VERSION="1.35.3-gke.1234000"
export AGENT_SANDBOX_VERSION="v0.4.6"
export NODE_POOL_NAME="agent-sandbox-node-pool"
export MACHINE_TYPE="n2-standard-2"
export SNAPSHOTS_BUCKET_NAME="agent-sandbox-snapshots-${PROJECT_ID}"
export SNAPSHOT_NAMESPACE="pod-snapshots-ns"
export SNAPSHOT_KSA_NAME="pod-snapshot-sa"
export SNAPSHOT_FOLDER="my-snapshots"
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

這些環境變數的說明如下:

  • PROJECT_ID:目前 Google Cloud 專案的 ID。定義這個變數可確保所有資源 (例如 GKE 叢集) 都是在正確的專案中建立。
  • CLUSTER_NAME:GKE 叢集的名稱 (例如 agent-sandbox-cluster)。
  • GKE_LOCATION:要建立 GKE 叢集的 Google Cloud 區域 (例如 us-central1)。
  • CLUSTER_VERSION:GKE 叢集版本,必須為 1.35.3-gke.1234000 以上版本。
  • AGENT_SANDBOX_VERSION:要部署至叢集的 Agent Sandbox 控制器版本。
  • NODE_POOL_NAME:將執行沙箱化工作負載的節點集區名稱 (例如 agent-sandbox-node-pool)。
  • MACHINE_TYPE:節點集區中節點的機型 (例如 n2-standard-2)。Pod 快照不支援 E2 機型。如要為節點集區中的節點使用以 GPU 為基礎的機器類型,請參閱限制和需求。如要瞭解不同機器系列,以及如何選擇不同選項,請參閱「機器家族資源與比較指南」。
  • SNAPSHOTS_BUCKET_NAME:您將建立的 Cloud Storage bucket 名稱,用於儲存快照。
  • SNAPSHOT_NAMESPACE:快照工作負載和服務帳戶所在的 Kubernetes 命名空間。
  • SNAPSHOT_KSA_NAME:工作負載用於驗證的 Kubernetes 服務帳戶名稱。
  • SNAPSHOT_FOLDER:Cloud Storage bucket 內的目錄,用於整理快照。
  • PROJECT_NUMBER:專案的專屬數字 ID,用於 IAM 權限繫結。

設定步驟總覽

如要啟用 Agent Sandbox 環境的 Pod 快照,請執行一些設定步驟。如要瞭解這些步驟,建議您先瞭解幾個重要概念,然後再瞭解快照程序:

基本概念

  • 環境:沙箱化應用程式會在 GKE 叢集節點的 Kubernetes Pod 內執行。
  • 身分:Pod 會與 Kubernetes 服務帳戶建立關聯,並在您建立的特殊命名空間中執行。Kubernetes 服務帳戶和命名空間會共同形成專屬身分,用於授予 Pod 資源的安全存取權。 Google Cloud
  • 權限:如要允許將快照儲存至 Cloud Storage,必須授予 Pod 身分特定 IAM 權限,允許其寫入 Cloud Storage 值區

快照程序

  1. 觸發:啟動快照,可手動 (從外部) 或由沙箱化工作負載本身啟動。本文示範如何手動觸發,也就是建立 PodSnapshotManualTrigger 資源來啟動。
  2. 擷取:GKE 會擷取 Pod 的執行狀態,例如 Pod 的記憶體和檔案系統狀態。
  3. 上傳:GKE 會使用授予 Pod Kubernetes 服務帳戶的權限,將擷取的狀態以快照檔案的形式上傳至指定的 Cloud Storage 值區。

如要進一步瞭解 GKE 如何使用 Kubernetes 服務帳戶和 IAM 角色存取 Google Cloud 資源,請參閱「從 GKE 工作負載向 API 進行驗證 Google Cloud 」。

如要啟用 Agent Sandbox 環境的 Pod 快照,請進行下列設定。首先,請建立 GKE 叢集,並啟用 Workload Identity Federation for GKE 和 Pod 快照功能,準備叢集環境。接著,您將設定 Cloud Storage 和 IAM 政策,確保快照安全儲存,且沙箱具備必要權限。最後,您會建立快照資源,指定沙箱的儲存位置和政策。

下表彙整了您需要執行的設定步驟,後續章節將說明每個步驟:

主題 工作
叢集設定 1. 建立 GKE 叢集,並啟用 Pod 快照和 Workload Identity Federation for GKE 功能。
2. 部署 Agent Sandbox。
設定儲存空間和權限 1. 建立 Cloud Storage bucket 和受管理資料夾。
2. 建立自訂 IAM 角色。
3. 建立 Kubernetes 命名空間和 Kubernetes 服務帳戶 (KSA)。
4. 將 IAM 角色繫結至 Kubernetes 服務帳戶。
5. 授予快照控制器權限
設定快照資源 1. 建立 PodSnapshotStorageConfig
2. 建立 PodSnapshotPolicy
3. 建立 SandboxTemplate

叢集設定

沙箱化應用程式會在 GKE 叢集節點的 Pod 內執行,因此您需要設定叢集環境。本節說明如何建立 GKE 叢集,以及部署 Agent Sandbox 控制器。

建立符合需求的新 GKE 叢集

建立啟用 Pod 快照的新 GKE 叢集。如要確保完整的功能相容性,請指定叢集版本 1.35.3-gke.1234000 以上:

Autopilot

建立具備必要功能的 Autopilot 叢集:

gcloud container clusters create-auto ${CLUSTER_NAME} \
   --cluster-version=${CLUSTER_VERSION} \
   --enable-pod-snapshots \
   --location=${GKE_LOCATION}

標準

建立具備必要功能的標準叢集:

gcloud container clusters create ${CLUSTER_NAME} \
   --cluster-version=${CLUSTER_VERSION} \
   --enable-pod-snapshots \
   --machine-type=${MACHINE_TYPE} \
   --workload-pool=${PROJECT_ID}.svc.id.goog \
   --workload-metadata=GKE_METADATA \
   --num-nodes=1 \
   --location=${GKE_LOCATION}

建立啟用 GKE Sandbox 的節點集區。GKE Sandbox 是以開放原始碼 gVisor 專案為基礎的容器安全功能,可在執行中的應用程式與主機作業系統之間提供額外的隔離層:

gcloud container node-pools create ${NODE_POOL_NAME} \
   --cluster ${CLUSTER_NAME} \
   --num-nodes=1 \
   --location=${GKE_LOCATION} \
   --project=${PROJECT_ID} \
   --machine-type=${MACHINE_TYPE} \
   --sandbox type=gvisor

擷取憑證

擷取叢集憑證,以便 kubectl CLI 連線至叢集:

gcloud container clusters get-credentials ${CLUSTER_NAME} \
    --location=${GKE_LOCATION}

將 Agent Sandbox Controller 部署至叢集

您可以將正式發布的資訊清單套用至叢集,部署 Agent Sandbox 控制器及其必要元件。這些資訊清單是設定檔,可指示 Kubernetes 下載在叢集上部署及執行 Agent Sandbox 控制器所需的所有必要元件。

如要將 Agent Sandbox 部署至 GKE 叢集,請執行下列指令:

# Apply the main manifest for the controller and its Custom Resource Definitions (CRDs)
kubectl apply \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/manifest.yaml \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/extensions.yaml

驗證控制器

套用資訊清單後,請檢查 Agent Sandbox 控制器 Pod 是否在 agent-sandbox-system 命名空間中正確執行。您在上一個步驟中套用資訊清單時,系統會自動建立 agent-sandbox-system 命名空間。

kubectl get pods -n agent-sandbox-system

等待 Pod 在「STATUS」(狀態) 欄中顯示「Running」(執行中),並在「READY」(就緒) 欄中顯示「1/1」。如果 Pod 正常運作,輸出內容會類似以下內容:

NAME                         READY   STATUS    RESTARTS   AGE
agent-sandbox-controller-0      1/1     Running   0          44d

現在 Agent Sandbox 控制器正在執行,因此可以自動為您在叢集中建立的任何 Sandbox 資源,建立及管理沙箱環境。

設定儲存空間和權限

本節說明如何設定 Pod 快照所需的儲存空間和權限。您會建立 Cloud Storage bucket 和受管理資料夾,以儲存快照資料。接著,您會授予沙箱和快照控制器存取該儲存空間所需的權限。

建立 Cloud Storage bucket

建立 bucket 來儲存快照。為確保快照程序快速且經濟實惠,建議您使用下列設定建立 bucket:

  • 啟用階層式命名空間:階層式命名空間功能會將 bucket 整理成檔案系統階層,而非平面命名空間。這項設定可提高讀寫輸送量,因此能加快儲存及還原快照的速度。
  • 停用虛刪除功能:虛刪除功能會保留已刪除的檔案一段時間,藉此保護資料。不過,在上傳期間,快照程序會建立及刪除許多暫存檔案。建議您停用虛刪除功能,避免因儲存這些暫時性檔案而產生不必要的費用。

如要使用這些設定建立 bucket,請執行下列指令:

gcloud storage buckets create "gs://${SNAPSHOTS_BUCKET_NAME}" \
    --uniform-bucket-level-access \
    --enable-hierarchical-namespace \
    --soft-delete-duration=0d \
    --location="${GKE_LOCATION}"

建立代管資料夾

建立受管理資料夾,在值區中整理快照。透過受管理資料夾,您可以對特定資料夾套用 IAM 權限,而不必套用至整個 bucket。這項資料夾層級的存取權會限制沙箱只能存取自己的快照,並將這些快照與值區中的其他資料隔離。

如要建立受管理資料夾,請執行下列指令:

gcloud storage managed-folders create "gs://${SNAPSHOTS_BUCKET_NAME}/${SNAPSHOT_FOLDER}/"

設定服務帳戶和 IAM 角色

如要允許 GKE 安全地儲存快照,執行沙箱工作負載的 Pod 所用 Kubernetes 服務帳戶,必須具備寫入 bucket 的權限。如要授予這項權限,請將 IAM 角色繫結至 Pod 使用的 Kubernetes 服務帳戶。 Google Cloud本節說明如何建立自訂 IAM 角色、建立 Kubernetes 服務帳戶,以及設定必要權限。

  1. 建立名為 podSnapshotGcsReadWriter 的自訂 IAM 角色,並授予寫入快照資料所需的權限:

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

    角色建立成功後,輸出內容如下所示:

    Created role [podSnapshotGcsReadWriter].
    etag: BwZJUfjNbew=
    includedPermissions:
    - storage.folders.create
    - storage.objects.create
    - storage.objects.delete
    - storage.objects.get
    name: projects/${PROJECT_ID}/roles/podSnapshotGcsReadWriter
    stage: ALPHA
    title: podSnapshotGcsReadWriter
    
  2. 建立沙箱及其服務帳戶所在的命名空間:

    kubectl create namespace "${SNAPSHOT_NAMESPACE}"
    
  3. 在您剛建立的命名空間中建立 Kubernetes 服務帳戶。Kubernetes 服務帳戶和命名空間會共同形成專屬身分,用於授予沙箱對 Google Cloud 資源的安全存取權:

    kubectl create serviceaccount "${SNAPSHOT_KSA_NAME}" \
        --namespace "${SNAPSHOT_NAMESPACE}"
    
  4. roles/storage.bucketViewer 角色授予命名空間中的所有服務帳戶。這個角色可讓帳戶檢視值區的中繼資料,但無法讀取或寫入資料本身:

    gcloud storage buckets add-iam-policy-binding "gs://${SNAPSHOTS_BUCKET_NAME}" \
        --member="principalSet://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/namespace/${SNAPSHOT_NAMESPACE}" \
        --role="roles/storage.bucketViewer"
    
  5. 將自訂 podSnapshotGcsReadWriter 角色授予沙箱的 Kubernetes 服務帳戶。這個繫結只允許這個特定帳戶將資料寫入受管理資料夾:

    gcloud storage buckets add-iam-policy-binding "gs://${SNAPSHOTS_BUCKET_NAME}" \
        --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${SNAPSHOT_NAMESPACE}/sa/${SNAPSHOT_KSA_NAME}" \
        --role="projects/${PROJECT_ID}/roles/podSnapshotGcsReadWriter"
    
  6. roles/storage.objectUser 角色授予 Kubernetes 服務帳戶。Pod 快照代理程式必須具備這個角色,才能對代管資料夾執行作業:

    gcloud storage buckets add-iam-policy-binding "gs://${SNAPSHOTS_BUCKET_NAME}" \
        --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${SNAPSHOT_NAMESPACE}/sa/${SNAPSHOT_KSA_NAME}" \
        --role="roles/storage.objectUser"
    

授予快照控制器權限

objectUser 角色授予 GKE 系統的快照控制器。這項權限可讓控制器管理快照生命週期,例如在您刪除 PodSnapshot 資源時刪除快照物件:

gcloud storage buckets add-iam-policy-binding "gs://${SNAPSHOTS_BUCKET_NAME}" \
    --member="serviceAccount:service-${PROJECT_NUMBER}@container-engine-robot.iam.gserviceaccount.com" \
    --role="roles/storage.objectUser"

設定快照資源

本節說明如何為 Agent Sandbox 工作負載設定快照資源。

定義快照儲存空間和規則

如要指定 GKE 儲存快照的位置,以及管理快照程序的規則,請建立兩項自訂資源:

  • PodSnapshotStorageConfig:這個資源會指定 Cloud Storage bucket 和資料夾位置,GKE 會將快照檔案儲存於此。
  • PodSnapshotPolicy:這個資源會根據 Pod 的 Kubernetes 標籤,定義哪些 Pod 符合快照資格。此外,這項設定也會指定觸發規則,例如快照是手動建立,還是由沙箱工作負載啟動。

如要一次套用這兩項資源,請在 Cloud Shell 中執行下列指令。這個方法有助於確保環境變數正確注入:

kubectl apply -f - <<EOF
apiVersion: podsnapshot.gke.io/v1
kind: PodSnapshotStorageConfig
metadata:
  name: cpu-pssc-gcs
spec:
  snapshotStorageConfig:
    gcs:
      bucket: "${SNAPSHOTS_BUCKET_NAME}"
      path: "${SNAPSHOT_FOLDER}"
EOF

sleep 5

kubectl apply -f - <<EOF
apiVersion: podsnapshot.gke.io/v1
kind: PodSnapshotPolicy
metadata:
  name: cpu-psp
  namespace: ${SNAPSHOT_NAMESPACE}
spec:
  storageConfigName: cpu-pssc-gcs
  selector:
    matchLabels:
      app: agent-sandbox-workload
  triggerConfig:
    type: manual
    postCheckpoint: resume
EOF

驗證設定

套用快照儲存空間設定和政策後,請確認資源是否可供使用。本節說明如何檢查這些自訂資源的狀態。

  1. 檢查 PodSnapshotStorageConfig 資源的狀態:

    kubectl get podsnapshotstorageconfigs.podsnapshot.gke.io cpu-pssc-gcs \
      --namespace "${SNAPSHOT_NAMESPACE}" -o yaml
    

    輸出內容應包含具有 type: Readystatus: "True" 的條件:

    status:
      conditions:
      - lastTransitionTime: "2025-10-31T18:18:02Z"
        message: Valid PodSnapshotStorageConfig
        reason: StorageConfigValid
        status: "True"
        type: Ready
    
  2. 檢查 PodSnapshotPolicy 資源的狀態:

    kubectl get podsnapshotpolicies.podsnapshot.gke.io cpu-psp \
      --namespace "${SNAPSHOT_NAMESPACE}" -o yaml
    

    輸出內容應包含 type: Readystatus: "True" 的條件。也應指出找到參照 PodSnapshotStorageConfig 的位置:

    status:
      conditions:
      - lastTransitionTime: "2025-10-31T18:19:47Z"
        message: The referenced PodSnapshotStorageConfig "cpu-pssc-gcs" was found
        reason: StorageConfigValid
        status: "True"
        type: Ready
    

建立沙箱範本

儲存空間政策和權限設定完成後,請建立 SandboxTemplateSandboxClaim 資源。如要順利執行快照程序,沙箱必須使用您在本文件稍早建立的 Kubernetes 服務帳戶。沙箱也必須包含您先前在 PodSnapshotPolicy 中指定的標籤。

本範例使用 Python 應用程式,將遞增計數器列印至記錄檔。這個計數器可讓您確認狀態是否已成功儲存,並在稍後還原。

Autopilot

Pod 快照不支援 E2 機器類型。在 Autopilot 中,GKE 可能會預設使用 E2 節點。為確保工作負載在相容的硬體上執行,您應使用自訂 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. 如要建立 SandboxTemplateSandboxClaim 資源,請套用下列資訊清單。請注意,SandboxTemplate 是指您剛才使用 cloud.google.com/compute-class: non-e2-class 節點選取器建立的 ComputeClass

    kubectl apply -f - <<EOF
    ---
    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxTemplate
    metadata:
      name: python-runtime-template
      namespace: ${SNAPSHOT_NAMESPACE}
    spec:
      podTemplate:
        metadata:
          labels:
            app: agent-sandbox-workload
        spec:
          serviceAccountName: ${SNAPSHOT_KSA_NAME}
          runtimeClassName: gvisor
          nodeSelector:
            cloud.google.com/compute-class: non-e2-class
          containers:
          - name: my-container
            image: python:3.10-slim
            command: ["python3", "-c"]
            args:
              - |
                import time
                i = 0
                while True:
                  print(f"Count: {i}", flush=True)
                  i += 1
                  time.sleep(1)
    ---
    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxClaim
    metadata:
      name: python-sandbox-example
      namespace: ${SNAPSHOT_NAMESPACE}
      labels:
        app: agent-sandbox-workload
    spec:
      sandboxTemplateRef:
        name: python-runtime-template
    EOF
    

標準

如要建立 SandboxTemplateSandboxClaim 資源,請套用下列資訊清單:

kubectl apply -f - <<EOF
---
apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxTemplate
metadata:
  name: python-runtime-template
  namespace: ${SNAPSHOT_NAMESPACE}
spec:
  podTemplate:
    metadata:
      labels:
        app: agent-sandbox-workload
    spec:
      serviceAccountName: ${SNAPSHOT_KSA_NAME}
      runtimeClassName: gvisor
      containers:
      - name: my-container
        image: python:3.10-slim
        command: ["python3", "-c"]
        args:
          - |
            import time
            i = 0
            while True:
              print(f"Count: {i}", flush=True)
              i += 1
              time.sleep(1)
---
apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxClaim
metadata:
  name: python-sandbox-example
  namespace: ${SNAPSHOT_NAMESPACE}
  labels:
    app: agent-sandbox-workload
spec:
  sandboxTemplateRef:
    name: python-runtime-template
EOF

沙箱現在會使用正確的身分執行,可隨時建立快照。

建立快照

本節說明如何手動觸發執行中沙箱的快照。建立以沙箱 Pod 為目標的觸發程序資源,然後確認快照程序是否順利完成。

  1. 檢查初始計數器記錄:觸發快照前,請查看執行中沙箱的記錄,瞭解目前的計數器值。查看記錄可建立基準,以便在還原後進行比較。

    kubectl logs python-sandbox-example --namespace "${SNAPSHOT_NAMESPACE}" --tail=5
    

    輸出內容會顯示計數器的最後幾行,例如:

    Count: 15
    Count: 16
    Count: 17
    

    請注意最後幾個顯示的「Count」值。

  2. 建立 PodSnapshotManualTrigger 資源:啟動快照:

    kubectl apply -f - <<EOF
    apiVersion: podsnapshot.gke.io/v1
    kind: PodSnapshotManualTrigger
    metadata:
      name: cpu-snapshot-trigger
      namespace: ${SNAPSHOT_NAMESPACE}
    spec:
      targetPod: python-sandbox-example
    EOF
    
  3. 確認手動觸發作業是否成功:

    kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io \
      --namespace "${SNAPSHOT_NAMESPACE}"
    

    輸出內容應會顯示 Complete 狀態,表示 GKE 已順利觸發目標 Pod 的快照:

    NAME                   TARGET POD               STATUS     AGE
    cpu-snapshot-trigger   python-sandbox-example   Complete   XXs
    
  4. 如要查看擷取狀態的詳細資料,請說明觸發條件:

    kubectl describe podsnapshotmanualtriggers.podsnapshot.gke.io cpu-snapshot-trigger \
      --namespace "${SNAPSHOT_NAMESPACE}"
    

    輸出內容會包含 Snapshot Created 專區,其中列出儲存在值區中的快照檔案專屬名稱:

    Status:
      Conditions:
        Last Transition Time:  2026-01-30T19:11:04Z
        Message:               checkpoint completed successfully
        Reason:                Complete
        Status:                True
        Type:                  Triggered
      Observed Generation:     1
      Snapshot Created:
        Name:  <UNIQUE_SNAPSHOT_NAME>
    

從快照還原

擷取快照後,您可以還原沙箱環境,從儲存的狀態繼續執行。如要還原沙箱,請建立參照原始 SandboxTemplate 的新 SandboxClaim。Pod 快照控制器會自動識別並還原最新的相符快照。

  1. 建立新的 SandboxClaim,以還原沙箱:

    kubectl apply -f - <<EOF
    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxClaim
    metadata:
      name: python-sandbox-from-snapshot
      namespace: ${SNAPSHOT_NAMESPACE}
      labels:
        app: agent-sandbox-workload
    spec:
      sandboxTemplateRef:
        name: python-runtime-template
    EOF
    
  2. 查看記錄,確認是否已還原。請注意,計數器會從拍攝快照的時間點繼續計數:

    kubectl logs python-sandbox-from-snapshot --namespace "${SNAPSHOT_NAMESPACE}"
    

    輸出內容應顯示計數器已恢復,例如:

    Count: 18
    Count: 19
    Count: 20
    Count: 21
    

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本文件所用資源的費用,請按照下列步驟刪除您建立的資源:

  1. 刪除沙箱聲明,停止所有正在執行的 Pod,並允許 Agent Sandbox 控制器安全終止容器。

    kubectl delete sandboxclaims --all --namespace "${SNAPSHOT_NAMESPACE}"
    
  2. 刪除用於建立沙箱和啟動快照的沙箱範本和手動觸發條件。

    # Delete the blueprints
    kubectl delete sandboxtemplates --all --namespace "${SNAPSHOT_NAMESPACE}"
    
    # Delete the snapshot initiation objects
    kubectl delete podsnapshotmanualtriggers --all --namespace "${SNAPSHOT_NAMESPACE}"
    
  3. 刪除定義命名空間中哪些 Pod 符合快照資格的快照政策。

    kubectl delete podsnapshotpolicy cpu-psp --namespace "${SNAPSHOT_NAMESPACE}"
    
  4. 刪除快照儲存設定,這是快照儲存後端的全域定義。由於這個資源屬於叢集範圍,請勿使用命名空間標記。

    kubectl delete podsnapshotstorageconfig cpu-pssc-gcs
    
  5. 如果您為 Autopilot 建立 ComputeClass,請刪除該項目。

    kubectl delete computeclass non-e2-class
    
  6. 刪除 Kubernetes 命名空間,系統就會自動移除 Kubernetes 服務帳戶和所有剩餘的命名空間中繼資料。

    kubectl delete namespace "${SNAPSHOT_NAMESPACE}"
    
  7. 刪除 GKE 叢集,移除基礎架構和與本教學課程相關聯的所有節點。

    gcloud container clusters delete "${CLUSTER_NAME}" --location="${GKE_LOCATION}" --quiet
    
  8. 如要完全重設儲存空間,請使用遞迴移除指令刪除 Cloud Storage bucket (選用)。請注意,如果您打算在日後的測試中重複使用設定正確的 bucket,可以略過這個步驟。

    gcloud storage rm --recursive "gs://${SNAPSHOTS_BUCKET_NAME:?Error: SNAPSHOTS_BUCKET_NAME is not set. Please re-define the environment variables you defined earlier.}"
    
  9. 如要將專案還原為完全乾淨的狀態,請刪除自訂 IAM 角色 (選用)。由於 IAM 角色會在叢集刪除後繼續存在,因此您必須分別刪除這些角色。

    gcloud iam roles delete podSnapshotGcsReadWriter --project="${PROJECT_ID}"
    

後續步驟