K8s生产环境下启用防火墙
K8s生产环境下启用防火墙当初在安装K8s集群时,为了安装方便关闭了所有机器的防火墙,但是如果是生产环境,非常不安全,因此有了这篇文章。文章总结了在开启防火墙状态下,需要开放哪些端口,以及需要注意的点。准备服务器操作系统:Ubuntu 16.04防火墙命令:ufw集群:设置开放etcd集群所需端口2379(客户端监听)和2380(节点间内部通信)ufw ...
K8s生产环境下启用防火墙
当初在安装K8s集群时,为了安装方便关闭了所有机器的防火墙,但是如果是生产环境,非常不安全,因此有了这篇文章。文章总结了在开启防火墙状态下,需要开放哪些端口,以及需要注意的点。
准备
服务器操作系统:Ubuntu 16.04
防火墙命令:ufw
集群:
设置
开放etcd集群所需端口2379(客户端监听)和2380(节点间内部通信)
ufw allow 2379
ufw allow 2380
开放Master节点6443端口,kube-apiserver组件使用,Kubernetes API端口
ufw allow 6443
开放Node节点
开放LB节点8443端口,为VIP(虚拟IP)监听的服务端口,区别于默认的apiserver端口6443
ufw allow 8443
开启以上节点后,访问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/'
这是因为在安装K8s集群过程中,使用网络组件(这里是flannel)为集群中(Master和Node)的每个Pod虚拟了一个独立的IP。Pod中的所有容器共享同一个IP,通过端口来区分,Pod之间可以相互访问。上面的错误信息表示了各个服务器之间的虚拟IP段无法正常通信。
查看服务器路由信息
route -n
以下为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
在Master1上,再次ping Master2的虚拟IP段:172.20.1.0,查看日志内容
tail -n 10 /var/log/ufw.log
日志
DPT是数据包的目标端口,Master1向Master2的8472端口发送数据,也就是说我们需要再开放8472端口,注意要在所有Master和Node节点上执行。
小结
经测试,开启以下端口即可:
更多推荐
所有评论(0)