本文已参与「新人创作礼」活动,一起开启掘金创作之路。
作者按:
K8s中的网络还是较为复杂的,作为运维人员熟练掌握还是有一定难度的,但是又不得不掌握,所以今天就来研究一番。
1、关于网络插件
说起k8s网络不得不说CNI(container network interface·)网络容器接口,这是一种网络标准设计,是由谷歌和coreos联合制定的一种网络标准,这个就是实现k8s网络插件的基础,常用的如下图,这种标准,不管创建还是销毁容器,都可以轻松配置网络。
图源自infoq作者溪恒,仅用于学习
2、关于docker网络,以及插件flannel/calico
目前实际运用中最流行的CNI插件为flannel和calico这两款,这俩插件可以满足k8s的网络要求,也能为集群管理者提供特定的网络功能。
Docker为容器默认配置以下网络:
None:这就是将容器添加到没有连接的只在于容器的网络堆栈
Host:添加到主机的网络堆栈,不隔离
默认:默认网络模式,容器可以通过ip地址相互连接
自定义:用户定义网桥网络
在看具体网络插件之前看一看常见的术语:
第二层网络:OSI网络模型的数据链路层,处理网络上两个相邻节点的帧传递,mac地址为子层
第三层网络:OSI网络模型中的网络层,主要关注在二层网络主机之间路由的数据包,ipv4\ipv6\ICMP是第三层网络协议的示例
VXLAN:用于将二层以太网帧封装在UDP数据包中帮助云部署扩展,VXLAN虚拟化类似于VLAN,但比VLAN提供了更强大灵活性和功能。
Overlay:是现有网络上构建的虚拟逻辑网络,通常用于提供现有网络的抽象,能够分离和保护不同逻辑网络。
网状网络:每个节点连接到许多其他通过路由的节点进行协作,实现更大连接性网络,
BGP:管理数据包在边缘路由器之间的路由方式,通过考虑可用路径、路由规则和特定网络策略,帮助确定如何将数据包从一个网络发到另一个网络域。
3、Flannel
由CoreoSk开发的一个项目,很多部署工具或者k8s的发行版都是默认安装,flannel是可以用集群现有的etcd,利用api方式存储自身状态信息,不需要专门的数据存储,是配置第三层的ipv4 Overlay网络,在此网络内,每个节点一个子网,用于分配ip地址,配置pod时候,节点上的网桥接口会为每个新容器分配一个地址,同一主机中的pod可以使用网桥通信,不同主机的pod流量封装在udp数据包中,路由到目的地。
Flannel通过每个节点上启动一个flnnel的进程,负责给每一个节点上的子网划分、将子网网段等信息保存至etcd,具体的报文转发是后端实现,在启动时可以通过配置文件指定不同的后端进行通信,目前有UDP、VXLAN、host-gatway三种,VXLAN是官方推荐,因为性能良好,不需人工干预。UDP、VXLAN是基于三层网络即可实现,host-gatway模式需要集群所有机器都在同一个广播域、就是需要在二层网络在同一个交换机下才能实现,host-gateway用于对网络性能要求较高的常见,需要基础网络架构支持,UDP用于测试或者不支持VXLAN的linux内核。反正一般小规模集群是完全够用的,直到很多功能无法提供时在考虑其他插件。
图来自甲骨文开发社区,仅供学习
4、calico
虽然falnnel很好,但是calico因为其性能、灵活性都好而备受欢迎,calico的功能更加全面,不但具有提供主机和pod间网络通信的功能,还有网络安全和管理的功能,而且在CNI框架之内封装了calico的功能,calico还能与服务网络技术Istio集成,不但能够更加清楚的看到网络架构也能进行灵活的网络策略的配置,calico不使用Overlay网络,配置在第三层网络,使用BGP路由协议在主机之间路由数据包,意味着不需要包装额外的封装层。主要点在网络策略配置这一点,可以提高安全性和网络环境的控制。
模式:IPIP模式,基于ip层的网桥,普通的网桥是基于mac层,不需要ip,而这个模式通过两端路由做一个tunnel隧道,把不通的网络弄通
BGP边界网关(border gateway protocol):去中心化的自制路由协议,不使用传统的内部网关协议
Router reflector:路由反射,维护网络默认是node to node fullmesh 随着集群扩大,会形成一个巨大的服务网格,连接数增加,需要RR模式解决
如果集群规模较大,选择calico没错,当然calico提供长期支持,对于一次配置长期使用的目的来说,是个很好的选择:
5、其他插件
Canal,集成flannel的网络模式和calico的网络策略,感兴趣可以尝试。
Weave,是每个节点之间创建网状网,灵活路由,具有智能路由的特点。
至此,对与K8s网络插件有一个大致的了解,对与CNI标准希各种插件,是百花齐放,多样选择,找到合适自己的才是最重要的。祝学习顺利!