首先当你创建一个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网络原理之flannel的更多相关文章

  1. k8s网络原理

    https://blog.csdn.net/watermelonbig/article/details/80646988 k8s中,每个 Pod 都有一个独立的 IP 地址,所有 Pod 在一个网络空 ...

  2. k8s网络之Flannel网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...

  3. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...

  4. [转帖]calico网络原理及与flannel对比

    calico网络原理及与flannel对比 https://blog.csdn.net/ganpuzhong42/article/details/77853131 2017年09月05日 16:34: ...

  5. Docker、K8S网络工作原理

    一.Docker 网络模式 在讨论 Kubernetes 网络之前,让我们先来看一下 Docker 网络.Docker 采用插件化的网络模式,默认提供 bridge.host.none.overlay ...

  6. K8S(03)核心插件-Flannel网络插件

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...

  7. ASP.NET Core on K8S深入学习(11)K8S网络知多少

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Kubernetes网络模型 我们都知道Kubernetes作为容器编排引 ...

  8. 【Kubernetes】K8S 网络隔离 方案

    参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...

  9. k8s网络之Calico网络

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...

  10. k8s网络之设计与实现

    k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...

随机推荐

  1. EPAI手绘建模APP资源管理和模型编辑器2

    g) 矩形   图 26模型编辑器-矩形 i. 修改矩形的中心位置. ii. 修改矩形的长度和宽度. h) 正多边形 图 27模型编辑器-内接正多边形 图 28模型编辑器-外切正多边形 i. 修改正多 ...

  2. 【2023最新B站评论爬虫】用python爬取上千条哔哩哔哩评论

    目录 一.爬取目标 二.展示爬取结果 三.爬虫代码 四.同步视频 五.附完整源码 您好,我是@马哥python说,一枚10年程序猿. 一.爬取目标 之前,我分享过一些B站的爬虫: [Python爬虫案 ...

  3. 06. C语言指针

    [指针] C语言使用数据名调用数据,数据名相当于C语言的直接寻址,直接寻址只能调用固定数据,而指针是间接寻址,指针存储了另一个数据的地址,使用指针调用数据时首先取指针存储的内存地址,之后使用此地址调用 ...

  4. ansible(18)--ansible的selinux模块

    1. selinux模块 功能:管理远端主机的 SELINUX 防火墙: 主要参数如下: 参数 说明 state Selinux模式:enforcing.permissive.disabled pol ...

  5. Unity HDRP BentNormal的理解

    1.通过网上冲浪了解到,BentNormal可以解决间接环境高光漏光及间接漫反射光照漏光的问题. 这里的漏光是指间接光照部分没有考虑到模型自身的遮挡关系导致的漏光. 2.可以通过SD之类的软件烘焙Be ...

  6. 2022年官网下安装ZooKeeper最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 其他版本安装 构建工具(参考工具部署方式) 一.环境整合 构 ...

  7. OpenAirInterface,开源的 4G EPS 实现

    目录 文章目录 目录 前文列表 OSA OpenAirInterface OAI 的仿真 物理信道仿真 系统级仿真 OAI 的 SDR LTE 参考文档 前文列表 <USRP B210 软件定义 ...

  8. kubernetes 之dashboard

    部署 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recomme ...

  9. Java生成微信小程序码

    官网文档地址:获取小程序码 package test; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.cor ...

  10. 如何模拟HTTP请求并验证功能

    要模拟HTTP请求并验证功能,你可以使用Spring Boot提供的MockMvc工具,它允许我们在没有实际启动HTTP服务器的情况下测试Spring MVC控制器.以下是一个使用MockMvc进行H ...