亚马逊AWS官方博客
在 Amazon EKS 服务上体验 Federation
1. 背景
Amazon Elastic Kubernetes Service (Amazon EKS)是一项完全托管的Kubernetes服务,由于其安全性、可靠性和可扩展性,许多企业在 EKS上 运行任务关键型应用程序。而Amazon EKS默认的模式是以同region下单cluster形式对外提供服务,而随着环境的复杂多样和集群数量增长,企业不可避免地需要同时部署和运营多个集群,比如:
- 高可用性:通过跨集群分配负载并自动配置DNS服务器和负载平衡器,集群联邦可以最小化集群失败的影响,即使遇到某个区域连接中断或某个数据中心故障,也会保持最关键的服务运行。
- 低延迟:将集群放在不同Region中,为用户提供最近的集群应用服务来最小化延迟。
- 故障隔离:使用多个小集群而不是单个大集群进行故障隔离(例如:在aws的不同region中使用多个集群)。
- 可伸缩性:避免单个Kubernetes集群可伸缩性的限制。
- 混合云:在不同的云提供商或内部数据中心上拥有多个集群。
那么在这样的多集群环境下,企业如何通过一个统一的控制面板来实现Amazon EKS在多集群环境下服务的跨集群服务部署、服务发布、服务发现和全局调度,以及如何高效地管理和运维这些跨区域的集群成为企业面临的新问题。通过Kubernetes Federation,可以轻松实现Amazon EKS服务的多区域部署,以及对EKS不同区域的集群,甚至可以位于不同的云提供商或企业内部的Kubernetes集群进行集中管理。
2.Federation v2 简介
Federation(集群联邦)是k8s社区中重要的多云管理项目,实现了跨Region跨服务商管理多个k8s集群的功能。Federation允许从集中式主群集或主机群集控制多个K8S 群集目前社区有Federation v1和v2两个版本,v1已被官方强烈不推荐使用。Federation v2 利用 CRD 实现了整体功能,通过定义多种自定义资源(CR),从而省掉了 v1 的 API Server,但也因此引入了Host Cluster 的概念。
基本概念
- Federate:联邦(Federate)是指联结一组Kubernetes集群,并为其提供公共的跨集群部署和访问接口
- KubeFed:Kubernetes Cluster Federation,为用户提供跨集群的资源分发、服务发现和高可用
- Host Cluster:Host Cluster运行KubeFed控制平面,其中包含每个成员集群的KubeFedConfig和KubeFedCluster资源
- Cluster Registration:通过Kubefed join使得成员集群加入到主集群(Host Cluster)
- Member Cluster:通过KubeFed API注册为成员并受KubeFed管理的集群,主集群(Host Cluster)也可以作为成员集群(Member Cluster)
- ServiceDNSRecord: 记录Kubernetes Service信息,并通过DNS使其可以跨集群访问
- IngressDNSRecord:记录Kubernetes Ingress信息,并通过DNS使其可以跨集群访问
- DNSEndpoint:一个记录(ServiceDNSRecord/IngressDNSRecord 的Endpoint信息的自定义资源
工作原理
Federation v2 在架构上采用了流行的CRD+Controller模型运行在 Kubernetes 集群中,扩展了 k8s 的资源管理能力。 首先,它向原有k8s集群注册一系列 CRD 资源,这些 CRD 定义了联邦系统所支持的k8s资源;然后通过开启一个 ControllerManager来管理这些CRD资源,实现跨集群资源调度。 CRD资源和ControllerManager共同构成了Federation v2的Control Plane。 目前 Federation v2主要定义了 4 种CRD资源:
Cluster Configuration:主要定义了子集群注册时的配置信息。当用户执行 kubefedctl join命令将安装好的集群加入联邦时,federation-controller-manager 会自动读取新加入集群的 context 信息,生成Cluster Configuration信息;
Type Configuration:主要定义了Federation可以处理哪些资源对象。每个Type Configuration包括三个子配置项:
- Template:定义了Federation要处理的资源对象,含有该对象的全部信息;
- Placement:定义要将资源对象运行在哪些子集群中,如不定义该对象,则资源不会运行在任一集群;
- Override:针对不同集群的特殊需求,会重写覆盖Template中的内容;
Schedule:主要定义应用在集群中的调度分布,该类型主要涉及Deployment与Replicaset两种。用户可以定义对象在每个集群中分布的最多、最少实例数,并且还能在集群中做到应用实例数的均衡分布。值得注意的是,如果调度结果跟用户自定义的 Override冲突时,该调度算法享有优先权。例如用户Override 中定义为 5 个实例,实际调度结果只有 3 个,那么自定义的Override中5个实例将被改为3个。
MultiClusterDNS:该资源主要实现多集群间的服务发现,其下主要包含ServiceDNSRecord、IngressDNSRecord、DNSEndpoint这几个资源对象。
3.安装步骤
下面将介绍如何在Amazon EKS容器服务上搭建和使用Federation v2,完成如下步骤后的架构见下图。
1) 前置条件
开始前,需要先安装下列工具到操作机器上:
kubectl:用来操作部署完成的 EKS集群
helm: 用来部署 Federation v2 元件的工具。
kubefedctl:用来新增与加入集群成为联邦的工具。
2) 创建EKS集群
目前KubeFed控制平面可以在任何v1.13或更高版本的EKS集群上运行。以下步骤仅在主群集上进行,该集群将控制所有其他集群,成员集群上无需进行任何配置,所有设置均由主集群来驱动。本文使用eksctl.io分别在两个region(us-east-2,ap-northeast-1)创建了两个集群,并将它们命名为cluster0,cluster1,其中cluster0充当主集群。
3) 部署Helm 2
Helm 2依赖于一个名为tiller的服务,该服务需要在kubernetes集群上获得特殊许可,因此我们需要为tiller建立一个服务帐户。然后将其应用于集群。
创建一个新的服务帐户:
应用配置:
用helm tooling在集群中安装tiller,允许访问EKS集群中的资源
安装kubefed Chart:首先,将KubeFed Chart存储库添加到本地存储库,然后安装。
4) 转换kubectl的配置文件
为了将群集连接在一起,必须下载并安装一个单独的工具kubefedctl,且kubefedctl应该与Helm的版本匹配(当前版本为v0.1.0-rc6)。该工具会使用到kubectl的配置文件,以便正确验证并连接到其他成员集群中。但是当前版本kubefedctl并不能正确解析EKS默认生成YAML格式的config文件。因此,我们还需要手工调整了kubectl配置文件中所有大写和特殊字符,将大写字母转换为小写字母等。具体转换格式对比如下:
EKS生成的原始kubectl文件
kubefedctl工具所需的正确格式