[Kubernetes]谈谈容器跨主机网络

2023-11-17

继上篇文章:[Kubernetes]浅谈容器网络,自己给自己挖的坑,这篇文章来谈谈容器跨主机网络.
要理解容器"跨主通信"的原理,就要来谈谈 Flannel 这个项目.
Flannel 项目是 CoreOS 公司主推的容器网络方案.提供容器网络功能的,分别是: VXLAN , host-gw , UDP .
这三种不同的实现,代表了三种容器跨主机网络的主流实现方法.这里主要讲 VXLAN 和 UDP 模式.
先从 UDP 模式讲起.

  • 假设,我有两台宿主机:
    • 宿主机 Node 1 上有一个容器 container-1 ,它的 IP 地址是 100.96.1.2 ,对应的 docker0 网桥的地址是: 100.96.1.1/24
    • 宿主机 Node 2 上有一个 container-2 , 它的 IP 地址是 100.96.2.3 ,对应的 docker0 网桥的地址是: 100.96.2.1/24
  • 我们现在的任务,就是让 container-1 访问 container-2 .
    这种情况下, container-1 容器里的进程发起的 IP 包,其源地址就是 100.96.1.2 , 目的地址就是 100.96.2.3 .由于目的地址 100.96.2.3 并不在 Node 1 的 docker0 网桥的网段里,所以这个 IP 包会被交给默认路由规则,通过容器的网关进入 docker0 网桥,从而出现在宿主机上.
    这时候,这个 IP 包的下一个目的地,就取决于宿主机上的路由规则了.此时, Flannel 已经在宿主机上创建出一系列的路由规则,以 Node1 为例,来看一下:

    # 在 Node 1 上
    $ ip route
    default via 10.168.0.1 dev eth0
    100.96.0.0/16 dev flannel0  proto kernel  scope link  src 100.96.1.0
    100.96.1.0/24 dev docker0  proto kernel  scope link  src 100.96.1.1
    10.168.0.0/24 dev eth0  proto kernel  scope link  src 10.168.0.2
    

    我们能够看到,由于 IP 包的目的地址是 100.96.2.3 ,它现在匹配不到本机 docker0 网桥对应的 100.96.1.0/24 网段,只能匹配到第二条,也就是 100.96.0.0/16 对应的这条路由规则,从而进入到一个叫作 flannel0 的设备中.这个 flannel0 设备是一个 TUN 设备( Tunnel 设备)
    在 Linux 中, TUN 设备是一种工作在三层( Network Layer )的虚拟网络设备. TUN 设备的功能非常简单,就是:在操作系统内核和用户应用程序之间传递 IP 包.
    此时, IP 包根据路由表进入 flannel0 设备后,宿主机上的 flanneld进程,就会收到这个 IP 包,然后根据目的地址将它发送给 Node2 宿主机.
    那么, flanneld 是如何知道这个 IP 地址对应的容器,是运行在 Node2 上面的呢?

    在由 Flannel 管理的容器网络中,一台宿主机上的所有容器,都属于该宿主机被分配的一个"子网",在上面举的例子中, Node1 的子网是 100.96.1.0/24 , container-1 的 IP 地址是 100.96.1.2 . Node2 的子网是 100.96.2.0/24 , container-2 的 IP 地址是 100.96.2.3
    而这些子网与宿主机的对应关系,保存在 Etcd 中.所以, flanneld 进程在处理 IP 包时,可以根据目的 IP 的地址,匹配到对应的子网,在 Etcd 中找到这个子网对应的宿主机的 IP 地址即可.
    当然,这个请求得以完成的原因是,每台宿主机上的 flanneld ,都监听着一个 8285 端口,所以 flanneld 只要把 UDP 包发往 Node2 的 8285 端口即可.接下来就是 flanneld 会直接把这个 IP 包发送给它所管理的 TUN 设备,即 flannel0 设备.,此时 Linux 内核网络栈就会负责处理这个 IP 包,根据相关规则,把这个 IP 包转发给 docker0 网桥.接下来的流程大家就清楚了(如果忘记了,可以再回去看看:[Kubernetes]浅谈容器网络), docker0 网桥会扮演二层交换机的角色,将数据包发送给正确的端口,进而通过 Veth Pair 设备到 container-2 的 Network Namespace 中.
    以上就是大概的一个流程.
    来一张图,看看会不会理解的更好一些:
    在这里插入图片描述
    我们能够看到, Flannel UDP 模式提供的其实是一个三层的 Overlay 网络,即:它首先对发出端的 IP 包进行 UDP 封装,然后在接收端进行解封装拿到原始的 IP 包,进而把这个 IP 包转发给目标容器.
    但是UDP模式有严重的性能问题,相比于两台宿主机之间的直接通信,基于 Flannel UDP 模式的容器通信多了一个额外的步骤,即 flanneld 的处理过程.因为这个过程中,由于使用到了 flannel0 这个 TUN 设备,所以仅仅在发出 IP 包的这个过程中,就需要经过用户态与内核态之间的数据拷贝,具体如下所示:
    在这里插入图片描述
    但是我们在进行系统级编程时,有一个非常重要的优化原则,就是要减少用户态到内核态的切换次数,并且把核心的处理逻辑都放在内核态进行.

    基于这个问题,咱们来看看 VXLAN 模式.
    VXLAN(即 Virtual Extensible LAN 虚拟可扩展局域网),是 Linux 内核本身就支持的一种网络虚拟化技术,因此 VXLAN 完全可以在内核态上实现上述封装和解封装的工作,从而通过与前面类似的"隧道"机制,构建出覆盖网络( Overlay Network ).
    VXLAN 的覆盖网络的设计思想是:在现有的三层网络上,“覆盖"一层虚拟的,由内核 VXLAN 模块负责维护的二级网络,使得连接在这个 VXLAN 二层网络上的"主机”(虚拟机或者容器都可以)之间,可以像在同一个局域网( LAN )里那样自由通信,当然,实际上这些"主机"可能分布在不同的宿主机上,甚至是分布在不同的物理机房里.而为了能够在二层网络上打通"隧道", VXLAN 会在宿主机上设置一个特殊的网络设备作为"隧道"的两端,这个设备就叫作 VTEP(即: VXLAN Tunnel End Point 虚拟隧道端点). VTEP 设备的作用,和 flanneld 进程非常相似,只是它进行封装和解封装的对象,是二层数据帧,并且这个工作的执行流程,是在内核中完成的.来看一下示意图:
    在这里插入图片描述
    图中每台宿主机上名叫 flannel.1 的设备,就是 VXLAN 所需的 VTEP 设备,它既有 IP 地址,也有 MAC 地址.而接下来 Flannel VXLAN 模式的具体工作方式,就和实际网络中工作的方式差不多了.
    VXLAN 模式组建的覆盖网络,其实就是一个由不同宿主机上的 VTEP 设备,也就是 flannel.1 设备组成的虚拟二层网络,对于 VTEP 设备来说,它发出的"内部数据帧"就仿佛是一直在这个虚拟的二层网络上流动一样,而这也正是「覆盖网络」的含义.

    以上内容来自我学习<深入剖析Kubernetes>专栏文章之后的一些见解,有偏颇之处,还望指出.
    感谢您的阅读~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Kubernetes]谈谈容器跨主机网络 的相关文章

