k8s Flannel 网络插件介绍

2019-03-08 0 By admin

Kubernetes的网络模型要求每一个Pod都拥有一个扁平化共享网络命名空间的IP,称为PodIP,Pod能够直接通过PodIP跨网络与其他物理机和Pod进行通信。
要实现Kubernetes的网络模型,需要在Kubernetes的集群中创建一个覆盖网络(Overlay Network),联通各个节点。可以通过第三方网络插件来创建覆盖网络,如Flannel 和Open vSwitch。
Flannel是CoreOS团队设计开发的一个覆盖网络工具。

一、概念说明

整个kubernetes架构中需要的基础服务有etcd数据存储服务,flannel扁平化网络服务,Docker 容器化服务。
1、etcd 服务负责维护共享数据,统一管理各节点的网络标识和子网编码。
2、flannel 服务会创建一块虚拟网卡,负责Docker容器服务与外网之间的路由。
3、Docker 容器服务创建一块虚拟网卡,负责容器(或者Pod)和flannel网卡通讯。

二、Flannel 服务详解

2.1、一种网络规划服务

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务。
简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得”同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

2.2、覆盖网络服务

Flannel实质上是一种”覆盖网络”(Overlay Network),即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息,而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。

2.3、Node 节点网络信息管理

Flannel 实施原理是每个主机配置一个ip段和子网个数。
例如,可以配置一个覆盖网络使用 10.100.0.0/16段,每个主机/24个子网。因此主机a可以接受10.100.5.0/24,主机B可以接受10.100.18.0/24的包。flannel使用etcd来维护分配的子网到实际的ip地址之间的映射。对于数据路径,flannel 使用udp来封装ip数据报,转发到远程主机。选择UDP作为转发协议是因为他能穿透防火墙。例如,AWS Classic无法转发IPoIP or GRE 网络包,是因为它的安全组仅仅支持TCP/UDP/ICMP。

2.4、网络信息存储和管理

flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。
etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。
为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。

 

容器跨node节点数据封装为UDP协议转发图示