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节点上执行。

小结

经测试,开启以下端口即可:

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