Kubernetes中Calico节点就绪探针(readiness probe)失败,但手动执行探针命令返回成功的问题排查咨询
大家好,我最近碰到一个Kubernetes集群的诡异问题,想请教下各位:
我用kubeadm在同一局域网搭建了一个单控制平面节点+单工作节点的裸机集群,完成kubeadm init和kubeadm join后,通过Helm安装了Calico网络插件。现在发现calico-node和calico-kube-controllers的Pod一直无法进入就绪状态,但实际测试下来它们的功能是正常的——我手动执行探针的检测命令时,都能得到预期的成功响应。
从kubectl describe pod -n calico-system calico-node-xxxx的事件里看到的错误是:
Events:
Type Reason Age From MessageWarning Unhealthy 5s (x7 over 43s) kubelet Readiness probe errored: rpc error: code = Unknown desc = command error: EOF, stdout: , stderr: , exit code -1
这个calico-node Pod的探针配置是这样的:
readinessProbe: exec: command: - /bin/calico-node - -felix-ready failureThreshold: 3 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 livenessProbe: failureThreshold: 3 httpGet: host: localhost path: /liveness port: 9099 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 10
我手动测试了探针命令:
- 执行
kubectl exec -n calico-system calico-node-xxxx -- /bin/calico-node -felix-ready && echo "$?",得到的退出码是0,完全正常; - 执行
curl localhost:9099/liveness也能拿到200状态码和预期的响应内容。
更奇怪的是,哪怕是在Pod刚创建的1秒内执行这些命令,结果也是成功的,所以我觉得应该不是failureThreshold或者timeoutSeconds这些参数配置的问题。
我对kubelet执行exec类型探针的具体机制不太了解,会不会是kubelet的执行环境和我用kubectl exec进入Pod后的环境有什么差异?或者还有其他可能的原因导致这种探针失败但手动执行成功的情况?
麻烦各位帮忙分析下,谢谢!
备注:内容来源于stack exchange,提问作者zckl902

