沪ICP备2021032517号-1

Kubernetes中的网络---以flannel为例

  |   0 评论   |   0 浏览

我们知道Kubernetes集群内部存在三类IP,分别是:

  • Node IP:宿主机的IP地址
  • Pod IP:使用网络插件创建的IP(如flannel),使跨主机的Pod可以互通
  • Cluster IP:虚拟IP,通过iptables规则访问服务

Kubernetes集群每个节点配置完成后除了自带网卡、docker0网卡以外,都有以下网卡设备生成

Master

flannel 10.244.0.0/32   
    
cni 10.244.0.1/24  

veth

Node1

flannel 10.244.1.0/32   
    
cni 10.244.1.1/24  

veth

Node2

flannel 10.244.2.0/32   
    
cni 10.244.2.1/24  

veth

且每个节点分别都有以下路由生成

image.png

路由指明了:

往Node1 10.244.1.0/24 去的数据包都要从10.244.1.0经过 即从node1的flannel.1网卡经过

往Node2 10.244.2.0/24 去的数据包都要从10.244.2.0经过 即从node2的flannel.1网卡经过

当我们使用traceroute命令traceroute node节点的pod ip时可以看到其经过的节点

image.png

数据包经过node1的flannel后直接送到了pod


解析

Flannel是作为一个二进制文件的方式部署在每个node上,主要实现两个功能:

  • 为每个node分配subnet,容器将自动从该子网中获取IP地址
  • 当有node加入到网络中时,为每个node增加路由配置

下面是使用flannel网络架构图

注意:以下IP非本示例中的IP,但是不影响读者理解。

image.png

image.png

flannel默认使用UDP作为集群间通讯实现,如上图所示,Flannel通过ETCD管理整个集群中所有节点与子网的映射关系,如上图所示,Flannel分别为节点A和B划分了两个子网:172.16.57.0/16和172.16.99.0/16。同时通过修改docker启动参数,确保Docker启动的容器能够特定的网段中如172.16.57.0/24

  • 同一Pod实例容器间通信:对于Pod而言,其可以包含1~n个容器实例,这些容器实例共享Pod的存储以及网络资源,Pod直接可以直接通过127.0.0.1进行通讯。其通过Linux的Network Namespace为这组容器实现了一个隔离网络。

  • 相同主机上Pod间通信:对于Pod而言,每一个Pod实例都有一个独立的Pod IP,该IP是挂载到虚拟网卡(VETH)上,并且bridge到docker0的网卡上。以节点A为例,其节点上运行的Pod均在10.1.15.1/24的网段中,其属于相同网络,因此直接通过docker0进行通信。

  • 对于跨节点间的Pod通信:以节点A和节点B通讯而言,由于不同节点docker0网卡的网段并不相同,因此flannel通过主机路由表的方式,将对节点B POD IP网段地址的访问路由到flannel0的网卡上。 而flannel0网卡的背后运行的则是flannel在每个节点上运行的进程flanneld。由于flannel通过ETCD维护了节点间所有网络的路由关系,原本容器将的数据报文,被flanneld封装成UDP协议,发送到了目标节点的flanneld进程,再对udp报文进行解包,后将数据发送到docker0,从而实现跨主机的Pod通讯.


标题:Kubernetes中的网络---以flannel为例
作者:zifuy
地址:https://www.zifuy.cn/articles/2019/10/08/1570536675240.html