趣谈网络协议---容器网络之Flannel:每人一亩三分地
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。