本文介紹如何通過 ContainerRecreateRequest(CRR)對運行狀態的 Agent Sandbox Pod 中指定容器執行重啟操作,無需刪除或重建 Pod。
背景資訊
在Agent Sandbox應用的日常營運中,需要對運行中的容器執行重啟操作,常見情境包括:
應用出現異常,需要快速恢複服務。
記憶體流失等問題需要定期重啟緩解。
不希望重建整個 Pod,僅需重啟特定容器。
Kubernetes 原生並未提供對運行中 Pod 內單個容器的重啟能力,通常只能通過刪除 Pod 或滾動重啟 Deployment 來間接實現,代價較大。ACS Agent Sandbox 支援通過 ContainerRecreateRequest CRD(Custom Resource Definition,自訂資源定義)對 Pod 中的指定容器執行精準重啟。
適用範圍
在叢集組件管理頁面,確認以下組件版本:
ack-agent-sandbox-controller:已升級至最新版。acs-virtual-node:版本 >= v2.18.0。ack-kruise:版本 >= 1.8.4。
使用限制
約束項
說明
Pod 狀態
Pod 必須處於 Running 狀態,非 Running 狀態不支援操作。
操作粒度
支援對指定 Pod 內單個或多個容器進行重啟。
Init 容器
不支援對 Init 容器執行重啟操作。
操作步驟
重啟容器時,容器內的資料保留情況取決於具體的執行個體類型。
步驟一:建立Agent Sandbox
您可基於Sandbox Set預熱池來分配(SandboxClaim)沙箱執行個體,也可基於Agent Sandbox執行個體類型自行建立沙箱執行個體。
SandboxClaim方式
通過此方式建立的Sandbox預設啟用ops.alibabacloud.com/pause-enabled: "true"註解,無需額外配置。具體操作,請參考SandboxClaim方式。
自行建立
使用Agent Sandbox算力,並配置ops.alibabacloud.com/pause-enabled: "true"註解來建立沙箱。
將以下內容儲存為
sandbox.yaml。apiVersion: apps/v1 kind: Deployment metadata: name: code-interpreter namespace: default labels: app: code-interpreter spec: replicas: 2 selector: matchLabels: app: code-interpreter template: metadata: labels: app: code-interpreter alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox # Agent Sandbox 執行個體類型 alibabacloud.com/compute-qos: default # 算力品質 default/best-effort annotations: ops.alibabacloud.com/pause-enabled: "true" # 啟用讀寫層資料保留 spec: automountServiceAccountToken: false terminationGracePeriodSeconds: 30 containers: - name: sandbox image: registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 # 替換成實際叢集所在的地區 imagePullPolicy: IfNotPresent resources: limits: cpu: "1" memory: 1Gi requests: cpu: "1" memory: 1Gi ephemeral-storage: 30Gi建立資源。
kubectl apply -f sandbox.yaml確認目標應用Pod狀態為
Running。kubectl get pod | grep code-interpreter
步驟二:建立 ContainerRecreateRequest
ContainerRecreateRequest(CRR)是 ACS 為 Agent Sandbox 提供的容器重啟 CRD,用於描述對指定 Pod 內的容器執行重建(重啟)操作。更多進階配置,請參見 Container Restart。
將以下內容儲存為
crr.yaml。CRR 資源的命名空間必須與目標 Pod 一致,否則操作無法生效。
apiVersion: apps.kruise.io/v1alpha1 kind: ContainerRecreateRequest metadata: namespace: <YOUR-NAMESPACE> # 目標 Pod 所在的命名空間 name: <YOUR-CRR-NAME> # CRR 資源名稱 spec: podName: <YOUR-POD-NAME> # 目標 Pod 名稱 containers: # 需要重啟的容器名稱列表,至少提供一個容器名稱 - name: <CONTAINER-NAME-1> # 容器名稱1 - name: <CONTAINER-NAME-2> # 容器名稱2關鍵字段說明:
metadata.namespace:目標 Pod 所在的命名空間。spec.podName:需要重啟容器所在的 Pod 名稱。spec.containers[].name:需要重啟的容器名稱,支援指定多個容器。
建立 CRR 資源。
kubectl apply -f crr.yaml
步驟三:觀察重啟狀態
提交 CRR 後,可通過以下命令查看容器重啟狀態:
kubectl get containerrecreaterequest <YOUR-CRR-NAME> -n <YOUR-NAMESPACE> -o yaml當status.phase為Completed且containerRecreateStates中對應容器的phase為Succeeded時,表示容器已成功重啟。樣本如下:
apiVersion: apps.kruise.io/v1alpha1
kind: ContainerRecreateRequest
metadata:
...
status:
completionTime: '2026-05-27T08:04:35Z'
containerRecreateStates:
- name: main
phase: Succeeded
phase: Completed狀態欄位說明:
status.phase:CRR 整體狀態。Completed表示重啟流程已結束。containerRecreateStates[].phase:單個容器的重啟結果。Succeeded表示對應容器重啟成功。