在Kubernetes中,可以为Pod里的容器定义一个健康检查探针(Probe),这样Kubernetes会根据这个Probe的返回值决定这个容器的状态,而不是直接以容器是否允许(来自Docker返回的信息)作为依据。

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 ; rm -rf /tmp/healthy; sleep
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds:
periodSeconds:

  这个Pod的容器在启动之后做的第一件事是在/tmp目录下创建一个healthy文件,以此作为自己已经正常运行的标识,而30s过后它会把这个文件删除掉。同时还定义了一个livenessProbe,类型是exec,它会在容器启动后执行指定的命令:“cat /tmp/healthy”,如果这个文件存在,这条命令返回值就是0,Pod就会认为这个容器不仅已经启动,而且是健康的,这个健康检查在启动5s后开始执行,每5s执行一次。

$ kubectl create -f test-liveness-exec.yaml
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
test-liveness-exec / Running 10s ####30s后
$ kubectl describe pod test-liveness-exec
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
2s 2s {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
$ kubectl get pod test-liveness-exec
NAME READY STATUS RESTARTS AGE
liveness-exec / Running 1m

  可以看到,健康检查报告容器不健康,但是Pod保存了running状态,这是为什么呢?

  认真看可以发现。RESTARTS字段已经变成1了,即这个异常的容器已经被Kubernetes重启了,在这个过程中,Pod保存Running状态不变。Kubernetes没有Docker的Stop语义,所以虽然是重启,实际却是重新创建了容器,这个功能就是Kubernetes里的Pod恢复机制(restartPolicy),它是Pod的Spec部分的一个标准字段(pod.spec.restartPolicy),默认值为Always,作为用户可以设置Pod的恢复策略

    • Always:任何情况下,只要容器不在运行状态,就自动重启容器(合理设置,如果只计算1+1=2,计算完成后退出,强制重启毫无意义)
    • OnFailure:只在容器异常时才自动重启容器
    • Never:从来不重启容器(如要关心容器退出后的日志、文件和目录,就需要设置为NEVER,否则可能丢失)

  Pod的恢复过程,永远都是发送在当前节点上,而不会跑到别的节点上去,即如果这个宿主机宕机了,这个pod也不会主动迁移到其他节点上去。如果想让Pod出现在其他可用节点上,就必须用Deployment这样的控制器来管理Pod。

  Kubernetes中restartPolicy和Pod里容器的状态以及Pod状态的对应关系的基本设计原理有两个:

    • 只要Pod的restartPolicy指定的策略允许重启异常的容器(如Always),那么这个Pod就会保持running状态,并进行容器重启,否则Pod会进入Failed状态。
    • 对于包含多个容器的Pod,只有它里面所有的容器都进入异常状态后,Pod才会进入Failed状态,在此之前,Pod都是running状态,此时Pod的REDY字段会显示正常容器的个数。

  所以假如一个Pod里只有一个容器,然后这个容器异常退出了,那么只有当restartPolicy=Never时,这个Pod才会进入Failed状态,而其他情况下,由于kubernetes都可以重启这个容器,所以Pod状态保持running不变。如果这个Pod有多个容器,仅有一个容器异常退出,它始终保持Running状态,哪怕即使restartPolicy=Never,也只有当容器也异常退出之后,这个Pod才会进入Failed状态。

  除了在容器中执行命令外,livenessProbe也可以定义为发起HTTP或者TCP请求的方式,定义格式如下:

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

最新文章

  1. ***ECharts图表入门和最佳实践
  2. 二维线段树 HDU 1823最简单的入门题
  3. 五个小例子教你搞懂 JavaScript 作用域问题
  4. CodeForces 370A Rook, Bishop and King
  5. Library string Type
  6. Head First --- Python 第一章
  7. Android中获取系统的时间
  8. 安装aptana(1)
  9. Javascript Array 非常用方法解析
  10. 如何在关闭ssh连接的情况下,让程序继续运行?
  11. crack the coding interview
  12. 013_针对单个pid的cpu/内存/io的资源占用统计
  13. Ubuntu下永久修改主机名和创建用户
  14. Spring Security(十一):4. Samples and Guides (Start Here)
  15. vue中对axios进行封装
  16. 【索引失效】什么情况下会引起MySQL索引失效
  17. 计算字符串最后一个单词的长度,单词以空格隔开。 java算法
  18. 一些CSS3的乐趣 - 工作也能发现乐的源头
  19. (转)Android 5.1.1 源码目录结构
  20. 让IE依据HTML头标签选择显示模式

热门文章

  1. Android.mk模板
  2. {g2o}Installation Notes:ccmake
  3. uvm_misc——杂货铺(miscellaneous)
  4. import 何时使用 "" 和<> Objective-C
  5. 更改shell
  6. WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)
  7. 【Python】使用cmd模块构造一个带有后台线程的交互命令行界面
  8. nyoj-1103-区域赛系列一多边形划分
  9. Python基础篇 -- 运算符和编码
  10. Repbase library|divergence rate|self-sequence alignment|genomic rearrangement|cutoffs|breakpoint