探针是本机上 kubelet 执行去探测本机上的 Pod 的,分为启动(Startup,>=1.17)、存活(Liveness)和就绪(Readiness)探针,当探针不正常时候,也可以手动对本机 Pod 发对应请求模拟排查。
http 类型探针状态码要 200<= code < 400 ,一些应用如果没单独的 /health 免认证接口而出现 401 就会失败,并且 kubelet 的 http user-agent 为 kube-probe/v{version}。
启动一定要配置就绪探针,kubelet 执行就绪探针成功后,会 Update POD status.conditions[][@type=Ready].status=true 后,kube-proxy watch 到这个 event 才把 POD_IP 加入到 service 后面的 endpoint 里(否则滚动更新会 503),大多数人都配置的 http 探针,可能在一些老版本会遇到下面类似报错:
Readiness probe failed: Get "http://xxxx/health": context deadline exceeded (Client.Timeout exceeded while awaiting headers) |
该问题大部分是因为 kubelet http 探测是起新的连接而没复用连接造成(建议升级到 >=1.27),其他原因和详细信息见:
销毁Pod的流程:
如果 Pod 先退出,而 kube-proxy 晚摘掉 PodIP,则会有问题,所以需要 PreStopHook 来避免: