当前位置: 首页 > news >正文

容器网络之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学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

http://www.lryc.cn/news/179513.html

相关文章:

  • SVM(下):如何进行乳腺癌检测?
  • 嵌入式Linux应用开发-第十五章具体单板的按键驱动程序
  • MySQL体系结构和四层架构介绍
  • 【产品运营】如何做好B端产品规划
  • ruoyi-启动
  • select完成服务器并发
  • 初级篇—第四章聚合函数
  • 计算机图像处理-中值滤波
  • Golang中的包和模块设计
  • web:[极客大挑战 2019]Upload
  • ICMP差错包
  • 算法基础课第二部分
  • 【数据结构】外部排序、多路平衡归并与败者树、置换-选择排序(生成初始归并段)、最佳归并树算法
  • 抽象工厂模式 创建性模式之五
  • servlet如何获取PUT和DELETE请求的参数
  • 【Vue.js】使用Element中的Mock.js搭建首页导航左侧菜单---【超高级教学】
  • 从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!
  • 简单三步 用GPT-4和Gamma自动生成PPT PDF
  • QT设置弹窗显示屏幕中央
  • 正点原子嵌入式linux驱动开发——STM32MP1启动详解
  • FPGA的数字钟带校时闹钟报时功能VHDL
  • 分析各种表达式求值过程
  • 企业风险管理策略终极指南
  • OpenCV之分水岭算法(watershed)
  • npm 命令
  • 【bug 记录】yolov5_C_demo 部署在 rv1126
  • [vue-admin-template实战笔记]
  • unity 限制 相机移动 区域(无需碰撞检测)
  • Hudi第二章:集成Spark
  • springboot和vue:八、vue快速入门