上云无忧 > 文档中心 > 腾讯云容器服务 TKE 标准集群 - Ingress 优雅停机
容器服务 TKE
腾讯云容器服务 TKE 标准集群 - Ingress 优雅停机

文档简介:
简介: 基于接入层直连 Pod 的场景,当后端进行滚动更新或后端 Pod 被删除时,如果直接将 Pod 从 LB 的后端摘除,则无法处理 Pod 已接收但还未处理的请求。 特别是长链接的场景,例如会议业务,如果直接更新或删除工作负载的 Pod,此时会议会直接中断。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

简介

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

应用场景

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

操作步骤

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

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

步骤2:使用 preStop 和 terminationGracePeriodSeconds

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

容器终止流程

以下为容器在 Kubernetes 环境中的终止流程:
1. Pod 被删除,此时 Pod 里有 DeletionTimestamp,且状态置为 Terminating。此时调整 CLB 到该 Pod 的权重为 0。
2. kube-proxy 更新转发规则,将 Pod 从 Ingress 的 endpoint 列表中摘除掉。
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:ingress.cloud.tencent.com/enable-grace-shutdown-tkex: "true" 实现这样优雅退出的能力。 该 Annotation 会根据 Endpoint 对象中 endpoints 是否 not-ready,将 not-ready 的 CLB 后端权重置为 0。
相似文档
  • 操作场景: 本文档介绍 Ingress 证书使用相关的内容,您可在以下场景中进行 Ingress 证书配置: 创建 Ingress 选用 HTTPS 监听协议时,选用合适的服务器证书能够确保访问安全。 为所有的 HTTPS 域名绑定同一个证书,简化配置 Ingress 下所有 HTTPS 规则的证书,使更新操作更加便捷。 为不同的域名绑定不同的证书,改善服务器与客户端 SSL/TLS。
  • 您可以通过以下 Annotation 注解配置 Ingress,以实现更丰富的负载均衡的能力。 注解使用方式: apiVersion: kind: Ingress metadata: annotations: kubernetes.io/ingress.class: "qcloud" name: test ........
  • Nginx-ingress 介绍: Nginx 可以用作反向代理、负载平衡器和 HTTP 缓存。 Nginx-ingress 是使用 Nginx 作为反向代理和负载平衡器的 Kubernetes 的 Ingress 控制器。您可以部署 Nginx-ingress 组件,在集群中使用 Nginx-ingress。容器服务 TKE 提供了产品化的能力,帮助您在集群内安装和使用 Nginx-ingress。
  • 安装 NginxIngress 组件: 1. 登录 容器服务控制台,选择左侧导航栏中的集群。 2. 在集群管理页面,单击目标集群 ID,进入集群详情页。 3. 选择左侧导航中的组件管理,在组件管理页面,单击新建。 4. 在新建组件管理页面中勾选 NginxIngress。 5. 单击完成即可安装组件。安装完成后,您可以在组件管理中查看组件详情。
  • 前提条件: 已登录 容器服务控制台。 集群内已 部署 NginxIngress 组件。 已安装并创建业务需要的 Nginx-ingress 实例。 Nginx-ingress 控制台操作指引: 1. 登录 容器服务控制台,在左侧导航栏中单击集群。 2. 进入集群管理页面,单击已安装 Nginx-ingress 组件的集群 ID,进入集群详情页。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部