k8s的健康性检查-Health Check

1、k8s健康性检查的默认方式

k8s默认的健康检查机制:基于Dockerfile文件中的CMD或者ENTRYPOINT,如果进程退出时返回码为非零,则认为容器发生故障,k8s就会根据restartPolicy重启容器。

1)docker的restartPolicy有一下4种:

  1. always:(无论以什么码退出,docker daemon都会尝试重启退出的容器,手动停止后,策略不再生效);

  2. OnFailure:因出错停止的容器(非零退出)。可以max-retries指定最大尝试重启的限制次数;

  3. unless-stopped:与always类似,区别在于手动停止容器后,就算重启docker deemon,容器策略也不再生效。

  4. no:不自动重启(默认模式)

2)k8s中的格式

...
spec:
  restartPolicy: OnFailure   #重启策略
  containers:
...

3)缺陷

这种机制的缺点就是在于:有时候容器发生故障,但进程并未退出,如容器的内部web服务显示500,或者系统超载,但此时的httpd的进程并没有异常退出,所以就容器依然正常运行。简而言之就是无法判断容器内的服务释放正常。

2、Health Check-> liveness探测

1)liveness的目的

用户可以自定义判断容器是否健康为条件,如果探测失败,k8s就会重启容器,从而告诉k8s什么时候重启容器实现自愈。

2)livenessProbe的关键字

...
spec:
  containers:
  ...
  livenessProbe:           #Health Check的机制
httpGet:                   #探测方式:http的方式
path:/example/index.html   #默认的索引目录
port: 8080                 #服务的端口
scheme: http               #用到的协议
    initialDelaySeconds: 5 #容器启动10秒后开始执行liveness探测;若某个容器启动需要30秒,则这个值就要设置大于30秒
    periodSeconds: 10      #每次执行liveness探测的时间间隔
    failureThreshold: 3    #liveness探测失败的次数;如果连续三次失败,就会杀掉进程重启容器
    successThreshold: 1    #liveness探测成功的次数;如果成功1次,就表示容器正常
timeoutSeconds: 5          #执行livesness的超时时间,如果执行后5秒没有结果,则重启执行liveness

3、Health Check-> readness探测

1)readness的目的

Readness探测是告诉什么时候可以将容器加入到svc负载均衡池中,对外提供服务
Readness探测的配置语法和liveness完全一样

4、总结

  1. 若不特意配置liveness和readness,k8s则会采用默认的方式。即通过判断容器启动进程的返回值是否为零来判断探测是否成功。
  2. Livess和readness配置完全一样,语法和参数也一样,不同之处在于探测失败后的行为:livess探测是重启容器;而readness探测则是将容器设置为不可用,不接受service转发的请求
  3. Liveness和readness是独立执行的,二者之间没有依赖,可单独使用可同时使用:
    Liveness探测判断的是容器是否需要重启实现自愈
    Readness探测判断的是容器是否已准备好对外提供服务

5、Liveness和readness的探测手段方法

http Get:返回200-400算成功,别的算失败
在这里插入图片描述
tcp socket:你指定的tcp端口打开,比如能telnet 上
cmd exec:在容器中执行一个命令 推出返回0 算成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44729138/article/details/105863966