本文說明如何使用 GKE Pod 快照,儲存 GKE 環境中執行中 Agent Sandbox 的狀態。
GKE 的 Agent Sandbox 提供獨立環境,用於執行不信任的程式碼 (例如大型語言模型生成的程式碼),可提升安全性。直接在叢集中執行這類程式碼會帶來安全風險,因為不受信任的程式碼可能會存取或干擾其他應用程式,或基礎叢集節點本身。
GKE Pod 快照可讓您儲存及還原沙箱環境的狀態。這項功能有以下優點:
- 快速啟動:從預熱快照還原,縮短沙箱啟動時間。
- 長時間執行的代理:暫停需要長時間執行的沙箱,稍後再繼續執行,或移至其他節點,不會遺失進度。
- 有狀態工作負載:儲存及還原沙箱環境的狀態,保留代理的背景資訊,例如對話記錄或中間計算。
- 重現性:擷取特定狀態,並以此為基礎,啟動多個具有相同初始化狀態的新沙箱。
觸發快照的方式有兩種:
- 手動觸發:您建立
PodSnapshotManualTrigger資源來觸發快照。 - 工作負載觸發條件:沙箱應用程式本身會在準備好儲存時發出信號。
本文說明如何手動觸發快照。
事前準備
-
在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
啟用 Google Kubernetes Engine、Cloud Storage、Identity and Access Management (IAM) API (如有尚未啟用的 API)。
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過 Service Usage 管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。-
在 Google Cloud 控制台啟用 Cloud Shell。
需求條件
GKE Pod 快照需要 GKE 1.35.3-gke.1234000 以上版本。Autopilot 和 標準模式皆支援。
Pod 快照需要 gVisor,不適用於 microVM 沙箱。
由於 Pod 快照需要 GKE 沙箱,因此環境會受到特定限制。舉例來說,Pod 快照不支援 E2 機器類型。因此,本教學課程會建立由 N2 機器組成的節點集區。
如需完整的限制清單,包括使用 GPU 機器類型的相關資訊,請參閱「限制和需求」。
定義環境變數
如要簡化在本文件中執行的指令,您可以在 Cloud Shell 中設定環境變數。這些變數會儲存 Google Cloud 專案 ID、用於儲存快照的 Cloud Storage bucket 名稱,以及 GKE 叢集位置等值。
定義這些變數後,您可以在多個指令中重複使用,只要參照變數名稱 (例如 $CLUSTER_NAME) 即可,不必每次都重新輸入或替換值。這種做法可簡化程序,降低出錯風險。
如要在 Cloud Shell 中定義下列實用環境變數,請執行下列指令:
export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export GKE_LOCATION="us-central1"
export ZONE="us-central1-a"
export AGENT_SANDBOX_VERSION="v1.0.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。本文中的指令會使用這個 ID 命名資源及授予 IAM 權限。CLUSTER_NAME:GKE 叢集的名稱 (例如agent-sandbox-cluster)。GKE_LOCATION:Cloud Storage bucket 的 Google Cloud 區域 (例如us-central1)。如果您建立 Autopilot 叢集,叢集也會使用這個區域。ZONE:GKE 叢集的可用區。如果您建立標準叢集,請將此值設為GKE_LOCATION區域中的可用區 (例如us-central1-a)。為降低費用,本文件會建立可用區標準叢集。AGENT_SANDBOX_VERSION:要安裝的開放原始碼 Agent Sandbox 控制器版本。本文使用的是 1.0.6 版。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 權限繫結。
設定步驟總覽
如要在 GKE 環境中啟用 Agent Sandbox 的 Pod 快照,請按照下列步驟設定。如要瞭解這些步驟,建議先瞭解幾個重要概念,然後再瞭解快照程序:
基本概念
- 環境:沙箱應用程式會在 GKE 叢集節點上的 Kubernetes Pod 內執行。
- 身分:Pod 與 Kubernetes 服務帳戶相關聯,並在您建立的特殊命名空間中執行。Kubernetes 服務帳戶和命名空間會共同形成不重複的身分,用於授予 Pod 安全存取 Google Cloud 資源的權限。
- 權限:如要將快照儲存至 Cloud Storage,Pod 的身分必須具備特定 IAM 權限,才能寫入 Cloud Storage bucket。
快照程序
- 觸發條件:手動 (外部) 或由沙箱化工作負載本身啟動快照。本文說明如何建立
PodSnapshotManualTrigger資源,手動啟動觸發條件。 - 擷取:GKE 會擷取 Pod 的執行狀態,例如 Pod 的記憶體狀態和檔案系統。
- 上傳:GKE 會使用授予 Pod Kubernetes 服務帳戶的權限,將擷取的狀態以快照檔案的形式上傳至指定的 Cloud Storage bucket。
如要進一步瞭解 GKE 如何使用 Kubernetes 服務帳戶和 IAM 角色存取 Google Cloud 資源,請參閱「向 GKE 工作負載中的Google Cloud API 進行驗證」。
如要在 GKE 環境中啟用 Agent Sandbox 的 Pod 快照,請執行下列設定。首先,您要建立 GKE 叢集,並啟用 Workload Identity Federation for GKE 和 Pod 快照功能,藉此準備叢集環境。接著,您將設定 Cloud Storage 和 IAM 政策,確保快照安全儲存,且沙箱具備必要權限。最後,您會建立快照資源,指定沙箱的儲存位置和政策。
下表概略說明您需要執行的設定步驟,後續各節會詳細說明每個步驟:
叢集設定
沙箱化應用程式會在 GKE 叢集節點上的 Pod 內執行,因此您必須設定叢集環境。本節說明如何建立 GKE 叢集,並部署 Agent Sandbox 控制器。
建立符合需求的新 GKE 叢集
建立新的 GKE 叢集,並啟用 Pod 快照功能。Pod 快照需要 GKE 1.35.3-gke.1234000 以上版本。下列指令會將叢集註冊至快速發布管道,其預設版本符合這項需求:
Autopilot
建立 Autopilot 叢集,並啟用必要功能:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--release-channel=rapid \
--enable-pod-snapshots \
--location=${GKE_LOCATION}
標準
建立具備所需功能的 Standard 叢集。為降低成本,下列指令會建立可用區叢集,在單一可用區中執行控制層和節點:
gcloud container clusters create ${CLUSTER_NAME} \
--release-channel=rapid \
--enable-pod-snapshots \
--machine-type=${MACHINE_TYPE} \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--workload-metadata=GKE_METADATA \
--num-nodes=1 \
--location=${ZONE}
建立已啟用 GKE 沙箱的節點集區。GKE Sandbox 是以開放原始碼 gVisor 專案為基礎的容器安全防護功能,可在執行中的應用程式與主機作業系統之間提供額外的隔離層:
gcloud container node-pools create ${NODE_POOL_NAME} \
--cluster ${CLUSTER_NAME} \
--num-nodes=1 \
--location=${ZONE} \
--project=${PROJECT_ID} \
--machine-type=${MACHINE_TYPE} \
--sandbox type=gvisor
擷取憑證
擷取叢集的憑證,讓 kubectl CLI 可以連線至叢集:
Autopilot
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${GKE_LOCATION}
標準
gcloud container clusters get-credentials ${CLUSTER_NAME} \
--location=${ZONE}
將 Agent Sandbox 控制器部署至叢集
您可以將正式發布版資訊清單套用至叢集,部署 Agent Sandbox 控制器和必要元件。這份資訊清單是設定檔,會指示 Kubernetes 下載所有必要元件,以便在叢集部署及執行 Agent Sandbox 控制器。
如要將 Agent Sandbox 部署至 GKE 叢集,請執行下列指令:
# Apply the release manifest for the controller and its CustomResourceDefinitions
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/sandbox-with-extensions.yaml
如要進一步瞭解如何安裝 Agent Sandbox,請參閱「在 GKE 上安裝 Agent Sandbox」。
驗證控制器
套用資訊清單後,請確認 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-7d5c9b8f6d-x2k9p 1/1 Running 0 2m
Agent Sandbox 控制器執行後,就能自動為您在叢集中建立的任何 Sandbox 資源,建立及管理沙箱環境。
設定儲存空間和權限
本節說明如何設定 Pod 快照所需的儲存空間和權限。您會建立 Cloud Storage bucket 和代管資料夾,用於儲存快照資料。接著,您會授予沙箱和快照控制器存取該儲存空間所需的權限。
建立 Cloud Storage 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}"
建立代管資料夾
建立代管資料夾,整理 bucket 中的快照。您可以透過代管資料夾,將 IAM 權限套用至特定資料夾,而非整個 bucket。這種資料夾層級的存取權,可限制沙箱只能存取自己的快照,並將這些快照與 bucket 中的其他資料隔離。
如要建立代管資料夾,請執行下列指令:
gcloud storage managed-folders create "gs://${SNAPSHOTS_BUCKET_NAME}/${SNAPSHOT_FOLDER}/"
設定服務帳戶和 IAM 角色
如要允許 GKE 安全地儲存快照,執行沙箱化工作負載的 Pod 所使用的 Kubernetes 服務帳戶,必須具備寫入 bucket 的權限。如要授予這項權限,請將 Google CloudIAM 角色繫結至 Pod 使用的 Kubernetes 服務帳戶。本節說明如何建立自訂 IAM 角色、建立 Kubernetes 服務帳戶,以及設定必要權限。
建立名為
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如果指令失敗,並顯示
FAILED_PRECONDITION錯誤,指出角色 ID 已標示為刪除,表示您最近刪除了具有這個 ID 的角色,例如在先前執行本文件時的清理步驟中。IAM 最多 37 天內不允許重複使用該 ID。請改用其他角色 ID (例如podSnapshotGcsReadWriter2) 再次執行指令,並在本文件其餘部分使用該 ID,而非podSnapshotGcsReadWriter。建立沙箱及其服務帳戶所在的命名空間:
kubectl create namespace "${SNAPSHOT_NAMESPACE}"在剛建立的命名空間中,建立 Kubernetes 服務帳戶。Kubernetes 服務帳戶和命名空間會共同形成一組專屬身分,用於授予沙箱安全存取 Google Cloud資源的權限:
kubectl create serviceaccount "${SNAPSHOT_KSA_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}"將
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"將自訂
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"將
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"
設定快照資源
本節說明如何為 GKE 工作負載上的 Agent Sandbox 設定快照資源。
定義快照儲存空間和規則
如要指定 GKE 儲存快照的位置,以及快照程序的管理規則,請建立下列兩項自訂資源:
PodSnapshotStorageConfig:這項資源會指定 GKE 儲存快照檔案的 Cloud Storage bucket 和資料夾位置。PodSnapshotPolicy:這項資源會根據 Kubernetes 標籤,定義哪些 Pod 符合建立快照的資格。此外,這項設定也會指定觸發規則,例如快照是手動建立,還是由沙箱工作負載啟動。這個範例會依agents.x-k8s.io/sandbox-name-hash標籤將快照分組,Agent Sandbox 控制器會將該標籤新增至每個沙箱的 Pod。這項分組設定代表 GKE 只會從沙箱本身的快照還原沙箱。
如要一次套用這兩項資源,請在 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
snapshotGroupingRules:
groupByLabelValue:
labels:
- agents.x-k8s.io/sandbox-name-hash
EOF
驗證設定
套用快照儲存空間設定和政策後,請確認資源已可使用。本節說明如何查看這些自訂資源的狀態。
查看
PodSnapshotStorageConfig資源的狀態:kubectl get podsnapshotstorageconfigs.podsnapshot.gke.io cpu-pssc-gcs -o yaml輸出內容應包含
type: Ready和status: "True"條件:status: conditions: - lastTransitionTime: "2025-10-31T18:18:02Z" message: Valid PodSnapshotStorageConfig reason: StorageConfigValid status: "True" type: Ready查看
PodSnapshotPolicy資源的狀態:kubectl get podsnapshotpolicies.podsnapshot.gke.io cpu-psp \ --namespace "${SNAPSHOT_NAMESPACE}" -o yaml輸出內容應包含
type: Ready和status: "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
建立沙箱範本
儲存空間政策和權限設定完成後,請建立 SandboxTemplate、SandboxWarmPool 和 SandboxClaim 資源。SandboxWarmPool 資源會讓預先暖機的沙箱保持運作,而 SandboxClaim 資源會從集區中宣告該沙箱。如要順利執行快照程序,沙箱必須使用您先前在本文件中建立的 Kubernetes 服務帳戶執行。沙箱也必須具備您先前在 PodSnapshotPolicy 資源中指定的標籤。
這個範例使用 Python 應用程式,將遞增計數器輸出至記錄。這個計數器可讓您確認狀態是否成功儲存,並在稍後還原。
Autopilot
Pod 快照不支援 E2 機型。在 Autopilot 中,GKE 可能會預設為不支援 Pod 快照的機器類型。為確保工作負載在相容的硬體上執行,請使用自訂 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如要建立
SandboxTemplate和SandboxWarmPool資源,請套用下列資訊清單。請注意,SandboxTemplate資源會參照您剛使用cloud.google.com/compute-class: non-e2-class節點選取器建立的ComputeClass。kubectl apply -f - <<EOF --- apiVersion: extensions.agents.x-k8s.io/v1beta1 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/v1beta1 kind: SandboxWarmPool metadata: name: python-sandbox-warmpool namespace: ${SNAPSHOT_NAMESPACE} spec: replicas: 1 sandboxTemplateRef: name: python-runtime-template EOF
標準
如要建立 SandboxTemplate 和 SandboxWarmPool 資源,請套用下列資訊清單:
kubectl apply -f - <<EOF
---
apiVersion: extensions.agents.x-k8s.io/v1beta1
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/v1beta1
kind: SandboxWarmPool
metadata:
name: python-sandbox-warmpool
namespace: ${SNAPSHOT_NAMESPACE}
spec:
replicas: 1
sandboxTemplateRef:
name: python-runtime-template
EOF
建立資源後,請從暖集區中領取沙箱:
等待暖集區的沙箱準備就緒:
kubectl wait sandboxwarmpool python-sandbox-warmpool \ --namespace "${SNAPSHOT_NAMESPACE}" \ --for=jsonpath='{.status.readyReplicas}'=1 \ --timeout=600s建立
SandboxClaim資源,從暖集區中宣告沙箱:kubectl apply -f - <<EOF apiVersion: extensions.agents.x-k8s.io/v1beta1 kind: SandboxClaim metadata: name: python-sandbox-example namespace: ${SNAPSHOT_NAMESPACE} spec: warmPoolRef: name: python-sandbox-warmpool EOF等待要求準備就緒,然後儲存要求使用的沙箱名稱。沙箱的 Pod 名稱與沙箱相同:
kubectl wait sandboxclaim python-sandbox-example \ --namespace "${SNAPSHOT_NAMESPACE}" \ --for=condition=Ready \ --timeout=300s export SANDBOX_NAME=$(kubectl get sandboxclaim python-sandbox-example \ --namespace "${SNAPSHOT_NAMESPACE}" \ -o jsonpath='{.status.sandbox.name}') echo "${SANDBOX_NAME}"
沙箱現在會以正確的身分執行,並可建立快照。
建立快照
本節說明如何手動觸發執行中沙箱的快照。您會建立指定沙箱 Pod 的觸發條件資源,然後確認快照程序是否成功完成。
查看初始計數器記錄:觸發快照前,請先查看執行中沙箱的記錄,瞭解目前的計數器值。查看記錄檔可建立基準,以便在還原後進行比較。
kubectl logs "${SANDBOX_NAME}" --namespace "${SNAPSHOT_NAMESPACE}" --tail=5輸出內容會顯示計數器的最後幾行,例如:
Count: 15 Count: 16 Count: 17請注意最後輸出的幾個「Count」值。
建立
PodSnapshotManualTrigger資源:啟動快照:kubectl apply -f - <<EOF apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotManualTrigger metadata: name: cpu-snapshot-trigger namespace: ${SNAPSHOT_NAMESPACE} spec: targetPod: ${SANDBOX_NAME} EOF確認手動觸發條件是否成功:
kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io \ --namespace "${SNAPSHOT_NAMESPACE}"輸出內容應會顯示
Complete狀態,表示 GKE 已成功觸發目標 Pod 的快照:NAME TARGET POD STATUS AGE cpu-snapshot-trigger python-sandbox-warmpool-x7k2p Complete XXs查看擷取狀態的詳細資料,方法是描述觸發條件:
kubectl describe podsnapshotmanualtriggers.podsnapshot.gke.io cpu-snapshot-trigger \ --namespace "${SNAPSHOT_NAMESPACE}"輸出內容包含
Snapshot Created區段,其中有儲存在 bucket 中的快照檔案專屬名稱: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>
從快照還原
擷取快照後,您可以暫停沙箱,釋出運算資源,之後再從儲存的狀態恢復沙箱。暫停沙箱時,Agent Sandbox 控制器會刪除沙箱的 Pod,但保留 Sandbox 資源。恢復沙箱時,控制器會重新建立 Pod,而 Pod 快照控制器會自動從該沙箱的最新快照還原 Pod。
等待快照準備就緒。GKE 只會從已就緒的快照還原 Pod。如果在快照準備就緒前暫停沙箱,沙箱會在恢復時啟動,但不會儲存狀態。
export SNAPSHOT_NAME=$(kubectl get podsnapshotmanualtriggers.podsnapshot.gke.io cpu-snapshot-trigger \ --namespace "${SNAPSHOT_NAMESPACE}" \ -o jsonpath='{.status.snapshotCreated.name}') kubectl wait podsnapshots.podsnapshot.gke.io "${SNAPSHOT_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}" \ --for=condition=Ready \ --timeout=600s如要暫停沙箱,請將其
operatingMode欄位設為Suspended,然後等待控制器刪除沙箱的 Pod:kubectl patch sandbox "${SANDBOX_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}" \ --type=merge \ -p '{"spec":{"operatingMode":"Suspended"}}' kubectl wait pod "${SANDBOX_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}" \ --for=delete \ --timeout=120s如要繼續使用沙箱,請將其
operatingMode欄位設為Running,然後等待沙箱準備就緒:kubectl patch sandbox "${SANDBOX_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}" \ --type=merge \ -p '{"spec":{"operatingMode":"Running"}}' kubectl wait sandbox "${SANDBOX_NAME}" \ --namespace "${SNAPSHOT_NAMESPACE}" \ --for=condition=Ready \ --timeout=300s查看記錄,確認還原作業已執行。請注意,計數器會從建立快照的時間點繼續:
kubectl logs "${SANDBOX_NAME}" --namespace "${SNAPSHOT_NAMESPACE}"輸出內容應顯示計數器恢復,例如:
Count: 18 Count: 19 Count: 20 Count: 21如果計數器改從
0開始,表示 Pod 啟動時未從快照還原。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本文件所用資源的費用,請按照下列步驟刪除您建立的資源:
刪除沙箱宣告和暖集區,停止所有執行中的 Pod,讓 Agent Sandbox 控制器正常終止容器。
kubectl delete sandboxclaims --all --namespace "${SNAPSHOT_NAMESPACE}" kubectl delete sandboxwarmpools --all --namespace "${SNAPSHOT_NAMESPACE}"刪除用於建立沙箱和啟動快照的沙箱範本和手動觸發條件。
# Delete the blueprints kubectl delete sandboxtemplates --all --namespace "${SNAPSHOT_NAMESPACE}" # Delete the snapshot initiation objects kubectl delete podsnapshotmanualtriggers --all --namespace "${SNAPSHOT_NAMESPACE}"刪除快照政策,這些政策定義了命名空間中哪些 Pod 符合快照資格。
kubectl delete podsnapshotpolicy cpu-psp --namespace "${SNAPSHOT_NAMESPACE}"刪除快照儲存空間設定,也就是快照儲存空間後端的全域定義。由於這項資源屬於叢集範圍,請勿使用命名空間旗標。
kubectl delete podsnapshotstorageconfig cpu-pssc-gcs如果您為 Autopilot 建立了 ComputeClass,請將其刪除。
kubectl delete computeclass non-e2-class刪除 Kubernetes 命名空間,自動移除 Kubernetes 服務帳戶和任何剩餘的命名空間中繼資料。
kubectl delete namespace "${SNAPSHOT_NAMESPACE}"刪除 GKE 叢集,移除基礎架構和與教學課程相關聯的所有節點。
Autopilot
gcloud container clusters delete "${CLUSTER_NAME}" \ --location="${GKE_LOCATION}" --quiet標準
gcloud container clusters delete "${CLUSTER_NAME}" \ --location="${ZONE}" --quiet如要完全重設儲存空間,請使用遞迴移除指令刪除 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.}"如要將專案恢復至完全乾淨的狀態,請刪除自訂 IAM 角色 (選用)。即使刪除叢集,IAM 角色仍會保留,因此必須另外刪除。
gcloud iam roles delete podSnapshotGcsReadWriter --project="${PROJECT_ID}"
後續步驟
- 進一步瞭解 GKE Pod 快照。
- 如要進一步瞭解 Agent Sandbox 開放原始碼專案,請前往 GitHub。
- 瞭解如何在 GKE 上使用 Agent Sandbox 隔離 AI 執行程式碼作業。