温馨提示×

centos k8s部署要关防火墙吗

小樊
35
2026-07-09 14:32:51
栏目: 智能运维

简单直接的回答是:不需要完全关闭防火墙(firewalld),但必须配置防火墙规则以允许 Kubernetes 集群通信。

在 CentOS 上部署 Kubernetes(无论是生产环境还是测试环境),强烈建议不要直接执行 systemctl stop firewalld。正确的做法是配置防火墙,或者如果你是在内部测试环境且网络隔离良好,可以选择关闭,但生产环境绝对不推荐关闭。

以下是详细的操作建议和原因:

1. 为什么不能简单粗暴地关闭?

  • 安全性:防火墙是 Linux 系统安全的第一道防线。关闭防火墙意味着你的节点完全暴露在局域网甚至公网中,极易受到攻击。
  • 生产规范:生产环境必须遵循安全基线,关闭防火墙通常是不合规的。

2. 正确的做法:配置 Firewalld 规则

Kubernetes 需要大量的端口用于 Master 和 Node 之间的通信(API Server, Etcd, Kubelet, Calico/Flannel 等 CNI 插件)。

方案 A:信任 Kubernetes 网卡(推荐做法)

Kubernetes 通常会创建一个虚拟网卡(如 kube-bridgecni0)。你可以将 Kubernetes 使用的网段或网卡加入防火墙的“可信区域(trusted zone)”。

步骤:

  1. 启动并设置防火墙开机自启:

    systemctl enable firewalld
    systemctl start firewalld
    
  2. 将 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 
    
  3. 开放必要的端口(如果上述信任网段不够,或者你需要外部访问):

    • Master 节点常用端口:
      • 6443 (Kubernetes API server)
      • 2379-2380 (etcd server client API)
      • 10250 (Kubelet API)
      • 10251 (kube-scheduler)
      • 10252 (kube-controller-manager)
    • Node 节点常用端口:
      • 10250 (Kubelet API)
      • 30000-32767 (NodePort Services)

    示例(在 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
    
  4. 重新加载防火墙:

    firewall-cmd --reload
    

方案 B:直接关闭防火墙(仅限测试/本地虚拟机)

如果你只是在本地用 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

3. 关于 SELinux 的说明

在 CentOS 上部署 K8s,SELinux 往往比防火墙更麻烦。

  • 如果你使用的是较新的 Kubernetes 版本(1.22+)且文件系统驱动是 systemd,SELinux 通常可以保持开启。
  • 如果你遇到奇怪的权限问题(例如 Pod 无法挂载卷),通常建议将 SELinux 设置为 permissive(宽容模式)而不是完全关闭。

总结建议

场景 建议操作
生产环境 必须开启防火墙。配置 firewalld,将集群内部通信网段加入 trusted 区域,并精确开放 NodePort 等对外端口。
公司内网测试 建议开启防火墙并配置规则。如果嫌麻烦,可以关闭,但需确保内网安全。
本地虚拟机/个人学习 可以关闭防火墙 (systemctl disable firewalld) 和 SELinux,以便快速搭建成功,避免网络策略干扰。

一句话总结:不要关,配置它。 如果实在搞不定端口,至少用 firewall-cmd --zone=trusted --add-source=<对方节点IP> 来放行集群内部流量。

0