一套 kubeadm 1.25 的三节点集群,Service 建好之后 curl 节点 IP 加 30080 一直是超时,Pod 自身 curl 通了,kubectl get svc 里的端口也对得上。

一开始怀疑是「kube-proxy 用了 ipvs 模式但 ipset 或 ip_vs 模块缺失,代理启动即退出」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。kube-proxy 的 DaemonSet 没有在对应节点上调度成功,节点上根本没有 iptables 规则。另一种情况是节点内核的 br_netfilter 没加载,bridge 流量不过 iptables,Service 规则被整体跳过。

少数情况下是节点上的 firewalld 把手写的 KUBE- 链清掉了,规则很快被覆盖。

动手时先确认每个节点上是否都有 kube-proxy

kubectl get pod -n kube-system -o wide | grep kube-proxy

然后看节点上有没有 Service 的转发规则

iptables -t nat -L KUBE-SERVICES -n | head -20

接着确认内核模块已加载

lsmod | grep -E 'br_netfilter|ip_vs'

剩下的就是重启 kube-proxy 并复测端口

kubectl -n kube-system rollout restart ds/kube-proxy && curl -s -o /dev/null -w '%{http_code}' http://10.0.0.9:30080

改完先别撤,确认这几项。curl 返回后端服务的状态码 200,iptables 的 KUBE-SERVICES 链里出现该 Service 的条目,各节点 kube-proxy 均为 Running。

装了 firewalld 的节点最容易出这个问题,它在 reload 时会把 kube-proxy 写的链丢掉;容器网段要不要豁免,最好在装集群之前就定下来。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189