AWS EKS多容器Pod的Liveness和Readiness探针失败如何解决?
排查步骤
1. 优先删除hostPort配置
你的Deployment中给两个容器都配置了hostPort参数,该配置会将容器端口直接映射到节点宿主机的对应端口,会引发两类问题:
- 节点上如有其他进程占用80/6379端口,会导致端口冲突,CNI路由规则混乱
- kubelet发起的PodIP:80访问请求可能被错误路由到节点本地的其他服务,引发超时
先删除两个容器的hostPort配置,重新发布后验证探针状态。
2. 检查节点到Pod的网络访问权限
你手动验证时大多是从集群内其他Pod发起访问,而kubelet的探针是从节点宿主机的主IP发起请求,以下配置会拦截该类请求:
- 检查节点安全组入方向规则:是否允许节点所在的VPC网段访问Pod的80端口
- 检查集群NetworkPolicy规则:是否配置了仅允许Ingress/Service网段访问80端口,遗漏了节点IP段的放行规则
3. 补充探针Host头配置
如果你的Web应用配置了基于Host头的路由规则或者域名校验,kubelet默认发起的httpGet请求不带Host头,会被应用拒绝响应,可以给探针增加Host头配置:
livenessProbe: httpGet: path: / port: 80 httpHeaders: - name: Host value: 你的应用绑定的域名 readinessProbe: httpGet: path: / port: 80 httpHeaders: - name: Host value: 你的应用绑定的域名
4. 替换exec探针验证链路
可以临时将httpGet探针替换为exec类型探针,直接在容器内部发起访问,绕开节点到Pod的网络链路,定位问题范围:
livenessProbe: exec: command: - curl - http://127.0.0.1/ initialDelaySeconds: 90 periodSeconds: 20 timeoutSeconds: 5 readinessProbe: exec: command: - curl - http://127.0.0.1/ initialDelaySeconds: 90 periodSeconds: 10 timeoutSeconds: 5
如果exec探针运行正常,即可确认问题出在节点到Pod的网络链路,重点排查前两项配置即可。
5. 查看节点kubelet日志
如果上述排查都没有结果,可以登录Pod调度到的节点,查看kubelet运行日志,获取探针请求的详细错误信息,进一步定位根因。
内容的提问来源于stack exchange,提问作者gdakram
相关产品推荐
相关产品推荐

