k8s网络原理之flannel - 渡边彻 - 博客园

标签: | 发表时间:2021-07-23 17:03 | 作者:
出处:https://www.cnblogs.com

首先当你创建一个k8s集群后一般会存在三种IP分别是,Pod IP,Node IP,Cluster IP

其中一个Cluster IP之下包含多个Node IP,而一个Node IP之下又包含多个Pod IP,同一个Pod包含多个容器,这些容器的网络都在同一个命名空间,因此它们可以自由的通信,同一个Node包含多个Pod,这些Pod又通过veth pair技术与同一个cni网桥进行连接,通常这个cni网桥就是我们熟知的docker0网卡,这个是在你安装docker后就会创建在宿主机上的一个虚拟网卡,因此相同Node节点下的Pod又可以通过cni网桥进行通信。(这部分的知识我们在docker网络当中有详细的讲解,不了解的同学可以查看之前的微博。)

那么不同Node节点下的Pod又是如何进行通信的呢?本文重点要讲的flannel网络插件就是用来解决这个问题的。

一.在这里有必要先介绍一下flannel

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,他的作用就是实现Pod资源跨主机进行网络通信。
我们知道在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。
那么flannel可以让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址,使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

二.那么简单总结下flannel的作用有以下几点:

1.使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
2.建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
3.创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
4.etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。

三.flannel网络架构的IP地址规划

flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。
如测试环境中ip分配:
1.master节点

2.node1

3.node2


在flannel network中,因为每个K8s node节点的subnet各不重叠,没有交集,因此各节点下的每个pod也都会被分配唯一的ip地址。

四.flannel网络架构原理图

这里借用官网的原理图讲解下各组件的功能:
1.Cni0:网桥设备,每创建一个pod都会创建一对 veth pair。其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡)。Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上。

Cni0 设备获得的ip地址是该节点分配到的网段的第一个地址。

2.Flannel.1: overlay网络的设备,用来进行 vxlan 报文的处理(封包和解包)。不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。

3.Flanneld:flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。

不同node上的pod的通信流程:

pod中产生数据,根据pod的路由信息,将数据发送到Cni0虚拟网桥设备(docker0)
Cni0虚拟网桥设备根据node节点的路由表,将数据发送到隧道设备flannel.1
Flannel.1查看数据包的目的ip,从flanneld获得对端隧道设备的必要信息(node节点对应的Mac地址),并对数据包进行封装。
Flannel.1将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1设备。
Flannel.1设备查看数据包,根据目的node节点的路由表匹配规则,将数据发送给Cni0虚拟网桥设备。
Cni0虚拟网桥匹配Node节点路由表,将数据发送给网桥上对应的端口从而将数据传输给对应的目的pod。

不同node节点的pod的通信流程详解:

以不同node节点的Pod1 ping Pod3为例
1.pod1到cni0
首先Pod1与Pod3能够互相ping通

Ping包的dst ip 为192.20.1.43,根据路由匹配到最后一条路由表项,去往192.20.0.0/12的包都转发给192.20.0.1

192.20.0.1为cni0的ip地址

2.cni0到flannel1

根据最长匹配原则,匹配到图上的一条路由表项。去往192.20.1.0/24 网段的包,发送192.20.1.0网关,网关设备是flannel.1
3.源node节点flannel1对数据包进行封装处理并发到远端node节点的flannel1网络接口

flannel.1为vxlan设备,当数据包来到flannel.1时,需要将数据包封装起来。此时的dst ip 为192.20.1.43,src ip为192.20.0.51。数据包继续封装需要知道192.20.1.43 ip地址对应的mac地址。此时,flannel.1不会发送arp请求去获得192.20.1.42的mac地址,而是由Linux kernel将一个“L3 Miss”事件请求发送给用户空间的flanned程序。Flanned程序收到内核的请求事件之后,从etcd查找能够匹配该目的地址的子网的flannel.1设备的mac地址,即发往的pod所在host中flannel.1设备的mac地址。Flannel在为Node节点分配ip网段时记录了所有的网段和mac等信息,所以能够知道。交互流程如下图所示:

flanned将查询到的信息放入master node host的arp cache表中:

到这里,vxlan的内层数据包就完成了封装。格式是这样的:

4.目的node节点flannel1接收到数据包之后
Node节点的eth0网卡接收到vxlan设备包,kernal将识别出这是一个vxlan包,将包拆开之后转给节点上的flannel.1设备。这样数据包就从发送节点到达目的节点,flannel.1设备将接收到一个如下的数据包:

