1. 概述

Kubernetes 网络配置复杂,一旦出现 “no route to host” 错误,会导致集群内外的服务无法访问。该错误通常由网络配置错误或防火墙限制引起,排查过程需要对 Kubernetes 网络机制有一定理解。

快速定位并修复此类问题,有助于保障服务可用性,避免影响用户访问。本文将分析常见原因并提供实用排查与修复方法,帮助你在实际运维中快速应对。

2. 理解 “no route to host” 错误

“no route to host” 字面意思是系统无法找到通往目标服务的路径。可以类比为寄信时邮政系统找不到收件人地址。

在 Kubernetes 中,这种情况可能由以下原因造成:

  • 防火墙规则限制了访问
  • 网络策略配置错误
  • CNI 插件或 kube-proxy 异常
  • DNS 解析失败

3. 常见原因分析

3.1 网络策略配置错误

Kubernetes 网络策略(NetworkPolicy)控制 Pod 和服务之间的通信。若配置过于严格,可能会阻断正常流量。

✅ 检查点:

  • 是否设置了 ingress/egress 规则
  • 规则是否限制了源 IP 或端口
  • 是否遗漏了允许访问的标签选择器

3.2 防火墙或 iptables 配置问题

iptables 是 Linux 的网络流量控制工具,而 firewalld 是常见的防火墙管理工具。错误的 iptables 规则或未开放必要端口,会导致服务无法访问。

✅ 检查点:

  • 是否有 DROP 规则影响了流量
  • Kubernetes 所需端口是否开放(如 6443、30000-32767)
  • kube-proxy 是否能正常操作 iptables

3.3 服务网络配置错误

服务类型(ClusterIP、NodePort、LoadBalancer)决定了流量如何路由。若配置错误,可能导致服务无法访问。

✅ 检查点:

  • 服务的 selector 是否匹配后端 Pod 的标签
  • 端口配置是否正确(targetPort 与容器端口一致)
  • kube-proxy 是否运行正常

3.4 DNS 或 CNI 插件配置错误

Kubernetes 依赖 DNS 实现服务发现,CNI 插件(如 Calico、Flannel)负责 Pod 间通信。如果 DNS 或 CNI 插件配置错误,可能导致服务无法解析或通信失败。

✅ 检查点:

  • CoreDNS 是否正常运行
  • Pod 是否能解析服务名
  • CNI 插件 Pod 是否运行正常
  • Pod 间网络是否连通

4. 解决方案汇总

4.1 检查并修复网络策略

查看当前命名空间下的网络策略:

kubectl get networkpolicies -n <namespace>

查看具体策略内容:

kubectl describe networkpolicy <policy_name> -n <namespace>

确认 ingress 和 egress 规则是否允许目标流量。若发现限制过严的规则,应调整策略以允许必要访问。

4.2 清理并重置 iptables(谨慎操作)

若怀疑是 iptables 规则问题,可尝试清空规则:

iptables --flush
iptables -t nat --flush

⚠️ 注意:清空 iptables 会清除所有网络规则,务必提前备份:

iptables-save > /root/iptables-backup

清空后需重启 kube-proxy 或重新应用规则,确保 Kubernetes 网络恢复。

4.3 检查并开放防火墙端口

查看当前开放的端口:

firewall-cmd --list-ports

若服务所需端口未开放,例如 3000,可添加规则:

firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload

再次确认端口是否已开放:

firewall-cmd --list-ports

4.4 排查服务配置问题

查看服务状态:

kubectl get svc

查看服务详细信息:

kubectl describe svc <service_name>

重点关注:

  • selector 是否与 Pod 标签匹配
  • 端口配置是否正确(port、targetPort)
  • 是否有 Endpoints 列表

查看 kube-proxy 日志:

kubectl logs -n kube-system <kube-proxy-pod-name>

4.5 检查 DNS 与 CNI 插件状态

测试 DNS 解析:

nslookup kubernetes.default
dig kubernetes.default.svc.cluster.local

检查 CNI 插件 Pod 状态:

kubectl get pods -n kube-system

查看 CNI 插件日志:

kubectl logs <cni-pod-name> -n kube-system

确认插件是否正常运行,是否有报错信息。

5. 总结

本文分析了 Kubernetes 中 “no route to host” 错误的常见原因及排查方法,包括:

检查项 工具/命令 说明
网络策略 kubectl get networkpolicies 确认是否限制了必要流量
iptables iptables --flush 清理规则后重启网络组件
防火墙配置 firewall-cmd 开放必要端口
服务配置 kubectl describe svc 检查 selector 和端口
DNS 与 CNI 插件 nslookup, kubectl get pods 确保 DNS 解析和网络插件正常

遇到此类问题时,建议按步骤逐一排查,优先从网络策略、服务配置、DNS 和 CNI 插件入手,逐步缩小问题范围。

建议做法:

  • 定期检查网络策略和防火墙配置
  • 监控 kube-proxy 和 CNI 插件状态
  • 使用 kubectl describekubectl logs 快速定位问题

通过系统化的排查流程,可有效解决 “no route to host” 错误,保障集群服务稳定运行。


原始标题:Fixing Kubernetes Error “no route to host”