Flannel
‘社区提供的几个基本的CNI ,是对容器的网络最细粒度的配置,基于不同的linux网络虚拟化方式(vethpair、macvlan等),生成容器内的网卡,打通了节点和节点上的容器的网络,而要实现跨节点的容器之间的网络,有几种可能的办法:
容器的IP、node的IP都是同一个二层网络里分配的IP,这样容器相当于二层网络里的node,那么就可以直接二层互联; 容器的IP与node的IP不属于同一个网段,node上配置个到各个网段的路由(指向对应容器网段所部属的node IP),通过路由实现互访[flannel host-gw, calico bgp均是通过此方案实现]; 容器的IP与node的IP不属于同一个网段,node上有服务对容器发出的包进行封装,对发给容器的包进行解封。封装后的包通过node所在的网络进行传输。解封后的包通过网桥或路由直接发给容器,即overlay网络。[flannel udp/vxlan,calico ipip,openshift-sdn均通过此方案实现] 本文我们将介绍一下几个主流的集群网络方案。
flannel
flannel是一个简单的容器网络方案,基于一个名为flanneld的网桥,以及绑定在网桥上的vethpair作为节点上的容器网络架构,在flannel方案下,每个k8s node都支持一段cidr,node上的非hostNetwork的pod,必须属于这段cidr,并提供了几种方式,实现容器的跨节点互联:
host-gw ,将node的IP视为node上pod网段的网关。只要node彼此之间属于一个“二层”,那么容器访问另一个node上的对端容器时,直接找到对端node的网卡。对端node的网卡与对端容器的veth都绑在flanneld上,所以直接转发到对端容器。 udp/vxlan, flannel的overlay方案。每个node节点上都有一个flanneld进程,和flannel0网桥,容器网络会与flannel0网桥互联,并经由flannel0发出,所以flanneld可以捕获到容器发出的包进行封装。udp方案下会包装一个udp的头部,vxlan下会包装一个vxlan协议的头部(配置了相同VNI的node,就能进行互联)。封装后的包源IP为源node的IP,目标IP为对端node的IP,这个包可以直接经过node的网络到达对端。 如下图:
云厂商的vpc backends, flannel支持了aliVPC、gce、aws等云厂商的vpc网络。原理都是一样的,就是当flanneld在某云厂商的机器上运行时,根据机器自身的vpc网络IP,和flanneld分配在该机器上的cidr,调用云厂商的api创建对应的自定义路由。 flannel的部署非常简单,可以直接参考官方提供的模板 . 版本选择上,v0.10.0以后的版本均可,但还是建议使用最新版本。
flannel要求用户对集群的网段做好提前规划,否则,后续扩展会变得麻烦。在官方文档中,提供了一个范例:
{
"Network": "10.0.0.0/8",
"SubnetLen": 20,
"SubnetMin": "10.10.0.0",
"SubnetMax": "10.99.0.0",
"Backend": {
"Type": "udp",
"Port": 7890
}
}
我们建议,用户可以在部署集群时设置整个集群pod的网段为一个/16(这样集群能支持6w多个IP),SubnetLen决定了每个node的网段多大,我们建议设置为24(这样每个node可以分配256个IP,集群能支持256个node,理论上是绝对够的)。 用户可以基于自己预期的集群规模,在集群部署之初提出需求。 注意这个配置无法在集群交付后再做修改。