单节点上Pods存活与就绪探测失败问题排查求助
核心现象复盘
- 单Worker节点调度Pod后,HTTP存活/就绪探测失败,无法从节点内部或集群其他节点访问Pod IP、Service IP,对应Service的Endpoint未被填充
- 该节点上Calico、MetalLB Pod运行正常;Pod内部可正常访问外部网络,vxlan.calico接口存在双向流量;节点内核参数、加载模块与其他Worker节点一致
针对性排查步骤
一、Calico网络配置与Endpoint验证
检查节点Pod CIDR分配与Calico节点配置一致性
kubectl get node <异常节点名> -o jsonpath='{.spec.podCIDR}' calicoctl get node <异常节点名> -o yaml | grep -A10 -B5 "spec"确认Pod CIDR无冲突,Calico节点的
bgp/vxlan配置与正常节点完全匹配。查看异常节点上的Calico Endpoint状态
calicoctl get endpoint --node=<异常节点名> -o yaml对比正常节点的Endpoint,检查是否存在
status异常、ipNetworks配置错误,此类问题会直接导致Service Endpoint无法填充。验证Calico专用路由表规则
在异常节点执行:ip route show table calico-vxlan ip route show table calico-ipip确认Pod CIDR路由正确指向
vxlan.calico接口,下一跳配置与正常节点一致。
二、iptables转发规则与网络命名空间排查
检查Kubernetes核心iptables链完整性
iptables-save | grep -E "KUBE-SERVICES|KUBE-NODEPORTS|KUBE-PODS"对比正常节点,确保
KUBE-PODS链包含该节点Pod CIDR的转发规则,各链规则数量、内容无缺失。进入Pod网络命名空间验证入站流量
获取Pod的容器PID:kubectl get pod <异常Pod名> -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d'://' -f2 nsenter -t <PID> -n在命名空间内执行
tcpdump -i any port <探测端口>,同时从节点主机发起curl <Pod IP>:<探测端口>,观察是否有数据包进入命名空间:- 无数据包:节点到Pod的转发规则存在问题
- 有数据包但无响应:检查Pod内服务监听配置
三、策略路由与子接口冲突排查
检查策略路由优先级与规则范围
ip rule show ip route show table all确保Calico专用路由表(如
calico-vxlan)优先级高于自定义策略路由,且自定义路由未拦截Pod CIDR、Kubernetes Service CIDR的流量。验证子接口与VXLAN接口的邻居表
ip neigh show dev <子接口名> ip neigh show dev vxlan.calico确认
vxlan.calico接口的邻居条目正常,子接口ARP表无异常条目导致流量误转发。
四、Calico VXLAN隧道深层验证
检查VXLAN接口配置一致性
ip link show vxlan.calico确认VNI值(默认4096)、接口状态与正常节点一致。
生成Calico节点诊断报告
calicoctl node diags --node=<异常节点名>重点查看报告中
VXLAN connectivity部分,确认与集群其他节点的隧道连接状态。
五、Kubelet与CRI-O网络配置检查
验证kubelet Pod CIDR配置
cat /var/lib/kubelet/config.yaml | grep podCIDR确保kubelet使用的Pod CIDR与Calico分配的完全一致,无手动配置冲突。
检查CRI-O网络插件配置
cat /etc/crio/crio.conf | grep -A10 -B5 "network"确认CRI-O使用Calico CNI插件,配置路径与正常节点一致,无自定义CNI配置干扰。
内容的提问来源于stack exchange,提问作者mgcdrd

