K8S Termination Grace
Kubernetes 系统健康
在分布式系统中能及时处理系统失败是很重要的一项能力。Kubernetes 可以利用 Controller 观察系统的运行状态,并重启已经停止运转的服务。另一方面 Kubernetes 可以强制终止服务,并确保系统整体不受损害。
在传统容器或虚拟机中,如果节点出错,需要我们人为的重启系统并启动相关应用,服务会长时间的处于不可用状态,这对用户来讲是不可接受的。
在 Kubernets 中会使用一种循环系统,确保从容器到节点的资源都保持健康,确保不再需要人为进行系统监控。如果一个资源在健康检查过程中出现问题,Kubernetes 会自动制作一个替代品。
Kubernetes 优雅关闭
Kubernetes 会在一些情况下主动终止一个健康的容器,用以确保调度任务正常执行,例如滚动更新 Deployment、资源耗尽终止 Pod 释放资源、节点故障迁移 Pod 等,Kubernetes 会慢慢终止久的容器,同时准备新的替代品。所以这时我们需要确保可以将我们的应用优雅关闭,优雅关闭前需要终止所有长链接、数据库连接、WebSocket 流、保存会话状态等工作。
Kubernetes sigterm
当应用收到 Sigterm 信号时,应用响应 sigterm 信号并开始进行优雅关闭,一旦 Kubernetes 决定终止容器,会出发一系列相关事件。
Kubernetes Prestop
Prestop 钩子是一个特殊的 Command 或者 HTTP 请求,会被发送到 Pod 的容器中。如果应用不能在收到 Sigterm 信号时优雅关闭,可以使用 Prestop 钩子来触发应用的优雅关闭。当出发 Prestop 时,Kubernetes 会等待一段被称为优雅关闭的时间数值。
apiVersion: v1
kind: Pod
metadata:
name: Termination-demo
spec:
containers:
- name: Termination-demo
image: nginx:1.9
ports:
- name: http
containerPort: 80
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "echo preStop handler >> /usr/share/message; sleep 30"]
Kubernetes TerminationGracePeriodSeconds
TerminationGracePeriodSeconds 代表优雅关闭等待时间,Kubernetes 在终止 Pod 时会等待该参数值设置的时间后,强制终止 Pod,注意超过这个时间后 Kubernetes 不会等待 Sigterm 或 Prestop 处理完成。
apiVersion: v1
kind: Pod
metadata:
name: Termination-demo
spec:
containers:
- name: Termination-demo
image: nginx:1.9
ports:
- name: http
containerPort: 80
TerminationGracePeriodSeconds: 60
Kubernetes Sigkill
Kubernetes 会在等待 TerminationGracePeriodSeconds 时间后,对有容器运行 Pod 发送 Sigkill 信号,然后强制移除 Pod 并清除所有对象。
注意事项
应用应该测试当 Sigterm 信号被送达时,应用会做出何种反应。
Prestop 是一个优雅关闭的工具。
Sigterm 与 Prestop 并行发生。
TerminationGracePeriodSeconds 值的设置一定要经过严格的测试。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!