这篇文章主要从以下两方面来快速了解kubernetes里的网络
- kubernetes中Pod 如何通过 flannel 进行通信
- 如何通过 flannel 来保证不同的节点上的ip 全局唯一
只是作简单快速介绍,不做详细展开,后面章节会对flannel 涉及到的网络相关的知识进行详细介绍
简介
Flannel 的主要功能是为了让集群中不同节点主机创建的Docker容器都具有全局唯一的虚拟ip。默认在Docker配置中,每个节点上的Docker服务会分别负责给所在节点的容器分配IP。这样会带一个问题,不同节点上容器可能获取相同的内外IP地址,并使这些容器之间不能够通过IP地址相互进行访问。
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。
Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发 。
Flannel架构

flannel 架构
Flannel 流程
- cni0网桥设备,每创建一个pod 都会创建一对veth pair ,其中一端是pod的eth0,另一端是cni0网桥中的端口(网卡),pod 从eth0的流量都会发送到cni端口上,cni0设备获取的是分配到本机的第一个IP
- flannel.1 overlay 网络的设备,用来进行vxlan的报文处理,不同node之间的POD数据流量都从overlay设备以隧道的形式发送到对端
- flannelId flannel会在每个主机运营flanneld作为agent,它会使主机在集群网络地址空间中获取一个小网段,本机内所有容器的IP地址都从中分配;同时flanneld会监听etcd,为flannel.1设备提供封装时必要的mac、ip等网络数据信息,flannel.1 是vxlan 设备,当数据包来到flannel.1的时候,需要将数据包封装起来,数据包封装需要知道目的ip的mac地址,这个时候,flannel.1 不会发送arp请求去获取目的ip的mac地址,而是由linux kernel 将一个“L3 Miss”事件请求发送到用户空间的flannelId进程,flannelId 程序收到内核的请求事件后,会从etcd 查找能够匹配该地址的子网flannel.1设备的mac地址,即发往pod所在host中flannel.1设置的mac地址。flannel 在为Node节点分配IP网段时记录了所有的网段和mac等信息
Node之间的POD通信流程
- pod中产生数据,根据pod的路由信息.将数据发送到cni0
- cni0根据节点的路由表,将数据发送到隧道设备flannel.1
- flannel.1查看数据包的目的IP,从flanneld获取对端隧道设备的信息,封装数据包
- flannel.1将数据发送给对端设备,对端节点的网卡接收到数据包,发现是overlay数据包,解开外层封装.并发送内层封装到flannel.1设备
- flannel.1查看数据包,根据路由表匹配,将数据发送给cni0设备
- cni0匹配路由表,发送数据给网桥上对应的端口
不同节点的ip段
- flannel 利用kubernetes API 通过 etcd 存储整个集群的网络配置,根据配置记录集群使用的网段
- flannel 在每个主机上安装 flannel 作为agent,它会为所在主机从集群的网络地址空间中获取一个小网段,本机内所有容器IP将从中分配本机存储: /run/flannel/subnet.env
FLANNEL_NETWORK=10.168.0.0/16 集群的网段
FLANNEL_SUBNET=10.168.2.1/24 # 当前节点的网段
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
总结
- 使集群中的不同Node主机创建的Docker容器都具有全局唯一的ip地址
- 建一个overlay网络,通过这个overlay网络,将数据包原封不动的传递到目标容器。overlay网络是建立在另一个网络之上并由其基础设施支持的虚拟网络,
- 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)
- etcd 保证了所有node 上flannel 所看到的配置是一致的,同时每个node上的flanned 监听etcd上的数据变化,实时感知集群中node的变化
共同进步
在你的工作中,有碰到过什么样的k8s相关有趣的问题呢?