Skip to content

RKE2 新增 master 节点失败:iptables 防火墙拦截 RKE2/Calico 端口

问题现象

在已有 RKE2 集群中新增 master(control-plane + etcd)节点时,rke2-server 服务不断重启,无法加入集群。

新增节点日志循环出现:

text
time="..." level=fatal msg="Error: preparing server: failed to bootstrap cluster data:
  failed to check if bootstrap data has been initialized:
  failed to validate token:
  failed to get CA certs:
  Get \"https://<现有master-ip>:9345/cacerts\":
  dial tcp <现有master-ip>:9345: connect: no route to host"

如果网络层通了但 token 没问题,etcd 加入后可能继续报错:

text
time="..." level=error msg="Failed to check local etcd status for learner management:
  rpc error: code = Unavailable desc = connection error: desc =
  \"transport: authentication handshake failed: context deadline exceeded\""

Calico 节点启动后也可能报:

text
Failed to connect to typha endpoint <现有master-ip>:5473. error=dial tcp <现有master-ip>:5473: connect: no route to host

环境信息

  • RKE2 版本:v1.35.6+rke2r1
  • 操作系统:Rocky Linux 9.8 (Blue Onyx)
  • CNI:Calico
  • 私有镜像仓库:192.168.122.156:30000
  • 涉及节点示例:
    • 现有 master:192.168.122.216rancher-ctrl-vm2
    • 新增 master:192.168.122.164rancher-ctrl-vm3
    • 新增 master:192.168.122.101rancher-ctrl-vm5

根因分析

Rocky Linux 9 虚拟机模板或初始化脚本预置了 iptables-nft-services,并在 /etc/sysconfig/iptables 中写入了一条默认拒绝所有入站流量、仅放行 22 端口的规则:

text
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
...
REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

RKE2 control-plane 节点之间需要开放的端口被全部拦截,导致:

  1. 新节点无法通过 9345 注册到现有 control-plane
  2. 新节点 etcd 无法通过 2380 与现有 etcd 建立 raft 连接
  3. Calico Felix 无法通过 5473 连接到 Typha
  4. kube-apiserver / kubelet / scheduler / controller-manager 健康检查端口也无法互通

排查步骤

1. 确认服务状态

在新增节点上:

bash
systemctl status rke2-server --no-pager -l
journalctl -u rke2-server --no-pager -n 100

2. 检查端口连通性

从新节点测试到现有 master 的 RKE2 端口:

bash
for port in 9345 6443 2379 2380 10250; do
  timeout 3 bash -c "</dev/tcp/<现有master-ip>/$port" >/dev/null 2>&1 && echo "$port open" || echo "$port blocked"
done

3. 检查防火墙规则

在两台节点上都执行:

bash
iptables -L INPUT -n -v --line-numbers

如果看到末尾有:

text
REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

而前面没有放行 RKE2 相关端口的 ACCEPT 规则,即可确认是防火墙问题。

4. 确认服务已监听端口

在现有 master 上:

bash
ss -tlnp | grep -E "9345|6443|2379|2380|10250|5473"

如果服务已监听但外部连不上,进一步确认是防火墙拦截。

修复方法

方案 A:在现有 master 和新节点上添加白名单规则(推荐)

所有 control-plane 节点上执行:

bash
# RKE2 控制面端口
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 9345 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 6443 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 2379 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 2380 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10250 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10257 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 10259 -j ACCEPT

# Calico 相关端口
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 9099 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p tcp --dport 5473 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p udp --dport 4789 -j ACCEPT
iptables -I INPUT -s 192.168.122.0/24 -p udp --dport 8472 -j ACCEPT

# 保存规则(Rocky Linux 9 通过 iptables.service 开机恢复)
iptables-save > /etc/sysconfig/iptables

注意:-s 192.168.122.0/24 限定为集群内网,可按实际网段调整。如果是公网环境或需要更严格的访问控制,请仅允许已知节点 IP。

方案 B:彻底关闭 iptables(仅测试/隔离环境)

bash
systemctl stop iptables.service
systemctl disable iptables.service

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

⚠️ 生产环境不建议关闭防火墙。

3. 重启新增节点 rke2-server

在新增节点上:

