最近在segmentfault上看到才云的一個人寫的k8s健康檢查readiness 和liveness的差別的分析,實際不忍直視潮梯。本來打算評論的。后來想想還是花點實際認真來說一下這個矿卑。當初自己對這個也有點糊涂沃饶。記錄下來算是為后來的兄弟參考
readiness和liveness的核心區(qū)別
實際上readiness 和liveness 就如同字面意思。readiness 就是意思是否可以訪問琴昆,liveness就是是否存活馆揉。如果一個readiness 為fail 的后果是把這個pod 的所有service 的endpoint里面的改pod ip 刪掉,意思就這個pod對應(yīng)的所有service都不會把請求轉(zhuǎn)到這pod來了舷暮。但是如果liveness 檢查結(jié)果是fail就會直接kill container噩茄,當然如果你的restart policy 是always 會重啟pod。
什么樣才叫readiness/liveness檢測失敗呢
實際上k8s提供了3中檢測手段绩聘,
- http get 返回200-400算成功,別的算失敗
- tcp socket 你指定的tcp端口打開机杜,比如能telnet 上
- cmd exec 在容器中執(zhí)行一個命令 推出返回0 算成功衅谷。
每中方式都可以定義在readiness 或者liveness 中。比如定義readiness 中http get 就是意思說如果我定義的這個path的http get 請求返回200-400以外的http code 就把我從所有有我的服務(wù)里面刪了吧陡叠,如果定義在liveness里面就是把我kill 了。
什么時候用readiness 什么時候用readiness
比如如果一個http 服務(wù)你想一旦它訪問有問題我就想重啟容器枉阵。那你就定義個liveness 檢測手段是http get。反之如果有問題我不想讓它重啟侦厚,只是想把它除名不要讓請求到它這里來拙徽。就配置readiness。
注意想诅,liveness不會重啟pod岛心,pod是否會重啟由你的restart policy 控制。
關(guān)于health check 的k8s 官網(wǎng)鏈接
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/