容器健康检查和恢复机制

2019-12-10  本文已影响0人  理想枫林晚

通过命令健康检查的一个例子

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: test-liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5   # 容器执行5秒之后进行健康检查
      periodSeconds: 5  # 每隔5秒进行健康检查

我们定义了一个这样的 livenessProbe(健康检查)它的类型是 exec,这意味着,它会在容器启动后,在容器里面执行一句我们指定的命令,比如:“cat /tmp/healthy”。这时,如果这个文件存在,这条命令的返回值就是 0,Pod 就会认为这个容器不仅已经启动,而且是健康的。这个健康检查,在容器启动 5 s 后开始执行(initialDelaySeconds: 5),每 5 s 执行一次
(periodSeconds: 5)。

我们发现,Pod 并没有进入 Failed 状态,而是保持了 Running 状态。这是为什么呢?
其实,如果你注意到 RESTARTS 字段从 0 到 1 的变化,就明白原因了:这个异常的容器已经被
Kubernetes 重启了。在这个过程中,Pod 保持 Running 状态不变。

需要注意的是:Kubernetes 中并没有 Docker 的 Stop 语义。所以虽然是 Restart(重启),但实际却是重新创建了容器。

这个功能就是 Kubernetes 里的Pod 恢复机制,也叫 restartPolicy。它是 Pod 的 Spec 部分的一个标准字段(pod.spec.restartPolicy),默认值是 Always,即:任何时候这个容器发生了异常,它一定会被重新创建。

但一定要强调的是,Pod 的恢复过程,永远都是发生在当前节点上,而不会跑到别的节点上去。事实上,一旦一个 Pod 与一个节点(Node)绑定,除非这个绑定发生了变化(pod.spec.node 字段
被修改),否则它永远都不会离开这个节点。这也就意味着,如果这个宿主机宕机了,这个 Pod 也不会主动迁移到其他节点上去。

而如果你想让 Pod 出现在其他的可用节点上,就必须使用 Deployment 这样的“控制器”来管理Pod

restartPolicy 和 Pod 里容器的状态,以及 Pod 状态的对应关系总结:

1、只要 Pod 的 restartPolicy 指定的策略允许重启异常的容器(比如:Always),那么这个 Pod就会保持 Running 状态,并进行容器重启。
否则,Pod 就会进入 Failed 状态 。

2、对于包含多个容器的 Pod,只有它里面所有的容器都进入异常状态后,Pod 才会进入 Failed 状态。
在此之前,Pod 都是 Running 状态。此时,Pod 的 READY 字段会显示正常容器的个数,
所以,假如一个 Pod 里只有一个容器,然后这个容器异常退出了。那么,只有当restartPolicy=Never 时,这个 Pod 才会进入 Failed 状态。

健康检查发起HTTP请求

livenessProbe:
     httpGet:
       path: /healthz
       port: 8080
       httpHeaders:
       - name: X-Custom-Header
         value: Awesome
     initialDelaySeconds: 3
     periodSeconds: 3

健康检查发起TCP请求

 livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20
上一篇下一篇

猜你喜欢

热点阅读