kube-proxy 与 IPVS 故障:Service 有地址却无法访问

检查 Service、EndpointSlice、IPVS 规则和 conntrack,定位 Kubernetes 服务转发链路异常。

文章目录 · 4 节

Pod IP 可访问而 ClusterIP 不通,问题通常落在 Service 选择器、EndpointSlice 或节点转发规则。IPVS 模式下还需确认虚拟服务与真实服务器是否同步。

从对象关系开始

kubectl get svc api -n production -o yaml
kubectl get endpointslices -n production -l kubernetes.io/service-name=api -o wide
kubectl get pods -n production -l app=api --show-labels

确认端口、targetPort、协议和 Pod readiness。只有 Ready 的端点通常会进入转发规则,探针失败会表现为 Service 无后端。

检查故障节点

kubectl logs -n kube-system ds/kube-proxy --since=20m
ipvsadm -Ln
ip addr show kube-ipvs0
conntrack -S

比较正常节点与异常节点的 IPVS 表。规则缺失时检查 kube-proxy 配置、API watch、内核模块和同步错误;规则存在则继续检查路由、NetworkPolicy 和回程路径。

常见误区

  • 只测试 ClusterIP,不直接测试 Endpoint IP
  • 重启全部 kube-proxy,丢失单节点现场
  • 手工编辑 IPVS 规则,随后又被控制器覆盖
  • 忽略 externalTrafficPolicy 带来的本地端点要求

收尾清单

修复后从同节点 Pod、跨节点 Pod 和节点本机分别测试。持续监控 kube-proxy 同步错误、Service 无端点和 conntrack 使用率。