容器服务 Pod 优雅删除

在 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 组件版本不低于 v2.5.0 。可以通过集群 kube-system 命名空间下名称为 tke-service-controller-config 和 tke-ingress-controller-config 的 configmap,检查 VERSION 字段查看集群是否支持该功能。

4. 如果是超级节点,请 提交工单 咨询确认。

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

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

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

你可以选择以下两种方式之一进行配置:

方式一:使用注解方式二:使用全局开关

通过为特定的 Service 或 Ingress 添加注解来开启此功能。

六、Service YAML 配置示例

apiVersion: v1kind: Servicemetadata: 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/v1kind: Ingressmetadata: 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: v1data: EnablePodGracefulDeletion: "true" VERSION: v2.7.0kind: ConfigMapmetadata: 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 优雅删除特性的注解时,全局开关不生效。

赞 (0)
上一篇 4天前
下一篇 4天前