管理防火墙端口

每个节点的主机防火墙都已预配置平台所需的端口。您无需管理这些端口,也不应直接修改平台预配置的端口列表。

当工作负载需要开放额外的主机端口时(例如,某个组件直接在节点上侦听),您可以通过使用 MachineConfig 对象安装一个小型 systemd 单元来开放端口。该单元会在运行时通过 firewall-cmd --add-port 开放端口,同时保留平台预配置的端口不变。

为什么使用运行时单元,而不是重新加载 Firewalld

重新加载或重启 firewalld(firewall-cmd --reload、systemctl restart firewalld)会从头重建主机防火墙。在集群节点上,这可能会丢弃其他组件直接配置的数据包过滤规则,例如 Istio 的流量重定向规则、kube-proxy 或 CNI 规则,从而导致间歇性连接中断。为避免这种情况,此操作步骤绝不会重新加载或重启 firewalld。

相反,一个 oneshot systemd 单元会通过 firewall-cmd --add-port 将端口添加到正在运行的 firewalld 中。此操作只会添加规则,不会清除任何内容。该单元的启动顺序位于 firewalld 之后,并声明为 PartOf=firewalld.service,因此如果 firewalld 重启,该单元会再次运行并重新添加端口(运行时 --add-port 本身不会在 firewalld 重启后保留)。

开放其他端口

以下示例会开放 TCP 端口 9141(ZooKeeper)和 9308(cpaas-kafka),这两个端口是日志堆栈常用的端口。请将 --add-port 列表更改为工作负载所需的端口。

  1. 创建一个 MachineConfig,用于安装一个在运行时开放端口的 oneshot 单元:

    apiVersion: machineconfiguration.alauda.io/v1alpha1
    kind: MachineConfig
    metadata:
      name: 99-worker-firewall-ports
      labels:
        machineconfiguration.alauda.io/role: worker
    spec:
      config:
        ignition:
          version: 3.4.0
        systemd:
          units:
            - name: open-app-ports.service
              enabled: true
              contents: |
                [Unit]
                Description=Open firewalld ports for workloads (runtime add-port, no reload)
                After=firewalld.service
                Requires=firewalld.service
                PartOf=firewalld.service
    
                [Service]
                Type=oneshot
                RemainAfterExit=yes
                ExecStart=/usr/bin/firewall-cmd --add-port=9141/tcp --add-port=9308/tcp
    
                [Install]
                WantedBy=multi-user.target
  2. 配置节点中断策略,使此单元发生更改时重启该单元(重新运行 firewall-cmd),而不是重启节点。将 open-app-ports.service 条目添加到集群范围的 MachineConfiguration 单例 cluster 的 nodeDisruptionPolicy.units 列表中,并在应用 MachineConfig 之前确认该条目已反映在 status.nodeDisruptionPolicyStatus 中:

    apiVersion: machineconfiguration.alauda.io/v1alpha1
    kind: MachineConfiguration
    metadata:
      name: cluster
    spec:
      nodeDisruptionPolicy:
        units:
          - name: open-app-ports.service
            actions:
              - type: DaemonReload
              - type: Restart
                restart:
                  serviceName: open-app-ports.service
        sshkey:
          actions:
            - type: None

应用这两个对象后,该单元会在每个目标节点上开放端口,不会重新加载 firewalld,也不会重启节点;平台预配置的端口和其他组件的规则均保持不变。

WARNING

cluster 对象是单例,可能已包含其他单元或文件策略。请将 open-app-ports.service 添加到现有的 nodeDisruptionPolicy.units 列表中,而不是替换整个策略。此处未列出的受管单元将回退到单元的默认操作;单元发生更改时,该操作会重启节点。

更改或移除端口

  • 要添加端口,请扩展单元中的 --add-port 列表,然后重新应用 MachineConfig。节点中断策略会重启该单元,并在运行时添加新端口。
  • 要移除端口,仅从 --add-port 列表中删除端口还不够:firewall-cmd --add-port 只会添加端口,因此运行时已开放的端口会一直保持开放,直到 firewalld 重启。请从单元中移除该端口,然后在受影响的节点上重启 firewalld,或重启这些节点,以关闭该端口。

注意事项

  • 端口会添加到 firewalld 的默认区域。如果相关接口绑定到非默认区域,请将 --zone=<zone> 添加到 firewall-cmd 命令中。
  • firewall-cmd --add-port 具有幂等性:重新添加已开放的端口会返回警告,但仍会成功,因此可以安全地重新运行 oneshot 单元。
  • 该单元要求 firewalld 正在运行。在不运行主机 firewalld 的节点上,该单元不会启动,也不会开放任何端口。
  • 运行时 --add-port 不会写入 firewalld 的永久配置。如果 firewalld 在单元外部重新加载(firewall-cmd --reload),这些端口会被关闭,并且只有在 firewalld 或节点下次重启时才会重新添加。