• 容器网络之Flannel



    第一个问题位置变化,往往是通过一个称为注册中心的地方统一管理的,这个是应用自己做的。当一个应用启动的时候,将自己所在环境的 IP 地址和端口,注册到注册中心指挥部,这样其他的应用请求它的时候,到指挥部问一下它在哪里就好了。当某个应用发生了变化,例如一台机器挂了,容器要迁移到另一台机器,这个时候 IP 改变了,应用会重新注册,则其他的应用请求它的时候,还是能够从指挥部得到最新的位置。
    ​​在这里插入图片描述
    Flannel 使用 UDP 实现 Overlay 网络的方案。
    在这里插入图片描述
    在物理机 A 上的容器 A 里面,能看到的容器的 IP 地址是 172.17.8.2/24,里面设置了默认的路由规则 default via 172.17.8.1 dev eth0。

    如果容器 A 要访问 172.17.9.2,就会发往这个默认的网关 172.17.8.1。172.17.8.1 就是物理机上面 docker0 网桥的 IP 地址,这台物理机上的所有容器都是连接到这个网桥的。

    在物理机上面,查看路由策略,会有这样一条 172.17.0.0/24 via 172.17.0.0 dev flannel.1,也就是说发往 172.17.9.2 的网络包会被转发到 flannel.1 这个网卡。

    这个网卡是怎么出来的呢?在每台物理机上,都会跑一个 flanneld 进程,这个进程打开一个 /dev/net/tun 字符设备的时候,就出现了这个网卡。

    物理机 A 上的 flanneld 会将网络包封装在 UDP 包里面,然后外层加上物理机 A 和物理机 B 的 IP 地址,发送给物理机 B 上的 flanneld。

    物理机 B 上的 flanneld 收到包之后,解开 UDP 的包,将里面的网络包拿出来,从物理机 B 的 flannel.1 网卡发出去。

    在物理机 B 上,有路由规则 172.17.9.0/24 dev docker0 proto kernel scope link src 172.17.9.1。

    将包发给 docker0,docker0 将包转给容器 B。通信成功。

    上面的过程连通性没有问题,但是由于全部在用户态,所以性能差了一些。

    如果使用 VXLAN,就不需要打开一个 TUN 设备了,而是要建立一个 VXLAN 的 VTEP。如何建立呢?可以通过 netlink 通知内核建立一个 VTEP 的网卡 flannel.1。

    当网络包从物理机 A 上的容器 A 发送给物理机 B 上的容器 B,在容器 A 里面通过默认路由到达物理机 A 上的 docker0 网卡,然后根据路由规则,在物理机 A 上,将包转发给 flannel.1。这个时候 flannel.1 就是一个 VXLAN 的 VTEP 了,它将网络包进行封装。

    内部的 MAC 地址这样写:源为物理机 A 的 flannel.1 的 MAC 地址,目标为物理机 B 的 flannel.1 的 MAC 地址,在外面加上 VXLAN 的头。

    外层的 IP 地址这样写:源为物理机 A 的 IP 地址,目标为物理机 B 的 IP 地址,外面加上物理机的 MAC 地址。

    这样就能通过 VXLAN 将包转发到另一台机器,从物理机 B 的 flannel.1 上解包,变成内部的网络包,通过物理机 B 上的路由转发到 docker0,然后转发到容器 B 里面。通信成功。
    在这里插入图片描述

    此文章为9月Day30学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

  • 相关阅读:
    经纬恒润基于车规级固态激光雷达推动自动驾驶落地应用
    手把手写深度学习(17):用LSTM为图片生成文字描述(Image-to-text任务)
    在线文本翻译能力新增14个直译模型,打造以中文为轴心语言的翻译系统
    视频剪辑制作教学:分享十种剪辑技巧,打好基础很重要
    网络文件转换为转成MultipartFile
    【网络编程】网络基础
    【C程序设计】用心浇灌<C程序>
    用Java实现图片转文字的功能具体流程
    LIO-SAM运行报错[lio_sam_imuPreintegration-2]和[lio_sam_mapOptmization-5]解决
    Android如何自定义服务器DynamicMockServer的使用
  • 原文地址:https://blog.csdn.net/key_3_feng/article/details/133443220