K8S Termination Grace

Kubernetes 系统健康

   在分布式系统中能及时处理系统失败是很重要的一项能力。Kubernetes 可以利用 Controller 观察系统的运行状态,并重启已经停止运转的服务。另一方面 Kubernetes 可以强制终止服务,并确保系统整体不受损害。

   在传统容器或虚拟机中,如果节点出错,需要我们人为的重启系统并启动相关应用,服务会长时间的处于不可用状态,这对用户来讲是不可接受的。

   在 Kubernets 中会使用一种循环系统,确保从容器到节点的资源都保持健康,确保不再需要人为进行系统监控。如果一个资源在健康检查过程中出现问题,Kubernetes 会自动制作一个替代品。

循环检测,确保系统健康

Kubernetes 优雅关闭

  Kubernetes 会在一些情况下主动终止一个健康的容器,用以确保调度任务正常执行,例如滚动更新 Deployment、资源耗尽终止 Pod 释放资源、节点故障迁移 Pod 等,Kubernetes 会慢慢终止久的容器,同时准备新的替代品。所以这时我们需要确保可以将我们的应用优雅关闭,优雅关闭前需要终止所有长链接、数据库连接、WebSocket 流、保存会话状态等工作。

Kubernetes sigterm

   当应用收到 Sigterm 信号时,应用响应 sigterm 信号并开始进行优雅关闭,一旦 Kubernetes 决定终止容器,会出发一系列相关事件。

sigterm 状态

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"]
prestop 状态

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
termination 状态

Kubernetes Sigkill

  Kubernetes 会在等待 TerminationGracePeriodSeconds 时间后,对有容器运行 Pod 发送 Sigkill 信号,然后强制移除 Pod 并清除所有对象。

sigkill 状态

注意事项

  • 应用应该测试当 Sigterm 信号被送达时,应用会做出何种反应。

  • Prestop 是一个优雅关闭的工具。

  • Sigterm 与 Prestop 并行发生。

  • TerminationGracePeriodSeconds 值的设置一定要经过严格的测试。



Kubernetes     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!