随着企业的业务规模不断扩大,Kubernetes 的使用也从单集群逐步扩展到多集群部署。多集群环境下,集群之间的通信成为一个重要的研究课题。本文将介绍五种跨 Kubernetes 集群通信的方案的基本原理,优点及其局限性。
这类网络插件包括 macvlan/ipvlan/Kube-OVN underlay 以及各种云上的 VPC CNI 等。
基本原理:
Underlay 网络从 CNI(容器网络接口)的角度来看是最简单的方式。这种方式依赖于底层基础设施在网络层面实现打通。例如,使用公有云上的 VPC Peering 或者物理网络配置路由和大二层。当底层网络实现了连通,跨集群的容器网络就自然连通了。
优点:
局限性:
在无法使用 Underlay 网络的情况下,一些特定的 CNI 在 Overlay 层面也实现了跨集群。例如 Cilium Cluster Mesh, Antrea Multi-Cluster 和 Kube-OVN with ovn-ic。
基本原理:
这些 CNI 的实现方案其实大体一致,通过选择一组集群内的节点作为网关节点,然后网关节点之间建立隧道,跨集群流量通过网关节点转发。
优点:
局限性:
由于跨集群网络互通存在着通用的需求,在实现上也存在着类似,各个 CNI 其实存在着一些重复造轮子的工作。Submariner 作为一款 CNI 无关的跨集群网络插件提供了一种通用的能力,能将不同 CNI 的集群组成一个网络达到互通。Submariner 最早由 Rancher 的工程师创建,现在已经是 CNCF Sandbox 项目了,目前看红帽的工程师也在积极参与这个项目。
基本原理:
Submariner 选择集群内的网关节点,网关节点通过 VXLAN 通信。跨集群流量通过 VXLAN 传输。Submariner 依赖 CNI 将 egress 流量先发送到宿主机的网络内,然后再进行转发。此外,Submariner 部署了一组 CoreDNS 实现跨集群服务发现,并使用 Globalnet Controller 解决 CIDR 重叠问题。
优点:
局限性:
Skupper 是我认为几个方案里最有意思的,它能够按需进行 Service 层面的网络打通,避免了一次完全打通的控制问题。而且很创新的使用了七层消息队列的方式来实现,可以说是对底层网络和 CNI 完全无依赖,上手也十分简单。目前 Skupper 看贡献者主要是红帽的工程师。
基本原理:
和上述几个方案使用隧道将容器 IP 直接打通不同,Skupper 提出了一个 VAN(Virtual Application Networks)的概念,要在 7 层将网络打通。简单说就是不把 IP 直接打通而是把 Service 拉通,概念上和 ServiceExporter,ServiceImporter 类似,但是这个项目启动的比较早,当时还没有这些社区提出来的概念,在当时应该算个很创新的想法了
在实现上 Skupper 也另辟蹊径,用的是个消息队列的实现,多个集群之间组成了一个大的消息队列,跨集群通信的数据包发送到这个消息队列里。另一端再去消费这个数据包。思路上其实类似反向代理,但用消息队列来实现也是个很开脑洞的想法。把 Service 变成了一个消息的订阅点来提供消费,这样就可以按需的在服务端和客户端之间建立一个消息队列,通过消息队列的概念去管理和控制这个消息通路。
优点:
局限性:
KubeSlice 是刚刚进入 CNCF Sandbox 的一个项目。上述的方案基于隧道做的没法做到细粒度控制和 CNI 完全兼容,基于应用层做的又没法做到网络协议完全兼容。KubeSlice 提供了一个新的思路,尝试同时解决这两个问题。
基本原理:
KubeSlice 最底层的思路十分简单粗暴,就是按需给 Pod 动态插入一块网卡,在这个网卡上面做跨集群的 Overlay,然后再在这个 Overlay 网络上面实现服务发现,和网络策略。用户可以按需的将跨集群的几个 Namespace 或者 某几个 Pod 组成一个网络,在可以使实现灵活的细粒度管控基础上由于走的是基于网卡的二层网络,也实现了网络协议的最大兼容性。
优点:
局限性:
在 Kubernetes 多集群环境中实现高效通信有多种方案可供选择。每种方案都有其优点和局限性,用户可以根据具体需求和环境选择合适的方案。