bash
systemctl restart rke2-server

然后观察日志:

bash
journalctl -u rke2-server -f

验证结果

节点状态

在现有 master 上执行:

bash
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes -o wide

预期输出:

text
NAME               STATUS   ROLES                       AGE   VERSION          INTERNAL-IP
rancher-ctrl-vm2   Ready    control-plane,etcd,worker   19h   v1.35.6+rke2r1   192.168.122.216
rancher-ctrl-vm3   Ready    control-plane,etcd,worker   5m    v1.35.6+rke2r1   192.168.122.164
rancher-ctrl-vm5   Ready    control-plane,etcd,worker   2m    v1.35.6+rke2r1   192.168.122.101

组件状态

bash
/var/lib/rancher/rke2/bin/kubectl get cs

预期输出:

text
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   ok

节点 Pod 状态

bash
/var/lib/rancher/rke2/bin/kubectl get pods -A --field-selector spec.nodeName=<新节点主机>

预期所有关键 Pod 为 1/1 Running

text
NAMESPACE       NAME                                       READY   STATUS
kube-system     etcd-xxx                                   1/1     Running
kube-system     kube-apiserver-xxx                         1/1     Running
kube-system     kube-controller-manager-xxx                1/1     Running
kube-system     kube-proxy-xxx                             1/1     Running
kube-system     kube-scheduler-xxx                         1/1     Running
calico-system   calico-node-xxx                            1/1     Running
kube-system     rke2-traefik-xxx                           1/1     Running

常见问题

Q: 为什么 ping 能通但 TCP 端口不通?

A: ping 使用 ICMP,而目标防火墙规则只放行 ICMP 和 22 端口,TCP 连接会被 REJECT 并返回 ICMP host-prohibited,所以出现 no route to host

Q: 为什么 rke2-server 已经 active (running) 了,外部还是连不上 9345?

A: 服务在监听不代表防火墙放行。ss -tlnp 能看到 *:9345 监听,但 INPUT 链的 REJECT 规则会阻止外部访问。

Q: 为什么 etcd 加入后还报 authentication handshake failed

A: 新节点 etcd 作为 learner 加入集群后,需要与现有 etcd 节点通过 2380 端口进行 peer TLS 握手。如果新节点或旧节点的 2380 被防火墙拦截,就会出现这个错误。

Q: Calico 节点为什么一直 0/1 Running?

A: Calico Felix 需要连接 Typha(端口 5473)。如果 Typha 所在节点没有放行 5473,Felix 就无法同步策略和路由信息,readiness probe 会持续 503。

预防措施

  1. 模板标准化:在制作 Rocky Linux 9 VM 模板时,不要预置 restrictive iptables 规则,或预置完整的 RKE2 端口白名单。
  2. 自动化配置:使用 Ansible / cloud-init 在节点初始化时统一写入 /etc/sysconfig/iptables 或切换到 firewalld 管理。
  3. firewalld 方案(更规范):
bash
dnf install -y firewalld
systemctl enable --now firewalld

firewall-cmd --permanent --add-port=9345/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379/tcp
firewall-cmd --permanent --add-port=2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10257/tcp
firewall-cmd --permanent --add-port=10259/tcp
firewall-cmd --permanent --add-port=5473/tcp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --reload
  1. 加入前检查:新增节点前,先用 bash -c '</dev/tcp/<ip>/<port>' 检查所有 RKE2 端口是否可达。

参考命令汇总

bash
# 查看服务状态
systemctl status rke2-server --no-pager -l

# 查看日志
journalctl -u rke2-server --no-pager -n 200

# 查看节点
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes -o wide

# 查看防火墙规则
iptables -L INPUT -n -v --line-numbers

# 保存防火墙规则
iptables-save > /etc/sysconfig/iptables

# 重启 rke2-server
systemctl restart rke2-server

# 扫描网段内 RKE2 supervisor
for i in $(seq 1 254); do
  ip="192.168.122.$i"
  timeout 1 bash -c "</dev/tcp/$ip/9345" >/dev/null 2>&1 && echo "$ip:9345 OPEN" &
done
wait

记录时间:2026-07-16
涉及版本:RKE2 v1.35.6+rke2r1, Rocky Linux 9.8