深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116706 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

33 | 深入解析容器跨主机网络

思考题
总结
Flannel项目
容器跨主机网络

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:深入解析容器跨主机网络。
在上一篇文章中,我为你详细讲解了在单机环境下,Linux 容器网络的实现原理(网桥模式)。并且提到了,在 Docker 的默认配置下,不同宿主机上的容器通过 IP 地址进行互相访问是根本做不到的。
而正是为了解决这个容器“跨主通信”的问题,社区里才出现了那么多的容器网络方案。而且,相信你一直以来都有这样的疑问:这些网络方案的工作原理到底是什么?
要理解容器“跨主通信”的原理,就一定要先从 Flannel 这个项目说起。
Flannel 项目是 CoreOS 公司主推的容器网络方案。事实上,Flannel 项目本身只是一个框架,真正为我们提供容器网络功能的,是 Flannel 的后端实现。目前,Flannel 支持三种后端实现,分别是:
VXLAN;
host-gw;
UDP。
这三种不同的后端实现,正代表了三种容器跨主网络的主流实现方法。其中,host-gw 模式,我会在下一篇文章中再做详细介绍。
而 UDP 模式,是 Flannel 项目最早支持的一种方式,却也是性能最差的一种方式。所以,这个模式目前已经被弃用。不过,Flannel 之所以最先选择 UDP 模式,就是因为这种模式是最直接、也是最容易理解的容器跨主网络实现。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解析了容器跨主机网络的实现原理,重点介绍了Flannel项目的UDP模式和VXLAN模式。文章首先介绍了容器跨主通信的问题,以及Flannel项目的背景和支持的三种后端实现。然后详细解释了UDP模式的工作原理,包括容器间通信的路由规则、flannel0设备的作用以及子网与宿主机的对应关系。通过对UDP包的封装和发送,实现了容器间的跨主机通信。文章还分析了UDP模式的性能问题,指出其性能不佳的主要原因在于用户态与内核态之间的数据拷贝次数较多。随后,文章介绍了VXLAN模式,指出其在内核态实现封装和解封装的工作,从而提高了性能。通过VXLAN的覆盖网络设计思想,构建出覆盖网络,使得连接在这个VXLAN二层网络上的主机之间可以自由通信。最后,文章总结了基于Flannel VXLAN模式的跨主通信的基本原理,并通过图示展示了VXLAN模式的流程。整体而言,本文以技术性强、逻辑清晰为特点,适合读者快速了解容器跨主机网络的实现原理,以及UDP和VXLAN模式的特点和性能差异。文章内容涵盖了Flannel项目的关键技术细节,对于容器网络技术感兴趣的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(106)

  • 最新
  • 精选
  • 何先生
    为什么要使用UDP呢,UDP不是不可靠的吗

    作者回复: 好问题。你可以想想,这里是不是需要“可靠”呢?

    2018-11-12
    14
    13
  • 勤劳的小胖子-libo
    Flannel中的UDP需要Etcd来维护相关的子网与宿主机的对应关系,在VxLan中也需要Etcd吗?老师,什么时候可以讲下Etcd在k8s中的原理与应用?

    作者回复: 现在它们都不依赖etcd,直接连apiserver

    2018-11-12
    2
    12
  • jssfy
    请问bridge fdb看到的其它节点vtep的对应关系vtep是各节点主动注册的?

    作者回复: 主机上的agent要负责维护这些信息

    2018-11-26
    4
  • 艾斯Z艾穆
    您好,我遇到一个问题 我在一个被service选中的app里访问不了这个service的port可以ping通,用pod的ip可以访问到端口 别的pod可以访问到service的port 这个pod也可以访问别的service的port kube-proxy用的模式是ipvs

    作者回复: 看service部分讲解

    2018-11-08
    2
  • 月亮上看星星
    磊哥,问你个docker的问题,镜像load到主机上,镜像里的文件是不是存储在主机的某个目录上,起来的容器访问这个文件,实际上就是访问主机上的这个文件?如果是这样的话,创建个数据卷放这个文件,让容器去访问这个数据卷里的这个文件,其实也是访问主机某个目录里的文件,不知道这两种方式有什么区别呢?请磊哥指导下呢

    作者回复: 镜像得给容器做rootfs。你理解一下对一个进程来说,rootfs跟普通目录的区别。

    2018-11-08
    2
  • 陆培尔
    老师能说一下最近很火的cilium吗,BPF的内部机制

    作者回复: bpf其实跟网络关系不大,咱们以后有机会再讲

    2018-11-09
    1
  • LEON
    老师,请问内核态和用户态具体指的是什么呢?该如何理解?

    作者回复: 你自己写的java应用,用户态。你自己写的linux内核模块,内核态。

    2018-11-08
  • 宝爷
    这里使用UDP,不需要可靠,因为可靠性不是这一层需要考虑的事情,这一层需要考虑的事情就是把这个包发送到目标地址。如果出现了UDP丢包的情况,也完全没有关系,这里UDP包裹的是我们真正的数据包,如果我们上层使用的是TCP协议,而Flannel使用UDP包裹了我们的数据包,当出现丢包了,TCP的确认机制会发现这个丢包而重传,从而保证可靠。
    2019-02-16
    6
    199
  • Maiza
    分分钟变成了计算机网络课程 😄
    2018-11-07
    2
    55
  • 虎虎❤️
    我又思考了一下,二层网络可能无法连通。因为flannel网络中,node上的fdb是靠配置而非学习得到。当node1上的容器1想要通过mac地址直连node2上的容器2时,由于node1中的fdb中没有配置容器2的mac地址相关记录,所以flannel.1无法找到VTEP出口的ip。故而二层网络没有连通性。 如果想要有连通性,需要配置VTEP为学习模式,并且把所有的VTEP加入一个分组中。这样在fdb表中查询不到mac地址时,vxlan在VTEP组中发起广播(或者组播?这个概念我有点混淆)。VTEP也可作为一个网桥设备,继续向docker0,进而目的node上的所有容器广播。正确的目的地址会响应请求,而且刚才途经的设备fdb都学习到了源容器的mac 地址映射,所以响应数据可以顺利返回源容器。这样就完成了二层网络的连通。
    2018-11-08
    1
    44
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部