简单直接的回答是:不需要完全关闭防火墙(firewalld),但必须配置防火墙规则以允许 Kubernetes 集群通信。
在 CentOS 上部署 Kubernetes(无论是生产环境还是测试环境),强烈建议不要直接执行 systemctl stop firewalld。正确的做法是配置防火墙,或者如果你是在内部测试环境且网络隔离良好,可以选择关闭,但生产环境绝对不推荐关闭。
以下是详细的操作建议和原因:
Kubernetes 需要大量的端口用于 Master 和 Node 之间的通信(API Server, Etcd, Kubelet, Calico/Flannel 等 CNI 插件)。
Kubernetes 通常会创建一个虚拟网卡(如 kube-bridge 或 cni0)。你可以将 Kubernetes 使用的网段或网卡加入防火墙的“可信区域(trusted zone)”。
步骤:
启动并设置防火墙开机自启:
systemctl enable firewalld
systemctl start firewalld
将 Kubernetes 集群网段和 Pod 网段加入信任区域(假设你的 Service CIDR 是 10.96.0.0/12,Pod CIDR 是 10.244.0.0/16,请根据你的实际情况修改):
# 添加源网段到 trusted 区域
firewall-cmd --permanent --zone=trusted --add-source=10.96.0.0/12
firewall-cmd --permanent --zone=trusted --add-source=10.244.0.0/16
# 如果有多个节点,通常也需要信任对方节点的物理IP段,或者简单点信任整个内网段
# firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24
开放必要的端口(如果上述信任网段不够,或者你需要外部访问):
示例(在 Master 上开放 API Server):
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
重新加载防火墙:
firewall-cmd --reload
如果你只是在本地用 VMware/VirtualBox 搭建测试环境,且网络是 NAT 或仅主机模式,为了省事,可以关闭。
systemctl stop firewalld
systemctl disable firewalld
注意:如果用这种方式,记得也要关闭 SELinux(虽然 K8s 1.20+ 已经开始支持 SELinux,但很多教程为了简化仍建议关闭):
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
在 CentOS 上部署 K8s,SELinux 往往比防火墙更麻烦。
systemd,SELinux 通常可以保持开启。permissive(宽容模式)而不是完全关闭。| 场景 | 建议操作 |
|---|---|
| 生产环境 | 必须开启防火墙。配置 firewalld,将集群内部通信网段加入 trusted 区域,并精确开放 NodePort 等对外端口。 |
| 公司内网测试 | 建议开启防火墙并配置规则。如果嫌麻烦,可以关闭,但需确保内网安全。 |
| 本地虚拟机/个人学习 | 可以关闭防火墙 (systemctl disable firewalld) 和 SELinux,以便快速搭建成功,避免网络策略干扰。 |
一句话总结:不要关,配置它。 如果实在搞不定端口,至少用 firewall-cmd --zone=trusted --add-source=<对方节点IP> 来放行集群内部流量。