首页 > 技术文章 > k8s的健康性检查-Health Check

tsaiccj 2021-08-31 09:54 原文

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

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

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

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

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 算成功。

 

推荐阅读