问题描述
按照网上安装 Rancher 教程,一般都要求先关闭防火墙,于是在关闭防火墙状态下完成安装。
systemctl stop firewalld
systemctl disable firewalld
但是由于公司安全要求,需要开启防火墙,并将 rancher 相关的端口进行开放,于是在 rancher 正常运行状态下启用防火墙。
systemctl start firewalld
systemctl enable firewalld
根据官方操作文档 点击查看 加入相关端口。
firewall-cmd --permanent --add-port 22/tcp
firewall-cmd --permanent --add-port 80/tcp
firewall-cmd --permanent --add-port 443/tcp
firewall-cmd --permanent --add-port 2379/tcp
firewall-cmd --permanent --add-port 2380/tcp
firewall-cmd --permanent --add-port 6443/tcp
firewall-cmd --permanent --add-port 6444/tcp
firewall-cmd --permanent --add-port 8443/tcp
firewall-cmd --permanent --add-port 8472/udp
firewall-cmd --permanent --add-port 9345/tcp
firewall-cmd --permanent --add-port 10249/tcp
firewall-cmd --permanent --add-port 10250/tcp
firewall-cmd --permanent --add-port 10256/tcp
firewall-cmd --permanent --add-port 30935/tcp
firewall-cmd --permanent --add-port 31477/tcp
firewall-cmd --reload
reload 之后 rancher 节点之间部分通信就异常了,一般提示为
10.xx.xx.xx:443 timeout
10.xx.xx.xx:443 no route to host
即集群节点与 rancher 主节点之间无法通信。
原因分析
firewalld 的相关操作本质上还是对 iptables 的规则操作;
docker 启动容器时也会直接操作 iptables 写入规则;
firewalld --reload 会刷新整个规则表,将 docker 写入的规则刷掉;
因此导致节点间无法访问。
解决方法
问题分析清楚了也就好解决了。
- 停止 docker 服务,防止写入新的规则
- 清空 iptables 规则列表
# 查看当前规则 iptables -L -n # 清空全部规则 iptables -F
- reload firewalld 服务,将 firewalld 配置的规则写入 iptables
# 查看 firewalld 当前规则 firewall-cmd --list-all # 刷新规则,写入 iptables firewall-cmd --reload
- 启动 docker 服务,让 docker 将相关规则写入 iptables
systemctl start docker
至此,所有规则已按顺序完全写入 iptables 中,互不影响,一切恢复正常。
注意事项
如果还是有节点间 10.42.xx.xx
或者 10.43.xx.xx
无法访问,可以加入以下规则:
# 这两行非常非常非常重要,没有的话后续会报错,Rancher 节点间无法通信
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
firewall-cmd --reload