k8s---flannel网络

简介

k8s的网络模型假定了所有的pod都在一个可以直接连通的扁平网络空间中,这在GCE里面是现成的网络模型,k8s假定这个网络已经存在;而在私有云环境里搭建k8s集群就不能假定这个网络已经存在,我们需要自己实现这个网络假设,将不同节点上的docker容器之间的互相访问先打通,然后运行k8s
目前已经有多种开源组件支持容器网络模型。例如;flannel 、openvswitch、直接路由和calico

flannel之所以搭建kubernetes依赖的底层网络,是因为它额能实现以下两点;

  1. 它能协助k8s,给每个node上的docker容器都分配互相不冲突的IP地址
  2. 它能在这些ip地址之间建立一个覆盖网络(overlay network),通过这个overlay网络,将数据包原封不动地传递到目标容器内

flannel的网络模式

模式 原理 性能
udp模式 使用设备flannel.0进行封包解包,不是内核原生支持,上下文切换较大,(已弃用) 性能非常差
vxlan模式 使用flannel.1进行封包解包,内核原生支持,(默认和推荐的模式) 性能较强
host-gw模式 无需flannel.1这样的中间设备,直接宿主机当作子网的下一跳地址,宿主机(host)充当了这条容器通信路径的“网关”(Gateway) 性能最强

工作原理讲解

flannel如何工作(以vxlan模式为例)

  1. 可以看到flannel首先创建了一个名为flannel0的网桥,而且这个网桥的一端连接docker0网桥,另一端连接一个叫作flanneld的服务进程
  2. flanneld进程上连etcd,利用etcd来管理可分配的ip地址段资源,同时监控etcd中每个pod的实际地址,并在内存中建立一个pod节点路由表;
  3. flanneld进程下连docker0和物理网络使用内存中的pod节点路由表,将docker0发给它的数据包包装起来,利用物理网络的连接将数据包投递到目标flanneld上,从而完成pod到pod之间的直接地址通信
  4. flannel之间的底层通信协议的可选技术包括UDP、Vxlan、AWS VPC等多种方式
  5. 通过源flanneld封包、目标flanneld解包,最终docker0收到的就是原始的数据包,对容器应用来说是透明的,感觉不到中间flannel的存在

flannel如何保证不通node上的pod分配ip不冲突

  1. flannel使用了集中的etcd存储,每次分配的地址段都在同一个公共区域获取,
  2. 在flannel分配好地址段后,后面的事情是由docker完成的flannel通过修改dockerd的启动参数将分配给它的地址段传进去;flannel把地址段给docker,每个docker的地址docker自己分
  3. 通过这些操作,flannel就控制了每个node上的docker0地址段的地址,也就保障了所有pod的ip地址在同一个水平网络中且不产生冲突了;
posted @ 2021-08-06 11:03  du-z  阅读(213)  评论(0编辑  收藏  举报