tencent cloud

容器服务

动态与公告
产品动态
公告
产品发布记录
产品简介
产品概述
产品优势
产品架构
应用场景
产品功能
基本概念
原生 Kubernetes 名词对照
容器服务高危操作
地域和可用区
开源组件
购买指南
购买指引
购买 TKE 标准集群
购买原生节点
购买超级节点
快速入门
新手指引
快速创建一个标准集群
入门示例
容器应用部署 Check List
集群配置
标准集群概述
集群管理
网络管理
存储管理
节点管理
GPU 资源管理
远程终端
应用配置
工作负载管理
服务和配置管理
组件和应用管理
弹性伸缩
容器登录方式
可观测配置
运维可观测性
成本洞察和优化
调度配置
调度组件概述
资源利用率优化调度
业务优先级保障调度
Qos 感知调度
安全和稳定性
容器服务安全组设置
身份验证和授权
应用安全
多集群管理
计划升级
备份中心
云原生服务指南
云原生 etcd
Prometheus 监控服务
TKE Serverless 集群指南
TKE 注册集群指南
实践教程
集群
Serverless 集群
调度
安全
服务部署
网络
发布
日志
监控
运维
Terraform
DevOps
弹性伸缩
容器化
微服务
成本管理
混合云
AI
故障处理
节点磁盘爆满排障处理
节点高负载排障处理
节点内存碎片化排障处理
集群 DNS 解析异常排障处理
集群 Kube-Proxy 异常排障处理
集群 API Server 网络无法访问排障处理
Service&Ingress 网络无法访问排障处理
Service&Ingress 常见报错和处理
Nginx Ingress 偶现 Connection Refused
CLB Ingress 创建报错排障处理
Pod 网络无法访问排查处理
Pod 状态异常与处理措施
授权腾讯云售后运维排障
CLB 回环问题
API 文档
History
Introduction
API Category
Making API Requests
Elastic Cluster APIs
Resource Reserved Coupon APIs
Cluster APIs
Third-party Node APIs
Relevant APIs for Addon
Network APIs
Node APIs
Node Pool APIs
TKE Edge Cluster APIs
Cloud Native Monitoring APIs
Scaling group APIs
Super Node APIs
Other APIs
Data Types
Error Codes
TKE API 2022-05-01
常见问题
TKE 标准集群
TKE Serverless 集群
运维类
隐患处理
服务类
镜像仓库类
远程终端类
事件类
资源管理类
服务协议
TKE Service Level Agreement
TKE Serverless Service Level Agreement
联系我们
词汇表

Service 优雅停机

PDF
聚焦模式
字号
最后更新时间: 2024-12-23 11:41:09

简介

基于接入层直连 Pod 的场景,当后端进行滚动更新或后端 Pod 被删除时,如果直接将 Pod 从 LB 的后端摘除,则无法处理 Pod 已接收但还未处理的请求。 特别是长链接的场景,例如会议业务,如果直接更新或删除工作负载的 Pod,此时会议会直接中断。

应用场景

更新工作负载时,Pod 的优雅退出,使客户端不会感受到更新时产生的抖动和错误。
当 Pod 需要被删除时,Pod 能够处理完已接受到的请求,此时入流量关闭,但出流量仍能走通。直到处理完所有已有请求和 Pod 真正删除时,出入流量才进行关闭。
注意:
仅针对 直连场景 生效,请检查您的集群是否支持直连模式。

操作步骤

步骤1:使用 Annotation 标明使用优雅停机

以下为使用 Annotation 标明使用优雅停机示例,完整 Service Annotation 说明可参见 Service Annotation 说明
kind: Service
apiVersion: v1
metadata:
annotations:
service.cloud.tencent.com/direct-access: "true" ## 开启直连 Pod 模式
service.cloud.tencent.com/enable-grace-shutdown: "true" # 表示使用优雅停机
name: my-service
spec:
selector:
app: MyApp


步骤2:使用 preStop 和 terminationGracePeriodSeconds

步骤2为在需要优雅停机的工作负载里配合使用 preStop 和 terminationGracePeriodSeconds。

容器终止流程

以下为容器在 Kubernetes 环境中的终止流程:
1. Pod 被删除,此时 Pod 里有 DeletionTimestamp,且状态置为 Terminating。此时调整 CLB 到该 Pod 的权重为 0。
2. kube-proxy 更新转发规则,将 Pod 从 service 的 endpoint 列表中摘除掉,新的流量不再转发到该 Pod。
3. 如果 Pod 配置了 preStop Hook ,将会执行。
4. kubelet 将对 Pod 中各个 container 发送 SIGTERM 信号,以通知容器进程开始优雅停止。
5. 等待容器进程完全停止,如果在 terminationGracePeriodSeconds 内 (默认30s) 还未完全停止,将发送 SIGKILL 信号强制停止进程。
6. 所有容器进程终止,清理 Pod 资源。

具体操作步骤

1. 使用 preStop 要实现优雅终止,务必在业务代码里处理 SIGTERM 信号。主要逻辑是不接受新的流量进入,继续处理存量流量,所有连接全部断开才退出,了解更多可参见 示例。 若您的业务代码中未处理 SIGTERM 信号,或者您无法控制使用的第三方库或系统来增加优雅终止的逻辑,也可以尝试为 Pod 配置 preStop,在其实现优雅终止的逻辑,示例如下:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
preStop:
exec:
command:
- /clean.sh
...
更多关于 preStop 的配置请参见 Kubernetes API 文档。
在某些极端情况下,Pod 被删除的一小段时间内,仍然可能有新连接被转发过来,因为 kubelet 与 kube-proxy 同时 watch 到 Pod 被删除,kubelet 有可能在 kube-proxy 同步完规则前就已经停止容器,这时可能导致一些新的连接被转发到正在删除的 Pod,而通常情况下,当应用受到 SIGTERM 后都不再接受新连接,只保持存量连接继续处理,因此可能导致 Pod 删除的瞬间部分请求失败。
针对上述情况,可以利用 preStop 先 sleep 短暂时间,等待 kube-proxy 完成规则同步再开始停止容器内进程。示例如下:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
preStop:
exec:
command:
- sleep
- 5s
2. 使用 terminationGracePeriodSeconds 调整优雅时长 如果需要优雅终止时间较长 (preStop + 业务进程停止可能超过30s),可根据实际情况自定义 terminationGracePeriodSeconds,避免过早的被 SIGKILL 停止,示例如下:
apiVersion: v1
kind: Pod
metadata:
name: grace-demo
spec:
terminationGracePeriodSeconds: 60 # 优雅停机默认30s,您可以设置更长的时间
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
preStop:
exec:
command:
- sleep
- 5s
...

相关能力

优雅停机只是在 Pod 删除时,才把 CLB 后端的权重置为 0。若 Pod 在运行的过程中,出现了不健康的情况,此时将该后端的权重置为 0,可以减少服务不可用的风险。 您可以使用 Annotation:service.cloud.tencent.com/enable-grace-shutdown-tkex: "true" 实现这样优雅退出的能力。 该 Annotation 会根据 Endpoint 对象中 endpoints 是否 not-ready,将 not-ready 的 CLB 后端权重置为 0。

相关文档

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