去指挥你的舰队吧!体验使用 fleet 批量管理 k8 s 集群

体验 Fleet 是怎么管理海量 Kubernetes 集群的。

作者 guoxudong 发表于 2020年4月23日 更新于 2023年1月10日

前言

最早听说到这个消息时,我还是很疑惑的,Fleet 不是 CoreOS 早已经停止维护的一个项目吗?怎么又和 Rancher Labs 扯上了关系?

**“为用户提供海量 Kubernetes 集群的集中管理体验”**这句话是否言过其实:

  • “海量”这个量到底有多大?
  • 又有多少公司或团队有管理海量的 Kubernetes 集群的需求?
  • 又是怎么一个集中管理法?

带着这些疑问,我仔细了解了一下 Fleet 这个开源项目。

Fleet

首先,这里的 Fleet 是一个新项目,起这个名字应该算是一种致敬,经过了解后我个人觉得这个名字起的还是挺贴切的,比一大波 KubeXXX 有创意多了。

“我一直是它的忠实粉丝,将这一项目命名为 Fleet 也包含了我的私心。”Darren Shepherd 解释道:“所以我希望重新使用 Fleet 这一名字,这是对这个非常出色的容器领域早期项目的致敬。同时,对于推动 Kubernetes 集群管理的演进,我们感到十分兴奋及万分期待。”

— 摘自 RancherLabs 官方微信公众号《Rancher开源Fleet:业界首个海量K8S集群管理项目》

顾名思义 Fleet 是“舰队”的意思,而 Kubernetes 在希腊语意为 “舵手”。从名称上看,Fleet 的目标就是管理或是指挥众多 Kubernetes 集群。而在了解这个项目时,我发现了这个项目和 Rancher Labs 另一个受欢迎项目 k3s 有个千丝万缕的联系,甚至在我看来 Fleet 可能就是就是为了管理众多 k3s 集群而生的,是 Rancher Labs 布局边缘计算和 IoT 领域的重要组成部分。

k3s 是一款轻量级的 Kubernetes 集群,主要面向边缘计算和 IOT 领域,相比原生 Kubernetes,k3s 体量更轻、部署简单且快速,同时还具有完整的 Kubernetes 体验。可以说只要是 Linux 系统(配合周边工具甚至可以运行在 Mac 和 Windows 系统),无论是树莓派、各种开发板还是 PC 机,都可以独立运行起 k3s,这也为运行海量 Kubernetes 集群提供了可能。以汽车为例,我们可以为每一辆汽车都部署一个 k3s 集群,所有汽车相关的软件(导航、广播甚至是无人驾驶程序)都部署在 k3s 集群中,每次这些软件发布新版本,只需使用 Fleet 进行批量操作该种车型的所有 k3s 集群即可,无需将车开回 4S 店进行手动更新。

解释了海量 Kubernetes 集群的疑问,下面就从 Fleet 的架构入手,讲讲如何集中管理

Fleet 包含ManageragentManager所在集群作为控制平面管理所有agent集群,同时 Fleet 根据 Kubernetes 部署 Pod 的模型,定义了一个 Bundles 对象,并且提供了一种内置机制,可以使用诸如HelmKustomize等行业标准工具为每个目标集群定制 Bundles,在我看来这种模式以及bundle.yaml的写法都和Kustomize很像(套娃行为?)…一旦用户在集群之间部署了 Bundles,Fleet 就会主动监视资源是否已就绪,以及是否被更改过。总的来说就是通过部署 Bundles,就可以将部署内容批量分发到所有目标集群,从而达到集中管理的目的。

尝鲜体验

说那么多其实意义不大,好不好用,只有试过才知道。这里使用的 Fleet 版本为v0.2.0,是目前的最新版本。

下载 CLI 工具

首先需要下载fleet的 CLI 工具,这里的体验和 k3s 类似,都是直接curl GitHub 上的安装脚本并执行:

$ curl -sfL https://raw.githubusercontent.com/rancher/fleet/master/install.sh | sh -

部署控制平面

使用 CLI 工具将Fleet Manager部署到 Kubernetes 集群上:

# Kubeconfig should point to Manager cluster
$ fleet install manager | kubectl apply -f -

生成 Cluster group token

到这控制平面就部署好了,接下来部署agent目标集群。这里生成的其实是一个 yaml 文件,内容包含 fleet 需要的 RBAC 权限和 fleet-agent 的 Deployment:

# Kubeconfig should point to Manager cluster
$ fleet install agent-token > token

目标集群注册

将需要纳管的目标集群加入到 fleet 中,注意:这里需要将 kubeconfig 切换到目标集群,也就是需要部署agent的集,每个需要注册的集群都要部署agent

# Kubeconfig should point to AGENT cluster
$ kubectl apply -f token

部署 bundles

这里就是向多个集群同时部署 bundles,使用方法也和Kustomize类似(example 目录是 fleet 官方仓库中的示例目录):

# Kubeconfig should point to Manager cluster
$ fleet apply ./examples/helm-kustomize

查看状态

现在就可以查看所有集群 bundles 的状态了,这里可以看到 bundles 在多个集群都部署成功了(这里是我起的两个 k3s 集群做的测试):

$ kubectl get fleet
NAME                                   CLUSTER-COUNT   BUNDLES-READY   BUNDLES-DESIRED   STATUS
clustergroup.fleet.cattle.io/default   2               3               4                 Modified: 1 (helm-kustomize )

NAME                                    CLUSTERS-READY   CLUSTERS-DESIRED   STATUS
bundle.fleet.cattle.io/fleet-agent      2                2
bundle.fleet.cattle.io/helm-kustomize   1                2                  Modified: 1 (default-default-group/cluster-5a186072-acbd-4f54-8f22-fb1651ce902f )

总结

总的来说,Fleet 的架构简洁且十分轻量,部署方式简单,使用YAMLHelmKustomez都可以进行资源的描述和配置,甚至可以使用Helm`+Kustomeze`的模式,部署体验不错。

但遗憾的是,目前 Fleet 还处于项目早期,实践也仅限于尝鲜体验,并不能用于生产环境,项目 README 中还专门提到了目前 Fleet 仅适用于 10 个集群以下的小规模部署。目前文档不足且项目维护人员并不积极,文档勘误的 RP 和相关 ISSUE 也没有得到相关的反馈。项目是做到了业界首个,但是要真正生产可用甚至做到业界第一还有很长的一段路要走。

参考