AI大模型摘要

本文描述了一起Kubernetes集群中Service无法访问的故障排查过程。故障表现为Pod正常运行,但通过Service ClusterIP或DNS域名访问失败,直接访问Pod IP则正常。通过排查DNS和kube-proxy,发现问题出在kube-proxy的iptables转发规则缺失。进一步检查发现kube-proxy Pod日志有大量报错,原因是节点证书过期导致kube-proxy无法与API Server同步Service信息。通过重启kube-proxy和更新证书,问题得到临时恢复。根因分析指出kube-proxy与API Server通信异常和监控告警缺失是主要问题。最后,文章总结了处理类似问题的经验和建议。

Service 无法访问,Pod 正常,最终定位为 kube-proxy 规则异常

1. 背景

某生产集群的一个内部微服务突然出现访问失败,业务方反馈调用接口直接超时。初步现象:
  • • Pod 正常运行,没有 CrashLoopBackOff 或 Pending。
  • • 用 Service ClusterIP 或者 DNS 域名访问都失败,但 直接用 Pod IP 访问是通的

集群现象:

kubectl get pod -n order
order-service-7fcb5   1/1   Running   0     2d
kubectl get svc -n order
NAME            TYPE        CLUSTER-IP      PORT(S)
order-service   ClusterIP   10.96.180.200   8080/TCP

业务调用:

curl http://order-service.order.svc.cluster.local:8080/health
# 超时

但直接访问 Pod IP 正常:

curl http://10.244.2.15:8080/health
# 返回 200 OK

2. 第一步:缩小范围 - DNS 还是转发问题?

由于 Pod IP 访问正常,说明:

    1. 应用进程没问题。
    1. DNS 或 kube-proxy 可能有问题。

先用 <span leaf="">nslookup</span> 验证 DNS:

kubectl exec -it debug-pod -- nslookup order-service.order.svc.cluster.local

输出正常:

Name: order-service.order.svc.cluster.local
Address: 10.96.180.200

DNS 没问题 → 问题出在 kube-proxy / iptables 转发链路

3. 第二步:检查 Service & Endpoints

确认 Service 对应的 Endpoints 是否正常:

kubectl get endpoints order-service -n order -o wide

输出:

NAME            ENDPOINTS
order-service   10.244.2.15:8080

Endpoints 正常存在 → Service 和 Pod 的资源关系没问题。

4. 第三步:深入 kube-proxy 层

4.1 检查节点 iptables 规则

找到问题请求落在哪个节点:

kubectl get pod order-service-7fcb5 -o wide

假设 Pod 在节点 <span leaf="">node-3</span> 上,登录该节点:

iptables -t nat -L KUBE-SERVICES -n | grep 10.96.180.200

未找到任何匹配规则!

说明 kube-proxy 没有为该 Service 安装转发规则

4.2 检查 kube-proxy 状态

查看 kube-proxy Pod 日志(DaemonSet 部署):

kubectl logs kube-proxy-xxxx -n kube-system

发现大量报错:

Error syncing iptables: error checking rule: exit status 4

进一步确认节点 <span leaf="">/var/lib/kube-proxy/kubeconfig</span> 是否损坏,发现该节点证书过期,kube-proxy 一直无法与 API Server 同步 Service 信息。

5. 第四步:临时恢复 + 根因解决

5.1 临时恢复

    1. 手动重启节点上的 kube-proxy:
    systemctl restart kube-proxy
    1. 如果证书确实过期,先重新拉起 kube-proxy Pod 并手动触发证书刷新:
    kubeadm certs renew

重启后再查 iptables:

iptables -t nat -L KUBE-SERVICES -n | grep 10.96.180.200

转发规则恢复,Service 访问恢复正常。

6. 根因分析

    1. kube-proxy 与 API Server 通信异常
    • • 节点证书过期导致 kube-proxy 无法同步最新 Service/Endpoints。
    • • 已有 iptables 规则不会清理,但新建的 Service 不会安装规则。
    1. 监控与告警缺失
    • • kube-proxy 异常未被及时发现。
    • • 节点证书过期无告警。

7. 经验总结

    1. Service 正常、Pod 正常但访问失败 → 大概率是 kube-proxy 问题
    • • 检查 Endpoints:是否丢失?
    • • 检查 iptables/KUBE-SERVICES 规则是否存在?
    1. kube-proxy 异常场景常见原因
    • • 节点证书过期 / kubeconfig 损坏
    • • iptables 被其他组件误清理
    • • DaemonSet 崩溃 / 被意外驱逐
    1. 生产运维建议
    • • 针对 kube-proxy 状态、节点证书到期时间设置监控告警。
    • • 定期巡检节点 iptables 是否正常,避免 kube-proxy 无法安装规则导致大面积访问失败。
正文到此结束
最后修改:2025 年 08 月 01 日
如果觉得我的文章对你有用,请随意赞赏