k8s健康检查详解

最近在segmentfault上看到才云的一个人写的k8s健康检查readiness 和liveness的差别的分析,实际不忍直视。本来打算评论的。后来想想还是花点实际认真来说一下这个。当初自己对这个也有点糊涂。记录下来算是为后来的兄弟参考

readiness和liveness的核心区别

实际上readiness 和liveness 就如同字面意思。readiness 就是意思是否可以访问,liveness就是是否存活。如果一个readiness 为fail 的后果是把这个pod 的所有service 的endpoint里面的改pod ip 删掉,意思就这个pod对应的所有service都不会把请求转到这pod来了。但是如果liveness 检查结果是fail就会直接kill container,当然如果你的restart policy 是always 会重启pod。

什么样才叫readiness/liveness检测失败呢

实际上k8s提供了3中检测手段,

  • http get 返回200-400算成功,别的算失败
  • tcp socket 你指定的tcp端口打开,比如能telnet 上
  • cmd exec 在容器中执行一个命令 推出返回0 算成功。
    每中方式都可以定义在readiness 或者liveness 中。比如定义readiness 中http get 就是意思说如果我定义的这个path的http get 请求返回200-400以外的http code 就把我从所有有我的服务里面删了吧,如果定义在liveness里面就是把我kill 了。

什么时候用readiness 什么时候用readiness

比如如果一个http 服务你想一旦它访问有问题我就想重启容器。那你就定义个liveness 检测手段是http get。反之如果有问题我不想让它重启,只是想把它除名不要让请求到它这里来。就配置readiness。

注意,liveness不会重启pod,pod是否会重启由你的restart policy 控制。

关于health check 的k8s 官网链接
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

你可能感兴趣的:(k8s健康检查详解)