本文介绍如何通过 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表示对应容器重启成功。