管理防火墙端口
每个节点的主机防火墙都已预配置平台所需的端口。您无需管理这些端口,也不应直接修改平台预配置的端口列表。
当工作负载需要开放额外的主机端口时(例如,某个组件直接在节点上侦听),您可以通过使用 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 列表更改为工作负载所需的端口。
-
创建一个
MachineConfig,用于安装一个在运行时开放端口的 oneshot 单元: -
配置节点中断策略,使此单元发生更改时重启该单元(重新运行
firewall-cmd),而不是重启节点。将open-app-ports.service条目添加到集群范围的MachineConfiguration单例cluster的nodeDisruptionPolicy.units列表中,并在应用MachineConfig之前确认该条目已反映在status.nodeDisruptionPolicyStatus中:
应用这两个对象后,该单元会在每个目标节点上开放端口,不会重新加载 firewalld,也不会重启节点;平台预配置的端口和其他组件的规则均保持不变。
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 或节点下次重启时才会重新添加。