[Kuberentes][Kubernetes容器网络3]kubernetes 纯三层网络模型

解读 Kubernetes 三层网络方案

[TOC]

除了前面说的 VXLAN 这种二层虚拟可扩展局域网方案之外,还有纯三层网络方案。

Flannel Host Gateway 模式

Flannel 的 Host Gateway 模式:

Flannel在宿主机上创建如下路由规则:

$ ip route
...
10.244.1.0/24 via 10.168.0.3 dev eth0

很容易理解,host-gw 模式下的工作原理,其实就是将每个 Flannel 子网的下一跳地址,设置成了该子网所在宿主机的IP地址。

这样根据容器 IP 找到容器所在子网的 IP后,就可以直接在宿主机上找到对应的主机 IP。将这台主机作为目标子网的网关。

主机和子网的对应关系保存在ETCD中。

因此,host-gw模式要求集群所有宿主机之间是二层连通的。

Calico 项目

与 Flannel host-gw 模式原理相同

宿主机上添加如下路由规则

<目的容器IP地址段> via <网关的IP地址> dev eth0

区别:Calico 项目没有使用 ETCD 来保存容器所在子网和主机 IP 的对应关系,而是使用了 BGP(Border Gateway Protocol, 边界网关协议)。它是一个 Linux 内核原生就支持的、专门用在大规模数据中心里维护不同的“自治系统”之间路由信息的、无中心的路由协议

负责将两个自治子网连接起来的路由器被称为边界网关。如果连接的自治网络很多,那么无法手动配置路由器,需要使用 BGP 来自动对边界网关的路由表进行配置和维护。

在使用了 BGP 之后,你可以认为,在每个边界网关上都会运行着一个小程序,它们会将各自的路由表信息,通过 TCP 传输给其他的边界网关。而其他边界网关上的这个小程序,则会对收到的这些数据进行分析,然后将需要的信息添加到自己的路由表里。

所谓 BGP,就是在大规模网络中实现节点路由信息共享的一种协议

Calico 项目的架构

组成:

  1. Calico 的 CNI 插件。这是 Calico 与 Kubernetes 对接的部分。
  2. Felix。一个Daemonset,负责在宿主机上插入路由规则(即写入Linux内核中的FIB转发信息库),以及维护 Calico 所需要网络设备的
  3. BIRD。BGP 的客户端,负责在集群里分发路由规则信息。

除了对路由信息的维护方式之外,Calico 项目与 Flannel 的 host-gw 模式的另一个不同之处,就是它不会在宿主机上创建任何网桥设备

Calico 的 CNI 网络插件为每个容器设置一个 Veth Pair 设备,然后把其中一端放置在宿主机上。

由于没有设置网桥,所以 Calico 的 CNI 插件还需要在宿主机上设置从宿主机到容器的路由规则:

10.233.2.3 dev cali5863f3 scope link

即:发往 10.233.2.3 的 IP 包,应该进入 cali5863f3 设备。

核心流程

有了这样的 Veth Pair 设备之后,容器发出的 IP 包就会经过 Veth Pair 设备出现在宿主机上。然后,宿主机网络栈就会根据路由规则的下一跳 IP 地址,把它们转发给正确的网关。接下来的流程就跟 Flannel host-gw 模式完全一致了。其中,这里最核心的“下一跳”路由规则,就是由 Calico 的 Felix 进程负责维护的。这些路由规则信息,则是通过 BGP Client 也就是 BIRD 组件,使用 BGP 协议传输而来的。

而这些通过 BGP 协议传输的消息,你可以简单地理解为如下格式:

[BGP消息]
我是宿主机192.168.1.3
10.233.2.0/24网段的容器都在我这里
这些容器的下一跳地址是我

Calico 将所有的宿主机当作了边界路由器

Calico 的默认模式中,每台宿主机上的 BGP 客户端都需要和其他所有 BGP 客户端通信交换路由信息,这被称为 Node-to-Node Mesh 模式。该模式推荐在节点少于100的集群中使用,在更大规模中,需要使用 Route Reflector 模式。

Route Reflector模式

使用中间节点来跟所有节点建立 BGP 连接。其他节点只需要跟中间节点通信。

总结

纯三层网络的模型其实要比 Flannel VXLAN 模式和 UDP 模式更容易理解。核心思想就是把宿主机当作一个个边界路由器,通过 BGP 来设定宿主机上的路由规则。

posted @ 2019-11-15 15:39  HZQTS  阅读(973)  评论(0编辑  收藏  举报