趣谈网络协议---容器网络之Flannel:每人一亩三分地

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u012319493/article/details/82918317

Kubernetes,可灵活地将一个容器调度到任何一台机器上,还可修改容器的副本数。

要解决的重要问题,是通信。

1、应用将自己环境的 IP 和端口注册到注册中心指挥部,方便其他应用请求。如果发生变化,重新注册。
在这里插入图片描述

2、应用如何相互通信?通过 Flannel。

(1)不能每个物理机的网段都是 172.17.0.0/16,而是应该每台物理机从这个大网段抠出一个小的网段,这样,容器内的应用向注册中心指挥部注册容器 IP 时,就不会冲突了。

(2)物理机 A 上的容器如何访问物理机 B 上的容器?Flannel 提供的 Overlay 方案主要两种方式:

(a)用户态方式,使用 TUN 设备。
在这里插入图片描述

  • 物理机 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,即物理机上 docker0 网桥的 IP。
  • 物理机查看路由策略:172.17.9.0/24 via 172.17.9.0 dev flannel.1,即发往 172.17.9.2 的网络包会被转发到 flannel.1 网卡。flannel.1 网卡是由 flanneld 进程打开一个 /dev/net/tun 字符设备时出现的。
  • flanneld 进程将发往 flannel.1 网卡的包读入,封装在 UDP 包中,然后在外层加上物理机 A 和物理机 B 的 IP,发给物理机 B 上的 flanneld。
  • 物理机 B 上的 flanneld 收到包,解开 UDP 包,将里面的包拿出,从物理机 B 的 flanneld.1 网卡发出。
  • 包发给 docker0,docker 将包转发给容器 B。

(b)内核态方式,使用 VXLAN。不需要打开 TUN 设备,而是建立 VXLAN 的 VTEP。
在这里插入图片描述

  • 通过 netlink 通知内核建立一个 VTEP 的网卡 flannel.1。netlink 是一种用户态和内核态通信的机制。
  • 容器 A 通过默认路由到达物理机 A 上的 docker0 网卡。
  • 在物理机 A 中,根据路由规则,将包转发给 flannel.1。
  • flannel.1 是一个 VXLAN 的 VTEP,将网络包封装。内部 MAC:flannel.1 的 MAC,外加 VXLAN 头。外层 IP:物理机的 IP,外加物理机的 MAC。
  • 通过 VXLAN 将包转发给另一台机器,在物理机 B 上的 flannel.1 上解包。
  • 根据路由转发到 docker0,最后转发到容器 B。

猜你喜欢

转载自blog.csdn.net/u012319493/article/details/82918317
今日推荐