简述
当初在安装K8s集群时,为了安装方便关闭了所有机器的防火墙,但是如果是生产环境,非常不安全,因此有了这篇文章。文章总结了在开启防火墙状态下,需要开放哪些端口,以及需要注意的点。
准备
服务器操作系统:Ubuntu 16.04
防火墙命令:ufw
集群:
服务器角色 名称 ip
etcd etcd1、2、3 192.168.22.104、105、106
master master1、2 192.168.22.110、111
load balance lbMaster、lbBackup 192.168.22.102、103
node node1、2、3、4、5 192.168.22.107、108、109、141、142
设置
开放etcd集群所需端口2379(客户端监听)和2380(节点间内部通信)
ufw allow 2379
ufw allow 2380
1
2
开放Master节点6443端口,kube-apiserver组件使用,Kubernetes API端口
ufw allow 6443
1
开放Node节点
开放LB节点8443端口,为VIP(虚拟IP)监听的服务端口,区别于默认的apiserver端口6443
ufw allow 8443
1
开启以上节点后,访问Dashboard进行测试,会出现以下问题:
Error: 'read tcp 172.20.1.0:56922->172.20.6.74:8443: read: connection timed out'
Trying to reach: 'https://172.20.6.74:8443/'
1
2
这是因为在安装K8s集群过程中,使用网络组件(这里是flannel)为集群中(Master和Node)的每个Pod虚拟了一个独立的IP。Pod中的所有容器共享同一个IP,通过端口来区分,Pod之间可以相互访问。上面的错误信息表示了各个服务器之间的虚拟IP段无法正常通信。
查看服务器路由信息
route -n
1
以下为Master1、2的路由信息
在Master1上,ping不通Master2的虚拟IP段:172.20.1.0,这说明防火墙可能对flannel组件生效有影响,需要了解flannel工作原理才能找到问题所在。
Flannel实质上是一种“覆盖网络(overlay network)”,将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。
默认的节点间数据通信方式是UDP转发,源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,这意味着它们也是通过真实网络的某个端口进行通信的,我们需要开放Flannel使用的特定端口。
开启防火墙日志
ufw logging on
1
在Master1上,再次ping Master2的虚拟IP段:172.20.1.0,查看日志内容
tail -n 10 /var/log/ufw.log
1
日志
Jul 26 20:15:13 master02 kernel: [40620.949660] [UFW BLOCK] IN=ens160
OUT= MAC=00:50:56:ba:10:58:00:50:56:ba:55:f1:08:00 SRC=192.168.22.110 DST=192.168.22.111
LEN=134 TOS=0x00 PREC=0x00 TTL=64 ID=13122 PROTO=UDP SPT=57102 DPT=8472 LEN=114
1
2
3
DPT是数据包的目标端口,Master1向Master2的8472端口发送数据,也就是说我们需要再开放8472端口,注意要在所有Master和Node节点上执行。
ufw allow 8472
1
小结
经测试,开启以下端口即可:
服务器角色 端口
etcd 2379、2380
Master 6443、8472
Node 8472
LB 8443