Pod 优雅删除

最近更新时间:2025-09-05 16:52:52

我的收藏

操作背景

在 CLB 直连场景下,当用户发起工作负载滚动更新时,会同时触发两个并行的工作流:
1. Service/Ingress 控制器调整 CLB 后端 Pod 的权重为0,并后续摘除该 Pod。
2. 运行时(kubelet)终止并删除 Pod。
在某些极端场景,例如多个 Service 复用同一个 CLB,或者单个 Service 下有非常多的 Pod,可能出现某些 Pod 已经被运行时删除,但 Service 控制器尚未完成 CLB 后端该 Pod 权重调整的情况,进而导致流量仍被发往已不存在的 Pod IP,从而引起业务异常。

应用场景

TKE Service/Ingress 的优雅删除特性,会将上述两个并行的工作流,协调为串行,也就是先让 Service/Ingress 控制器完成 CLB 后端 Pod 权重调整为 0,再让运行时(kubelet)删除该 Pod。

使用限制

1. 仅适用于 直连场景
2. 对节点 kubelet 版本有要求,具体版本请参见 TKE Kubernetes Revision 版本历史,确保集群节点版本满足 kubelet 支持 pod 删除保护的功能。
3. 该功能对 TKE Service/Ingress 组件版本有要求,如需使用请 提交工单 咨询,检查集群是否支持该功能。
4. 如果是超级节点,请 提交工单 咨询确认。

操作步骤

步骤1:确保集群节点版本和 Service/Ingress 组件版本支持该功能

请确保集群节点版本和 Service/Ingress 组件版本满足 使用限制

步骤2:开启 Pod 优雅删除特性

您可以选择以下两种方式之一进行配置:
方式一:使用注解
方式二:使用全局开关
通过为特定的 Service 或 Ingress 添加注解来开启此功能。

Service YAML 配置示例​​

apiVersion: v1
kind: Service
metadata:
name: anyserver
annotations:
service.cloud.tencent.com/direct-access: "true"
service.cloud.tencent.com/enable-grace-deletion: "true" # 表示开启 Pod 优雅删除
spec:
ports:
- name: nginx
port: 80
targetPort: 80
selector:
app: anyserver
type: NodePort

​​Ingress YAML 配置示例​​

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: anyserver
annotations:
ingress.cloud.tencent.com/direct-access: "true"
ingress.cloud.tencent.com/enable-grace-deletion: "true"
spec:
rules:
- host: example.io
http:
paths:
- backend:
service:
name: anyserver
port:
number: 80
path: /
pathType: ImplementationSpecific

通过控制台为 Service 配置​​

1. 登录 容器服务控制台,选择左侧导航栏中的集群
2. 在集群页面单击目标集群 ID,进入集群基本信息页面。
3. 选择服务与路由页面的 Service 页签,单击目标 Service 右侧的编辑 Annotation。如下图所示:

4. 编辑 Annotation 页面,单击新增,新增两个注解:
增加 Pod 优雅删除注解,键为service.cloud.tencent.com/enable-grace-deletion,值为true
增加直连访问注解,键为service.cloud.tencent.com/direct-access,值为true


5. 单击设置 Annotations

通过控制台为 Ingress 配置​​

1. 登录 容器服务控制台,选择左侧导航栏中的集群
2. 在集群页面单击目标集群 ID,进入集群基本信息页面。
3. 选择服务与路由页面的 Ingress 页签,单击目标 Ingress 右侧的编辑 yaml。如下图所示:

4. 编辑 yaml 页面,参考 Ingress YAML 配置示例 文件,添加 Pod 优雅删除注解和直连访问注解。

打开 Pod 优雅删除全局开关,开启 Pod 优雅删除特性

您可以通过打开节点 Pod 优雅删除特性的全局开关,以使用该特性。这样当您创建新的 Service 或 Ingress 时,将默认开启 Pod 优雅删除。
您可以通过修改 kube-system 下名为 tke-service-controller-config 的 ConfigMap 的 data 值,增加 EnablePodGracefulDeletion: "true" 以开启 Pod 优雅删除的全局开关。
tke-service-controller-config ConfigMap YAML 配置示例如下:
apiVersion: v1
data:
EnablePodGracefulDeletion: "true"
VERSION: v2.7.0
kind: ConfigMap
metadata:
name: tke-service-controller-config
namespace: kube-system
当您通过 kubectl 连接集群时,可以执行以下命令进行配置:
kubectl patch configmap tke-service-controller-config \\
-n kube-system \\
--type merge \\
--patch '{"data":{"EnablePodGracefulDeletion":"true"}}'
注意:
在决定是否开启 Pod 优雅删除特性时,全局开关的优先级低于注解的优先级。当您手动在特定 Service/Ingress 上设置 Pod 优雅删除特性的注解时,全局开关不生效。