Linux上配置Kubernetes集群节点网络互通,核心是确保所有节点处于同一二层或路由可达的三层网络,开放6443、10250、2379–2380等关键端口,统一主机名与/etc/hosts映射,禁用SELinux、防火墙和swap,并启用网桥流量转发。

Linux 上配置 Kubernetes 集群节点网络互通,核心是确保所有节点之间能稳定通信、互相识别,并为后续 CNI 插件(如 Calico、Flannel)打下基础。这不是单纯“能 ping 通”就算完事,而是要满足 kubelet、etcd、API Server 等组件底层通信的真实需求。
确保基础网络连通性
所有节点(master 和 worker)必须处于同一二层网络,或路由可达的三层网络中,且不被中间设备(如防火墙、云安全组)拦截关键端口:
- 用
ping和telnet <目标IP> <端口>或nc -zv <IP> <端口>验证:各节点间能通 6443(API Server)、10250(kubelet)、2379–2380(etcd)、10257/10259(controller-manager/scheduler) - 云环境(如阿里云、腾讯云)务必检查安全组规则,放行上述端口;本地虚拟机需确认网卡模式(推荐桥接或 host-only + 手动路由)
- 避免使用 NAT 模式——它会导致节点获取到私有 IP(如 192.168.x.x),而 kubelet 广播的 NodeIP 不可被其他节点访问
统一主机名与 hosts 解析
Kubernetes 组件(尤其是 kubelet 和 etcd)依赖主机名做证书绑定和节点标识,DNS 不稳定时必须靠本地 hosts 显式映射:
- 每台节点执行
hostnamectl set-hostname <唯一短名>(如k8s-master、k8s-node1),重启后生效 - 所有节点同步写入
/etc/hosts,格式为:<节点真实IP> <hostname> <hostname>.local
例如:192.168.1.10 k8s-master k8s-master.local - 执行
hostname -f检查是否返回完整域名(FQDN),若报错或只返回短名,说明 hosts 或 DNS 配置未生效
关闭干扰服务与内核参数
SELinux、firewalld/ufw、swap 和内核桥接模块设置不当,会直接阻断 Pod 网络或 kube-proxy 规则下发:
- 禁用 SELinux:
setenforce 0+ 修改/etc/selinux/config中SELINUX=disabled - 停用并禁用防火墙:
systemctl stop firewalld && systemctl disable firewalld(CentOS/RHEL)或ufw disable(Ubuntu) - 永久关闭 swap:
swapoff -a+ 注释/etc/fstab中所有 swap 行 - 启用网桥流量转发:
cat > /etc/sysctl.d/k8s.conf <<EOF<br>net.bridge.bridge-nf-call-ip6tables = 1<br>net.bridge.bridge-nf-call-iptables = 1<br>EOF
然后运行sysctl --system
验证与常见卡点
完成上述配置后,在任意节点上执行以下检查:
-
ip route get <另一节点IP>—— 确认走的是物理网卡路径,而非 lo 或错误网关 -
ss -tlnp | grep ':6443\|:10250'—— 查看 master 的 API Server 和各节点 kubelet 是否监听在0.0.0.0或本机 IP,而非127.0.0.1 -
journalctl -u kubelet -n 50 --no-pager—— 若出现Unable to update node status或connection refused,大概率是网络不通或证书 hostname 不匹配 - 注意:kubeadm init 后生成的 join 命令里含 master 的 advertise-address,该地址必须是其他节点能直连的 IP(不能是 127.0.0.1 或 docker0 网卡地址)


