随机推荐

  • 【RTOS学习】单片机中的C语言

    作者 一只大喵咪1201 专栏 RTOS学习 格言 你只管努力 剩下的交给时间 本喵默认各位小伙伴都会C语言 我们平时学习C语言都是在Windows环境下学习的 对于程序执行的底层逻辑了解的不是非常清楚 本喵在这里给大家介绍一下 C语言在单
  • 【计算机视觉

    文章目录 一 问题 二 个人的理解 2 1 线性层的理解 2 2 pseudo words的理解 2 2 1 详细一点 2 2 2 为什么可以使用文本嵌入空间中的技术 2 2 3 pseudo word的本质是什么 2 2 4 好处 2 2
  • 时间序列分析波动性预测GARCH模型

    GARCH Generalized Autoregressive Conditional Heteroskedasticity 模型是一种常用于预测金融时间序列波动性的统计模型 它是ARCH Autoregressive Condition
  • Axios 发送 json 数据

  • [1008]ROW_NUMBER和RANK和DENSE_RANK的区别

    文章目录 row number over partition by order by 使用说明书 ROW NUMBER和RANK和DENSE RANK的区别 row number over partition by order by 使用说
  • 【SpringBoot 3.x】使用starter整合Druid

    Druid介绍 Druid是阿里巴巴的一个开源项目 号称为监控而生的数据库连接池 在功能 性能 扩展性方面都超过其他例如DBCP C3P0 BoneCP Proxool JBoss DataSource等连接池 而且Druid已经在阿里巴巴
  • echarts自定义主题构建

    ecahrts自定义主体构建 首先 需要ui在echarts官网的工具 gt 主体构建工具 中配置参数 然后导出json 或者直接下载js文件 主体名称最好给个英文名称 如果UI给的是中文 修改一下 1 打开下载的js 2 搜索 echar
  • 100天精通Python(数据分析篇)——第64天:Pandas分组groupby函数案例

    文章目录 一 分组 groupby 1 GroupBy对象 DataFrameGroupBy SeriesGroupBy 1 分组操作 2 分组运算 3 按自定义的key分组 2 GroupBy对象支持迭代操作 1 单层分组 2 多层分组
  • 数据集【NO.7】无人机航拍数据集——VisDrone2019数据集

    写在前面 数据集对应应用场景 不同的应用场景有不同的检测难点以及对应改进方法 本系列整理汇总领域内的数据集 方便大家下载数据集 若无法下载可关注后私信领取 关注免费领取整理好的数据集资料 本文数据集链接 https pan baidu co
  • 10个值得珍藏的4K高清壁纸网站推荐

    作为打开电脑 or 手机第一眼就看到的桌面 给它设置一个赏心悦目的桌面壁纸还是必不可少的 下面分享了 10 个值得珍藏的高清桌面壁纸网站 支持各种图片比例和分辨率 从 720P 到 4K 8K 应有尽有 电脑和手机都可以使用 高清桌面壁纸网
  • 20. 有效的括号

    思路 这道题刚看到的时候想着放入数组然后首末都使用指针在指向进行匹对 发现不太好用 想起表达式计算时是通过入栈进行计算从而进行括号匹对 所以思路还是使用栈 但是Java还不是学得很深 不知道怎么用栈 故通过数组来模拟栈 将字符串放入字符数组
  • Linux 设置定时任务

    作者 Linux猿 简介 CSDN博客专家 华为云享专家 Linux C C 云计算 物联网 面试 刷题 算法尽管咨询我 关注我 有问题私聊 欢迎小伙伴们点赞 收藏 留言 本篇文章主要介绍在 Linux 环境下如何设置定时任务 一 实验环境
  • (ESP32学习11)串口的使用(发送和接收)

    首先串口这种很重要的东西应该早点讲的 但是串口发送简单 读取起来是要废一番脑筋的 所以下面有两个部分 第一部分只有ESP32的几个串口使能和发送的讲解 第二部分就包含串口接收 我们将要把读取的数据再由我们的调试串口打印出来 下一篇我还会更一
  • ant-design-pro 项目运行报错解决

    第一步 安装git 第二步 安装图片输入命令 在运行到npm insatll 这一步的时候一直报错 详情就不写了 试了淘宝镜像一样报错 最后用yarn命令 会报错淘宝镜像运行结尾有报错 所以卸载了淘宝镜像 npm uninstall cnp
  • centos7调整vm.max_map_count的大小及修改系统打开文件大小

    参考博主 centos7调整vm max map count的大小及修改系统打开文件大小
  • JavaScript最后分水岭——正则表达式

    个人简介 个人主页 微风洋洋 博客领域 编程基础 后端 写作风格 干货 干货 还是tmd的干货 精选专栏 JavaScript 支持洋锅 点赞 收藏 留言 好久不见 甚是想念 大家好 我是微风洋洋 也可以叫我洋锅 细心地小伙伴可能已经发现
  • 线性代数-方阵对角化及其应用

    前置知识 1 向量的内积 对于 a x 1
  • Springboot 集成 RabbitMq 实现消息确认机制

    消息确认主要分为两种 发送确认 发送确认包含两种情况 一种是消息是否到达交换机 一种是消息是否到达队列 接收确认 一 发送方消息确认 1 ConfirmCallback 接口 配置文件需要开启配置 publisher confirm typ
  • Linux系统中如何彻底隐藏一个TCP连接?

    前面的文章中 我稍微描述了一下如何隐藏一个TCP连接 https blog csdn net dog250 article details 105372214 在上文中 我采用了 传统 的做法 即hook住proc的 proc net tc
  • [Kubernetes]谈谈容器跨主机网络

    继上篇文章 Kubernetes 浅谈容器网络 自己给自己挖的坑 这篇文章来谈谈容器跨主机网络 要理解容器 跨主通信 的原理 就要来谈谈 Flannel 这个项目 Flannel 项目是 CoreOS 公司主推的容器网络方案 提供容器网络功