主题
RKE2 Pod 无法访问 ClusterIP(no route to host):kube-ipvs0 接口 DOWN + iptables 默认 REJECT 规则
问题现象
单节点 RKE2 集群安装后,节点状态 Ready,但 kube-system 下多个 helm-install-rke2-* Pod 处于 CrashLoopBackOff,导致 ingress-nginx、metrics-server、snapshot-controller 等系统组件一直无法部署;calico-kube-controllers 持续重启,CoreDNS 就绪探针失败(0/1)。
相关 Pod 日志统一报错:
text
Error: INSTALLATION FAILED: cluster reachability check failed:
kubernetes cluster unreachable: Get "https://10.13.0.1:443/version":
dial tcp 10.13.0.1:443: connect: no route to host关键特征:Pod 无法访问 Kubernetes API 的 ClusterIP(10.13.0.1),但直接访问宿主机 IP(192.168.122.20:6443)正常(返回 401 Unauthorized,说明网络层连通)。
环境信息
- RKE2 版本:
v1.35.6+rke2r1 - 操作系统:Rocky Linux 9.8 (Blue Onyx)
- CNI:Calico
- kube-proxy:IPVS 模式(
kube-proxy-arg: ["proxy-mode=ipvs"]) - cluster-cidr:
10.12.0.0/16,service-cidr:10.13.0.0/16
根因分析
两个叠加问题共同导致 Pod → ClusterIP 不通:
根因一:kube-ipvs0 接口处于 DOWN 状态(主因)
IPVS 模式下,kube-proxy 将所有 ClusterIP 以 /32 形式绑定在 dummy 接口 kube-ipvs0 上。排查发现该接口为 DOWN:
text
3: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
inet 10.13.0.1/32 scope global kube-ipvs0接口 DOWN 时内核移除了对应的 local 路由。Pod 发往 ClusterIP 的报文到达宿主机后路由查找失败,宿主机回 ICMP host unreachable,客户端表现为 "no route to host"。宿主机本机访问正常(走 LOCAL_OUT 钩子被 IPVS 拦截),因此具有迷惑性。
根因二:iptables.service 默认 REJECT 规则(次因)
Rocky Linux 9 预置的 iptables.service 处于 enabled 状态,开机加载 /etc/sysconfig/iptables,在 INPUT / FORWARD 链末尾追加兜底规则:
text
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited该规则会 REJECT 掉未被 kube-proxy/Calico 显式放行的入站流量(icmp-host-prohibited 在客户端同样表现为 "No route to host"),FORWARD 链的 REJECT 还会阻断 Pod 出网流量。注意:本环境 firewalld 并未安装,问题完全由 iptables.service 引起。
排查步骤
bash
# 1. Pod 内分别测试 ClusterIP 与宿主机 IP,定位问题边界
kubectl -n kube-system exec <coredns-pod> -- wget -q -O- --no-check-certificate https://10.13.0.1:443/version # 失败:no route to host
kubectl -n kube-system exec <coredns-pod> -- wget -q -O- --no-check-certificate https://192.168.122.20:6443/version # 成功:401
# 2. 检查 IPVS 与 dummy 接口状态
ipvsadm -Ln | head # IPVS 规则正常(10.13.0.1:443 -> 192.168.122.20:6443)
ip a show kube-ipvs0 # state DOWN ← 根因一
# 3. 检查宿主机 iptables 兜底规则与服务状态
iptables -L INPUT -n -v | tail -3 # 末尾 REJECT icmp-host-prohibited ← 根因二
iptables -L FORWARD -n -v | tail -3
systemctl is-enabled iptables # enabled
cat /etc/sysconfig/iptables # 含 -A INPUT/-A FORWARD -j REJECT 行修复步骤
bash
# 1) 启用 IPVS dummy 接口(立即生效)
ip link set kube-ipvs0 up
# 2) 禁止 iptables.service 开机恢复默认 REJECT 规则(持久化)
systemctl disable iptables
# ⚠️ 不要 systemctl stop iptables:stop 会清空全部 iptables 规则,
# 包括 kube-proxy/Calico 实时维护的规则。
# 3) 删除兜底 REJECT 规则(立即生效)
iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited
# 4) 删除失败的 Pod 强制立即重试(CrashLoopBackOff 退避最长达 5 分钟)
kubectl -n kube-system delete pod helm-install-rke2-ingress-nginx-xxxxx \
helm-install-rke2-metrics-server-xxxxx helm-install-rke2-runtimeclasses-xxxxx \
helm-install-rke2-snapshot-controller-crd-xxxxx helm-install-rke2-snapshot-controller-xxxxx
kubectl -n calico-system delete pod calico-kube-controllers-xxxxx验证
- 5 个 helm-install Job 全部转为
Completed,8 个 HelmChartFAILED=False; - ingress-nginx、metrics-server、snapshot-controller、calico-kube-controllers 自动部署并就绪,CoreDNS 恢复 1/1 Ready;
- 从 Pod 内访问
https://10.13.0.1:443/version返回 401(连通正常); - 测试 Pod 通过集群 DNS(10.13.0.10)成功解析
kubernetes.default.svc.cluster.local。
加固建议
为防止 NetworkManager 干扰 CNI 相关接口(dummy/veth/VXLAN),建议部署:
ini
# /etc/NetworkManager/conf.d/99-rke2-unmanaged.conf
[keyfile]
unmanaged-devices=interface-name:kube-ipvs0;interface-name:cali*;interface-name:vxlan.calico;interface-name:tunl*然后 systemctl reload NetworkManager。已验证配置后重启 kube-proxy Pod,kube-ipvs0 保持 UP。
经验教训
- "no route to host" 不一定是路由问题:在 Rocky/RHEL 系系统上,优先检查
iptables.service的兜底 REJECT 规则(icmp-host-prohibited在客户端同样报此错误)。 - IPVS 模式排障必查
kube-ipvs0:ClusterIP 绑定在该 dummy 接口上,接口 DOWN 会导致所有 Pod 访问 ClusterIP 失败,而宿主机本机访问却正常。 - Pod 网络排障先划界:分别测试 Pod→宿主机 IP、Pod→ClusterIP、宿主机→ClusterIP,可快速区分 CNI、kube-proxy/IPVS、防火墙三类问题。