目的地址为192.20.1.43,flannel.1查找自己的路由表,根据路由表完成转发。

根据最长匹配原则,flannel.1将去往192.20.1.0/24的流量转发到cni0上去。
5.cni0到pod
cni0是一个虚拟网桥设备。当cni0拿到数据包之后,通过veth pair,将数据包发送给pod。
在node节点上通过arp解析可以开出,192.20.1.43的mac地址为 66:57:8e:3d:00:85

该地址为pod的网卡eth0的地址

在获知目的pod mac地址后,cni0会通过veth pair将数据包发到pod eth0网卡veth pair接口,至此不同node 节点的通信圆满结束。

总结:本文详细介绍了K8s如何通过cni网络插件flannel完成了不同node节点也就是跨主机pod的通信,这部分的知识对于k8s集群来说十分重要,希望可以方便大家的理解,并在今后的使用和运维当中游刃有余。

相关 [k8s 网络 原理] 推荐:

k8s网络原理之flannel - 渡边彻 - 博客园

- -
首先当你创建一个k8s集群后一般会存在三种IP分别是,Pod IP,Node IP,Cluster IP. (这部分的知识我们在docker网络当中有详细的讲解,不了解的同学可以查看之前的微博. 那么不同Node节点下的Pod又是如何进行通信的呢. 本文重点要讲的flannel网络插件就是用来解决这个问题的.

k8s网络之Flannel网络 - 金色旭光 - 博客园

- -
一、k8s网络之设计与实现. 二、k8s网络之Flannel网络. 三、k8s网络之Calico网络. Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址. 在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配.

使用kube-proxy让外部网络访问K8S service的ClusterIP

- - zzm
kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:. 修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改为KUBE_PROXY_ARGS=”–proxy-mode=userspace”.

K8S的SDN容器网络解决方案及其价值

- - SegmentFault 最新的文章
编者按:关于容器网络的解决方案业界已经有较多的讨论,笔者无意继续赘述. K8S及其网络模型体现了鲜明的解耦设计思想,采用SDN技术实现K8S容器网络,并与相应的生态组件形成SDN监管控一体化解决方案,可以更好地提高整个系统的运营水平,更有效地提升企业的核心竞争力. 本文拟抛砖引玉,从K8S的网络实现入手,重点阐述SDN在容器网络中的应用价值.

K8s网络插件flannel与calico - 小雨淅淅o0 - 博客园

- -
Kubernetes的网络通信问题:. 容器间通信: 即同一个Pod内多个容器间通信,通常使用loopback来实现. Pod间通信: K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另一个Pod-IP. Pod与Service通信: 即PodIP去访问ClusterIP,当然,clusterIP实际上是IPVS 或 iptables规则的虚拟IP,是没有TCP/IP协议栈支持的.

CentOS7 安装 K8S

- - 企业架构 - ITeye博客
前提:VirtualBox CentOS7. 物理机IP   192.168.18.8. 虚拟机1IP:192.168.18.100(VMaster master). 虚拟机2IP:192.168.18.101(VServer1 node1). 虚拟机3IP:192.168.18.102(VServer2 node2).

k8s 重置,更换网络插件_云深不知处的技术博客_51CTO博客

- -
在master节点删除flannel. 安装完毕后使用docker images 查看容器镜像可以看见如下以calico打头的镜像.

k8s docker集群搭建 - CSDN博客

- -
一、Kubernetes系列之介绍篇.     - 一次构建,到处运行. 2.什么是kubernetes.   首先,他是一个全新的基于容器技术的分布式架构领先方案. Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg). 在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性.

深入掌握K8S Pod - Yabea - 博客园

- -
K8S configmap介绍. Pod是k8s中最小的调度单元,包含了一个“根容器”和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的基本使用,但是为了更好的应用,你需要深入了解pod的配置、调度、升级和扩缩容等. pod包含一个或多个相对紧密耦合的容器,处于同一个pod中的容器共享同样的存储空间、IP地址和Port端口.

浅谈 k8s ingress controller 选型 - 知乎

- -
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云. 业余时间比较喜欢开源,现在是Apache APISIX PPMC. 今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容需要大家对 K8S 有一定的了解,下面是我的分享. 阅读本文需要熟悉以下基本概念:. 集群:是指容器运行所需云资源的集合,包含了若干台云服务器、负载均衡器等云资源.