在默认情况下,kubespray会使用默认路由的网卡作为集群节点的IP。如果没有特别留意的情况下,业务网卡192是默认路由,导致k8s集群搭建后使用业务网卡作为集群节点IP
如果后续需要加入新的worker节点,且节点只有188网段网卡,就需要进行调整
否则kubelet按kubelet.conf连192段的apiserver就会失败(kubelet 校验 apiserver 证书时,按 kubeconfig 里 server 的地址对 SAN)
关于iptables相关知识回顾:https://akemi.zj.cn/2026/02/11/Linux-iptables/
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 本机进程访问 192.168.130.30:6443 | | OUTPUT 链 DNAT v 目的地址被改成 10.0.0.30:6443 | | POSTROUTING 链 MASQUERADE v 源地址被改成出口网卡地址 | v 请求发往 10.0.0.30:6443
此时主机觉得自己是在往192.168.130.30发数据
|
iptables目的地址转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #!/bin/bash # 补全 PATH 环境变量,防止 systemd 找不到 iptables 命令 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 定义映射结构:"私网IP:公网IP:端口列表(空格分隔)" MAPPINGS=( "192.168.130.30:10.0.0.30:6443" )
for entry in "${MAPPINGS[@]}"; do # 解析出私网IP、公网IP、端口列表 SRC_IP=$(echo "$entry" | cut -d':' -f1) DST_IP=$(echo "$entry" | cut -d':' -f2) PORTS=$(echo "$entry" | cut -d':' -f3)
# 循环配置该 IP 下指定的各个端口 for PORT in $PORTS; do # 检查并添加 OUTPUT DNAT 规则 iptables -t nat -C OUTPUT -d "${SRC_IP}/32" -p tcp --dport "$PORT" -j DNAT --to-destination "${DST_IP}:${PORT}" 2>/dev/null \ || iptables -t nat -A OUTPUT -d "${SRC_IP}/32" -p tcp --dport "$PORT" -j DNAT --to-destination "${DST_IP}:${PORT}"
# 检查并添加 POSTROUTING MASQUERADE 规则 iptables -t nat -C POSTROUTING -d "${DST_IP}/32" -p tcp --dport "$PORT" -j MASQUERADE 2>/dev/null \ || iptables -t nat -A POSTROUTING -d "${DST_IP}/32" -p tcp --dport "$PORT" -j MASQUERADE done done
# 旧式执行方法(临时手段)
# service iptables save # iptables -t nat -I OUTPUT 1 -d 10.96.0.1/32 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.30:6443 # iptables -t nat -I PREROUTING 1 -d 10.96.0.1/32 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.30:6443
# iptables -t nat -A OUTPUT -p tcp -d 192.168.130.5 --dport 5473 -j DNAT --to-destination 10.0.0.5:5473 # iptables -t nat -A POSTROUTING -d 10.0.0.5 -p tcp --dport 5473 -j MASQUERADE
... 不展开
|
通过systemd持久化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat /etc/systemd/system/iptables-apiserver.service [Unit] Description=Custom iptables NAT Rules After=network-online.target Wants=network-online.target
[Service] Type=oneshot ExecStart=/data/yunwei/iptables-apiserver.sh RemainAfterExit=yes
[Install] WantedBy=multi-user.target systemctl daemon-reload systemctl enable iptables-apiserver --now
|