Cluster Mesh 是 Cilium 的多集群实现,可以帮助 Cilium 实现跨数据中心、跨 VPC 的多 Kubernetes 集群管理,ClusterMesh 主要有以下功能:
- 1.通过隧道或直接路由的方式,在多个 Kubernetes 集群间进行 Pod IP 路由,而无需任何网关或代理。
- 2.使用标准 Kubernetes 服务发现机制。
- 3.跨多个集群的网络策略。策略可以使用 Kubernetes 原生的 NetworkPolicy 资源或者扩展的 CiliumNetworkPolicy CRD。
- 4.透明加密本集群以及跨集群节点间所有通信的流量。
接下来让我们一起看看 Cilium Cluster Mesh 有哪些具体的使用场景。
1 使用场景
1.1 高可用
对大多数人来说,高可用是最普遍的使用场景。可以在多个区域(regions)或可用区(availability zones)中运行多个 Kubernetes 集群,并在每个集群中运行相同服务的副本。 一旦发生异常,请求可以故障转移到其他集群。
1.2 共享服务
某些公共基础服务可以在集群间进行共享(如密钥管理,日志记录,监控或 DNS 服务等),以避免额外的资源开销。
1.3 拆分有状态和无状态服务
运行有状态或无状态服务的操作复杂性是非常不同的。无状态服务易于扩展,迁移和升级。 完全使用无状态服务运行集群可使集群保持灵活和敏捷。有状态服务(例如 MySQL,Elasticsearch, Etcd 等)可能会引入潜在的复杂依赖,迁移有状态服务通常涉及存储的迁移。为无状态和有状态服务分别运行独立的集群可以将依赖复杂性隔离到较少数量的集群中。
2 架构
Cilium Cluster Mesh 的架构如下:
- 每个 Kubernetes 集群都维护自己的 etcd 集群,保存自身集群的状态。来自多个集群的状态永远不会在本集群的 etcd 中混淆。
- 每个集群通过一组 etcd 代理暴露自己的 etcd,在其他集群中运行的 Cilium agent 连接到 etcd 代理以监视更改。
- Cilium 使用 clustermesh-apiserver Pod 来建立多集群的互联,在 clustermesh-apiserver Pod 中有两个容器:其中 apiserver 容器负责将多集群的相关信息写入 etcd 容器;etcd 容器(etcd 代理)用来存储 Cluster Mesh 相关的配置信息。
- 从一个集群到另一个集群的访问始终是只读的。这确保了故障域保持不变,即一个集群中的故障永远不会传播到其他集群。
3 前提条件
3.1 安装相关软件
- 安装 Kubectl:kubernetes.io/zh/docs/tas…
- 安装 Kind:kind.sigs.k8s.io/docs/user/q…
- 安装 Helm:helm.sh/docs/intro/…
- 安装 Cilium Cli:github.com/cilium/cili…
Kind [1](Kubernetes in Docker) 是一个使用 Docker 容器运行本地 Kubernetes 集群的工具。为了方便实验,本文使用 Kind 来搭建 Kubernetes 多集群环境。
3.2 环境要求
- 1.必须为所有 Kubernetes 的工作节点分配唯一的 IP 地址,并且节点之间 IP 路由可达。
- 2.每个集群都要分配唯一的 Pod CIDR。
- 3.Cilium 必须使用 etcd 作为 kv 存储。
- 4.集群之间的网络必须互通,具体的通信的端口号参见防火墙规则 [2]。
本实验相关的配置文件可以在: cluster_mesh [3] 获取。