【容器TKE】K8s云服务如何实现容器优雅停止旧Pod容器服务?
2023-06-13 09:17:00 时间
场景描述:
- 更新工作负载时,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 环境中的终止流程:
- Pod 被删除,此时 Pod 里有 DeletionTimestamp,且状态置为 Terminating。此时调整 CLB 到该 Pod 的权重为 0。
- kube-proxy 更新转发规则,将 Pod 从 service 的 endpoint 列表中摘除掉,新的流量不再转发到该 Pod。
- 如果 Pod 配置了 preStop Hook ,将会执行。
- kubelet 将对 Pod 中各个 container 发送 SIGTERM 信号,以通知容器进程开始优雅停止。
- 等待容器进程完全停止,如果在 terminationGracePeriodSeconds 内 (默认30s) 还未完全停止,将发送 SIGKILL 信号强制停止进程。
- 所有容器进程终止,清理 Pod 资源。
具体操作步骤
- 使用 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
...
相关文章
- k8s系列(1)-腾讯云CVM手动部署K8S_Dashboard安装2
- K8S之CNI
- 快速搭建k8s集群
- mac 上学习k8s系列(46)canal同步mysql到es
- k8s 安装canal 注意事项
- K8s系列-KubeSphere
- (2 / 3)CentOS搭建K8s微服务20条
- 关于K8s中工作节点扩容、隔离、恢复的一些笔记
- 详解 K8S Pod 高级调度
- 突破 etcd 限制!字节开源自研 K8s 存储 KubeBrain
- 一个容器,但是一整个k8s集群
- K8s根本甩不掉Docker,原因一说就懂
- k8s运行容器之deployment(三)
- 容器技术和 K8S 的下一站
- K8S中快速部署Oracle(k8s配置oracle)
- K8S上简易部署Oracle数据库(k8s上部署oracle)