本教學課程說明如何從 Google Kubernetes Engine (GKE) 叢集內部,部署及測試 Agent Sandbox 快照功能。您將瞭解如何在叢集內執行用戶端應用程式,以程式輔助方式建立、暫停及繼續執行沙箱環境。
如要進一步瞭解如何拍攝 Pod 快照,請參閱「從 Pod 快照還原」。
費用
在 GKE 中,Agent Sandbox 免費提供,不另外收費。您建立的資源適用 GKE 定價。
事前準備
-
在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
啟用 Artifact Registry 和 Kubernetes Engine API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。-
在 Google Cloud 控制台中啟用 Cloud Shell。
- 確認您具備完成本教學課程所需的權限。
必要的角色
如要取得建立及管理沙箱所需的權限,請要求管理員授予您專案的 Kubernetes Engine 管理員 (roles/container.admin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
限制
在區域叢集中,不同區域的節點可能具有不同的 CPU 微架構。由於快照會擷取 CPU 狀態,因此在缺少 CPU 功能的節點上還原快照會失敗 (例如,出現 OCI runtime restore failed: incompatible FeatureSet 錯誤)。
為避免這個問題,請為您的環境使用適當的設定:
- 正式環境:為確保叢集的高可用性,請勿將工作負載固定在特定可用區。請改為指定最低 CPU 平台,確保所有區域的 CPU 功能一致。詳情請參閱「選擇最低 CPU 平台」。
- 測試:為簡化設定及避免發生初始 CPU 不符錯誤,您可以在
SandboxTemplate資訊清單中使用nodeSelector欄位,將 Pod 固定至特定區域,例如us-central1-a。本教學課程中的範例會使用這項測試設定。
定義環境變數
為簡化本教學課程中執行的指令,您可以在 Cloud Shell 中設定環境變數。在 Cloud Shell 中執行下列指令,定義下列實用的環境變數:
export PROJECT_ID=$(gcloud config get project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CLUSTER_NAME="test-snapshot"
export LOCATION="us-central1"
export BUCKET_LOCATION="us"
export MACHINE_TYPE="n2-standard-2"
export REPOSITORY_NAME="agent-sandbox"
export BUCKET_NAME="${PROJECT_ID}_snapshots"
export CLOUDBUILD_BUCKET_NAME="${PROJECT_ID}_cloudbuild"
這些環境變數的說明如下:
PROJECT_ID:目前 Google Cloud 專案的 ID。定義這個變數有助於確保所有資源都在正確的專案中建立。PROJECT_NUMBER:目前 Google Cloud 專案的專案編號。CLUSTER_NAME:GKE 叢集的名稱,例如test-snapshot。LOCATION:GKE 叢集和 Artifact Registry 存放區所在的 Google Cloud 區域,例如us-central1。BUCKET_LOCATION:Cloud Storage bucket 的位置,例如us。BUCKET_NAME:用於快照的 Cloud Storage bucket 名稱。CLOUDBUILD_BUCKET_NAME:用於 Cloud Build 記錄的 Cloud Storage bucket 名稱。MACHINE_TYPE:叢集節點使用的機型,例如e2-standard-8。REPOSITORY_NAME:Artifact Registry 存放區的名稱,例如agent-sandbox。
設定步驟總覽
如要從叢集內啟用及測試 Agent Sandbox 環境的 Pod 快照,必須完成幾個設定步驟。如要瞭解這些步驟,請先瞭解整體工作流程中涉及的元件。
重要元件
本教學課程使用下列兩個 Python 應用程式測試快照程序:
- 用戶端應用程式:在叢集標準 Pod 中執行的 Python 指令碼。這個應用程式會管理沙箱生命週期:以程式輔助方式建立沙箱、暫停沙箱以觸發快照、繼續執行沙箱,並確認狀態已保留。在本教學課程中,您將建立名為
agent-sandbox-client-sa的 Kubernetes 服務帳戶,並授予 RBAC 權限,讓用戶端應用程式 Pod 可以使用 Kubernetes API 管理沙箱自訂資源和快照觸發物件。 - 採用沙箱機制的應用程式:Python 指令碼,每秒會遞增並列印計數器。這個應用程式會在獨立的沙箱環境中安全執行,產生可供用戶端應用程式驗證的變更狀態。在本教學課程中,您將建立名為
snapshot-sa的專屬 Kubernetes 服務帳戶,並設定 Workload Identity,授權沙箱化 Pod 安全地讀取及寫入 Cloud Storage 中的快照物件。
設定與測試程序
以下列出設定環境及執行測試的步驟摘要:
- 建立叢集:建立已啟用 Pod 快照和 Agent Sandbox 功能的 Autopilot 或標準叢集。
- 建立 Artifact Registry 存放區: 建立 Docker 存放區,用於儲存用戶端應用程式的容器映像檔。
- 安裝 Agent Sandbox:在叢集上安裝核心 agent-sandbox 元件和擴充功能。
- 設定儲存空間和權限:建立 Cloud Storage bucket,並設定 Workload Identity 權限,確保快照安全無虞。
- 設定 Pod 快照:建立並套用快照儲存空間設定、快照政策和沙箱範本。
- 建構用戶端應用程式:建構用戶端應用程式的容器映像檔,並推送至 Artifact Registry 存放區。
- 執行測試:部署用戶端應用程式 Pod,這會建立沙箱、暫停沙箱以擷取快照、繼續執行沙箱,並驗證計數器的狀態是否已成功還原。
建立叢集
建立啟用 Pod 快照的新 GKE 叢集。如要確保完整功能相容性,請指定快速發布管道。
Autopilot
建立具備必要功能的 Autopilot 叢集:
gcloud beta container clusters create-auto ${CLUSTER_NAME} \
--enable-pod-snapshots \
--release-channel=rapid \
--location=${LOCATION}
標準
建立具備必要功能的標準叢集:
gcloud beta container clusters create ${CLUSTER_NAME} \
--enable-pod-snapshots \
--release-channel=rapid \
--machine-type=${MACHINE_TYPE} \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--workload-metadata=GKE_METADATA \
--num-nodes=1 \
--location=${LOCATION}
建立啟用 gVisor 的節點集區:
gcloud container node-pools create gvisor-pool \
--cluster ${CLUSTER_NAME} \
--num-nodes=1 \
--location=${LOCATION} \
--project=${PROJECT_ID} \
--sandbox type=gvisor
建立 Artifact Registry 存放區
在 Artifact Registry 中建立 Docker 存放區,用於儲存用戶端應用程式的容器映像檔 (建立及管理沙箱的應用程式):
gcloud artifacts repositories create ${REPOSITORY_NAME} \
--repository-format=docker \
--location=${LOCATION} \
--description="Docker repository for Agent Sandbox"
安裝 Agent Sandbox
在叢集上安裝 Agent Sandbox 核心元件和擴充功能 (以 v0.4.6 版為例):
# Install the core agent-sandbox components
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.4.6/manifest.yaml
# Install the extensions (e.g., Warm Pools, Claims)
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.4.6/extensions.yaml
設定儲存空間和權限
設定 Cloud Storage bucket 來儲存 Pod 快照,並將必要的工作負載身分權限授予 snapshot-sa 服務帳戶和 GKE 服務代理。這樣一來,沙箱化工作負載就能安全地儲存及擷取快照物件:
建立新的 Cloud Storage bucket:
gcloud storage buckets create "gs://${BUCKET_NAME}" \ --uniform-bucket-level-access \ --enable-hierarchical-namespace \ --soft-delete-duration=0d \ --location="${BUCKET_LOCATION}"在
default命名空間中建立 Kubernetes 服務帳戶。沙箱化應用程式 (Python 計數器指令碼) 會使用這個身分向外部 API 進行驗證,並安全地存取儲存在 Cloud Storage 中的快照物件:kubectl create serviceaccount "snapshot-sa" \ --namespace "default"使用 Workload Identity 將
storage.bucketViewer角色繫結至服務帳戶。這個角色可讓沙箱工作負載列出 bucket 內容,並找出特定快照:gcloud storage buckets add-iam-policy-binding "gs://${BUCKET_NAME}" \ --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/default/sa/snapshot-sa" \ --role="roles/storage.bucketViewer"使用 Workload Identity 將
storage.objectUser角色繫結至服務帳戶。這個角色提供在 bucket 中讀取、儲存及刪除快照二進位物件的權限:gcloud storage buckets add-iam-policy-binding "gs://${BUCKET_NAME}" \ --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/default/sa/snapshot-sa" \ --role="roles/storage.objectUser"授予 GKE 服務代理程式管理 (建立、列出、讀取及刪除) bucket 內快照物件的權限:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:service-${PROJECT_NUMBER}@container-engine-robot.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"
設定 Pod 快照
建立並套用設定檔,安裝必要的 Kubernetes 自訂資源。這些資源定義叢集如何儲存及管理 Pod 快照:
- PodSnapshotStorageConfig:指定用於儲存快照二進位物件的 Cloud Storage bucket。
- PodSnapshotPolicy:定義如何手動觸發快照、分組頻率,以及保留政策。
- SandboxTemplate:定義基礎容器、節點選取器和服務帳戶,用於執行隔離的沙箱工作負載。
建立名為
test_client/snapshot_storage_config.yaml的檔案。這項設定會指定叢集儲存二進位 Pod 快照狀態的目標 Cloud Storage bucket:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotStorageConfig metadata: name: example-pod-snapshot-storage-config spec: snapshotStorageConfig: gcs: bucket: "$BUCKET_NAME"在設定檔中替換環境變數預留位置:
sed -i "s/\$BUCKET_NAME/$BUCKET_NAME/g" test_client/snapshot_storage_config.yaml套用儲存空間設定資訊清單:
kubectl apply -f test_client/snapshot_storage_config.yaml等待儲存空間設定準備就緒:
kubectl wait --for=condition=Ready podsnapshotstorageconfig/example-pod-snapshot-storage-config --timeout=60s建立名為
test_client/snapshot_policy.yaml的檔案。這項設定會建立資料保留規則,為沙箱工作負載保留最多兩個快照。觸發類型設為manual: 這可讓用戶端應用程式視需要控制快照:apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotPolicy metadata: name: example-pod-snapshot-policy namespace: default spec: storageConfigName: example-pod-snapshot-storage-config selector: matchLabels: app: agent-sandbox-workload triggerConfig: type: manual postCheckpoint: resume snapshotGroupingRules: groupByLabelValue: labels: ["agents.x-k8s.io/sandbox-name-hash", "tenant-id", "user-id"] groupRetentionPolicy: maxSnapshotCountPerGroup: 2套用快照政策資訊清單:
kubectl apply -f test_client/snapshot_policy.yaml建立名為
test_client/python-counter-template.yaml的檔案。這項設定會定義沙箱 Pod,並將snapshot-sa服務帳戶身分指派給該 Pod。這項指派作業可確保沙箱安全執行。在該 Pod 中,沙箱應用程式 (Python 指令碼) 會持續將遞增計數器列印到容器記錄中:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxTemplate metadata: name: python-counter-template namespace: default spec: podTemplate: metadata: labels: app: agent-sandbox-workload spec: serviceAccountName: snapshot-sa runtimeClassName: gvisor nodeSelector: topology.kubernetes.io/zone: us-central1-a # Pin to a zone to avoid CPU mismatch during restore containers: - name: python-counter image: python:3.13-slim command: ["python3", "-c"] args: - | import time i = 0 while True: print(f"Count: {i}", flush=True) i += 1 time.sleep(1)套用沙箱範本資訊清單:
kubectl apply -f test_client/python-counter-template.yaml
建構用戶端應用程式
建立用戶端應用程式的容器映像檔,並上傳至 Artifact Registry。
建立名為
test_client/Dockerfile.client的檔案。這個檔案會定義用戶端應用程式的 Python 執行階段環境和依附元件:FROM python:3.13-slim WORKDIR /app RUN pip install "k8s-agent-sandbox[tracing]==0.4.6" # Copy test script COPY client_test.py /app/client_test.py CMD ["python", "/app/client_test.py"]建立名為
test_client/client_test.py的檔案。這個指令碼會管理沙箱生命週期,並驗證狀態是否在拍攝快照後成功恢復:import time import logging import re from kubernetes import config, client from k8s_agent_sandbox.gke_extensions.snapshots import PodSnapshotSandboxClient logging.basicConfig(level=logging.INFO) def get_last_count(pod_name, namespace): v1 = client.CoreV1Api() try: logs = v1.read_namespaced_pod_log(name=pod_name, namespace=namespace) counts = re.findall(r"Count: (\d+)", logs) if counts: return int(counts[-1]) return None except Exception as e: logging.error(f"Failed to read logs for pod {pod_name}: {e}") return None def get_current_pod_name(sandbox_id, namespace): custom_api = client.CustomObjectsApi() try: sandbox_cr = custom_api.get_namespaced_custom_object( group="agents.x-k8s.io", version="v1alpha1", namespace=namespace, plural="sandboxes", name=sandbox_id ) metadata = sandbox_cr.get("metadata", {}) annotations = metadata.get("annotations", {}) return annotations.get("agents.x-k8s.io/pod-name") except Exception as e: logging.error(f"Failed to get sandbox CR: {e}") return None def get_current_count(sandbox_id, namespace="default"): pod_name = get_current_pod_name(sandbox_id, namespace) if not pod_name: logging.error(f"Could not determine pod name for sandbox {sandbox_id}") return None return get_last_count(pod_name, namespace) def suspend_sandbox(sandbox): logging.info("Pausing sandbox (using snapshots)...") try: suspend_resp = sandbox.suspend(snapshot_before_suspend=True) if suspend_resp.success: logging.info("Sandbox paused successfully.") if suspend_resp.snapshot_response: logging.info(f"Snapshot created: {suspend_resp.snapshot_response.snapshot_uid}") return suspend_resp else: logging.error(f"Failed to pause: {suspend_resp.error_reason}") exit(1) except Exception as e: logging.error(f"Failed to pause sandbox: {e}") exit(1) def resume_sandbox(sandbox): logging.info("Resuming sandbox (using snapshots)...") try: resume_resp = sandbox.resume() if resume_resp.success: logging.info("Sandbox resumed successfully.") if resume_resp.restored_from_snapshot: logging.info(f"Restored from snapshot: {resume_resp.snapshot_uid}") return resume_resp else: logging.error(f"Failed to resume: {resume_resp.error_reason}") exit(1) except Exception as e: logging.error(f"Failed to resume sandbox: {e}") exit(1) def verify_continuity(count_before, count_after): if count_before is not None and count_after is not None: logging.info(f"Verification: Count before={count_before}, Count after={count_after}") if count_after >= count_before: logging.info("SUCCESS: Sandbox resumed from where it left off (or later).") else: logging.error("FAIL: Sandbox counter reset or went backwards!") else: logging.warning("Could not verify counter continuity.") def main(): try: config.load_incluster_config() except config.ConfigException: config.load_kube_config() client_reg = PodSnapshotSandboxClient() logging.info("Creating sandbox...") sandbox = client_reg.create_sandbox(template="python-counter-template", namespace="default") logging.info(f"Sandbox created with ID: {sandbox.sandbox_id}") logging.info("Waiting for sandbox to run...") time.sleep(10) count_before = get_current_count(sandbox.sandbox_id) logging.info(f"Count before suspend: {count_before}") suspend_sandbox(sandbox) logging.info("Waiting 10 seconds...") time.sleep(10) resume_sandbox(sandbox) logging.info("Waiting for sandbox to be ready again...") time.sleep(10) count_after = get_current_count(sandbox.sandbox_id) logging.info(f"Count after resume: {count_after}") verify_continuity(count_before, count_after) logging.info("Snapshot test completed successfully.") if __name__ == "__main__": main()建構用戶端容器映像檔,並上傳至 Artifact Registry。如果您的環境 (例如 Cloud Shell) 已安裝 Docker,可以使用 Docker 在本機建構映像檔。如果您在沒有 Docker 的環境中工作,可以使用 Cloud Build 遠端建構及推送映像檔:
Docker
為 Artifact Registry 設定 Docker 驗證:
gcloud auth configure-docker "${LOCATION}-docker.pkg.dev"在本機建構及推送用戶端容器映像檔:
docker build -t "${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/sandbox-client:latest" -f test_client/Dockerfile.client test_client docker push "${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/sandbox-client:latest"
Cloud Build
建立名為
test_client/cloudbuild.yaml的檔案:steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', '$LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY_NAME/sandbox-client:latest', '-f', 'test_client/Dockerfile.client', 'test_client'] images: - '$LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY_NAME/sandbox-client:latest'在設定檔中替換環境變數預留位置:
sed -i "s/\$REPOSITORY_NAME/$REPOSITORY_NAME/g" test_client/cloudbuild.yaml sed -i "s/\$LOCATION/$LOCATION/g" test_client/cloudbuild.yaml sed -i "s/\$PROJECT_ID/$PROJECT_ID/g" test_client/cloudbuild.yaml將必要權限授予 Cloud Build 服務帳戶:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/artifactregistry.writer" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/logging.logWriter" gcloud storage buckets add-iam-policy-binding "gs://$CLOUDBUILD_BUCKET_NAME" \ --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/storage.objectAdmin"使用 Cloud Build 執行建構作業:
gcloud builds submit --config test_client/cloudbuild.yaml
執行測試
部署用戶端應用程式,建立沙箱、觸發快照,並確認內部計數器已從儲存的狀態成功恢復。
建立名為
test_client/client_sa.yaml的檔案。這個資訊清單會定義agent-sandbox-client-sa服務帳戶,以及管理沙箱自訂資源所需的 RBAC 權限:apiVersion: v1 kind: ServiceAccount metadata: name: agent-sandbox-client-sa namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: agent-sandbox-client-role namespace: default rules: - apiGroups: ["agents.x-k8s.io"] resources: ["sandboxes"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["extensions.agents.x-k8s.io"] resources: ["sandboxclaims"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["podsnapshot.gke.io"] resources: ["podsnapshotmanualtriggers", "podsnapshots"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: agent-sandbox-client-rolebinding namespace: default subjects: - kind: ServiceAccount name: agent-sandbox-client-sa namespace: default roleRef: kind: Role name: agent-sandbox-client-role apiGroup: rbac.authorization.k8s.io套用用戶端服務帳戶和 RBAC 資訊清單:
kubectl apply -f test_client/client_sa.yaml建立名為
test_client/client_pod.yaml的檔案。這份資訊清單會使用預先建構的容器映像檔,建立用戶端應用程式 Pod:apiVersion: v1 kind: Pod metadata: name: agent-sandbox-client-pod namespace: default spec: serviceAccountName: agent-sandbox-client-sa containers: - name: client image: $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY_NAME/sandbox-client:latest imagePullPolicy: Always restartPolicy: Never在資訊清單中替換環境變數預留位置:
sed -i "s/\$REPOSITORY_NAME/$REPOSITORY_NAME/g" test_client/client_pod.yaml sed -i "s/\$LOCATION/$LOCATION/g" test_client/client_pod.yaml sed -i "s/\$PROJECT_ID/$PROJECT_ID/g" test_client/client_pod.yaml套用用戶端應用程式 Pod 資訊清單:
kubectl apply -f test_client/client_pod.yaml串流處理 Pod 記錄,驗證執行流程:
kubectl logs -f agent-sandbox-client-pod
如果測試正常執行,輸出內容會類似以下內容 (為方便閱讀,這裡已縮短):
2026-04-21 23:02:39,030 - INFO - Creating sandbox...
...
2026-04-21 23:02:51,755 - INFO - Count before suspend: 23
2026-04-21 23:02:51,755 - INFO - Pausing sandbox (using snapshots)...
...
2026-04-21 23:03:07,115 - INFO - Resuming sandbox (using snapshots)...
...
2026-04-21 23:03:21,329 - INFO - Count after resume: 38
2026-04-21 23:03:21,329 - INFO - Verification: Count before=23, Count after=38
2026-04-21 23:03:21,329 - INFO - SUCCESS: Sandbox resumed from where it left off (or later).
輸出內容顯示,沙箱在暫停和恢復時,會成功保留狀態。沙箱暫停 (暫停並縮放至零) 時,計數器會停止遞增,並在沙箱還原時繼續遞增。如果沒有暫停,計數器會在暫停期間繼續累計,導致計數值大幅增加。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取費用,請刪除您建立的資源:
刪除 GKE 叢集。這也會刪除節點集區和其中的所有 Kubernetes 服務帳戶:
gcloud beta container clusters delete test-snapshot --location="${LOCATION}" --quiet刪除 Artifact Registry 存放區,移除您為測試映像檔建立的 Docker 存放區:
gcloud artifacts repositories delete ${REPOSITORY_NAME} --location="${LOCATION}" --quiet刪除 Cloud Storage 值區和其中的所有快照。這會自動移除套用至該 bucket 的 bucket 層級 Workload Identity IAM 繫結:
gcloud storage rm --recursive "gs://${BUCKET_NAME}"移除 GKE 服務代理程式的專案層級 IAM 繫結:
gcloud projects remove-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:service-${PROJECT_NUMBER}@container-engine-robot.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"如果您使用 Cloud Build 而非 Docker 建構及推送容器映像檔,請刪除記錄 bucket 並移除服務帳戶權限:
gcloud storage rm --recursive "gs://${CLOUDBUILD_BUCKET_NAME}" gcloud projects remove-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/artifactregistry.writer" gcloud projects remove-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/logging.logWriter"
後續步驟
- 瞭解如何隔離 AI 程式碼執行作業:外部觸發程序。
- 瞭解如何儲存及還原 Agent Sandbox 環境。
- 如要瞭解保護不受信任工作負載的隔離層,請參閱 GKE Sandbox。
- 在 GitHub 上探索開放原始碼的 Agent Sandbox 專案。