在业界目前常见的模式是将独立的 Kubernetes 集群部署到边缘、异构云平台、本地数据中心等,进而能够在一个统一的平台上在边缘、物联网和多云空间中运行应用和服务。此外,还有更复杂的物联网用例,比如在本地和云环境中部署边缘应用。
Rancher2.2 版本之后开始支持多集群管理,用户可以借助 Rancher 在多个集群上同时部署和管理应用。但是当涉及到管理海量集群时,多集群管理的功能就稍显吃力。现在 Rancher 2.5 中引入了 fleet,配置可以实现无缝衔接,在这种情况下可以使用部署规范中的配置将集群作为目标。
Fleet于去年年初推出,它可以使用户能够像管理一个集群一样轻松地管理海量集群。用户可以从中央 Kubernetes 集群跨集群部署 bundle(资源集合),并使用细粒度的目标/分组配置控制部署。Bundle 不仅包括应用部署 manifest,还包括任何可以描述为 Kubernetes 资源的东西。
Rancher 已经支持通过部署 Rancher agent 来导入由任何安装工具创建的 Kubernetes 集群,以实现服务器和集群之间的通信。集群所有者可以在导入的集群上启用监控和日志,启用服务网格 Istio,配置流水线,管理访问等。在 v2.4.0 中增加了将 K3s Kubernetes 集群导入 Rancher 的功能,导入的 K3s 集群可以通过在 Rancher UI 中编辑 K3s 集群规范进行升级,该规范提供了从中央控制平面对众多 K3s 集群的集群级管理。Fleet 与 Rancher 和 K3s 相结合,在集群和应用部署层面提供了真正的舰队管理。
架构和组件
Fleet 有两个主要组件:fleet controller 和 cluster agent。Fleet-controller 和所需的 fleet-CRD 一起部署在 Kubernetes 集群上,用户可以从那里在所有已注册的集群上操作 deployment(使用传统的 API 或 GitOps),这些集群组成了一个 fleet-agent。Fleet 足够轻量,因此可以运行在最小的 deployment 上,甚至在一个单节点集群中 fleet 也有优势。
Fleet Manager/Controller
Fleet controller 是一组跟踪所有相关 fleet 资源类型的 Kubernetes controller,它可以运行在任何标准的 Kubernetes 集群上。Fleet manager 暴露的唯一 API 是 Kubernetes API,并且我们没有为 fleet controller 定制 API。Fleet controller 包括 fleet 管理 Kubernetes 集群的所需的 CRD。
Fleet controller(Kubernetes CRD)
资源类型:
Fleet controller-资源类型
Fleet Cluster Agent
fleet-controller 与成员集群(member cluster)的所有通信都是通过部署在各自集群上的 fleet-agents 进行的。每个集群中运行一个 cluster agent,负责与 fleet-controller 对话,所有的 fleet-agent 都应该能够从 fleet-controller(Kubernetes API)拉取和推送更新,因为 fleet-controller 不会接触到成员集群(只需要连接:agent-->controller),因此所有管理的集群都可以运行在私有网络中(NAT 之后)。
集群注册
单个集群上的所有 fleet-agent 可以使用集群组 token 安全地注册到 fleet-controller,所有注册的集群可以拉取和推送所需的状态,然后再将状态推送回 controller。Fleet controller 动态地创建服务账户以管理它们的 RBAC,然后将 token 给集群。必须生成一个集群组 token 才能向 fleet controller 注册集群。默认情况下,这个 token 将在 1 周内到期。该 TTL 可以更改。生成的集群组 token 可以在它仍然有效的时候反复使用,以注册新的集群。
集群注册涉及多个 controller,为一个集群组创建一个集群组 token,一个集群组(包含用一个共同的集群组 token 注册的集群组)可以包含多个具有不同标签的站点(标签可以用于集群的特定选择)。用户可以通过在 bundle 中提供所需的配置,将资源部署的集群锁定在 ClusterGroup(在集群中的所有单个集群上部署资源)或 ClusterSelector(在集群组中的单个集群上部署资源)中。
示例对象:
如下所示,为两个集群组的 edge-us-east 和 edge-us-west 创建了两个 "clustergrouptokens"。每个集群组由两个具有不同标签的单独集群组成,并使用各自的集群组标记进行注册。
Bundles
Bundle 是一个资源的合集,其中包括额外的 deployment 特定信息,并且可以部署到多个集群。每个 Bundle 都是一个自定义资源,完全封装了所有的部署规范。Fleet 使用 bundle 将磁盘上的 bundle 表示为一系列单独的文件,而不是管理一个大的并且嵌套了多个 YAML 文件的 YAML 文件,fleet apply 将构建 bundle 资源并将其部署到 fleet controller。
Bundle 利用多种方式渲染 YAML 到 Kubernetes 资源:Kubernetes YAML、Helm 或者基于 Kustomize 的方法,也可以选择将这三种方式结合起来。
Bundle Layout
Bundle layout 用于磁盘上供 fleet 读取命令,同时也是 bundle 自定义资源中嵌入式资源的预期结构。
Bundle 策略
用户可以选择使用常见的 Kubernetes YAML、Helm、Kustomize 或者三者的某种组合:
Kustomize 与 Helm 和 Overlays 可以提供一个可以分布在不同区域的配置,而无需改变标准/基础配置。一个将 Kubernetes manifest 与 Kustomize 和 Overlay 结合起来的典型例子如下所示:
配置选项——bundle.yaml
集群目标匹配
同一个命名空间的所有群组中的所有集群都会被考虑,因为 bundle 将针对所有 bundle 目标进行评估。目标列表将被逐一评估,第一个匹配的目标将被用于该集群的 bundle。如果没有匹配,则不会将该 bundle 部署到集群中。匹配集群的方法有三种:可以使用集群 selector、集群组 selector 或明确的集群组名称。
简单试用
下面的拓扑结构包含三个集群组,每个集群组有两个集群。集群组'edge-us-west'和'edge-us-east'包含了两个集群,每个集群都在跨区域的 Vultr 上的各个虚拟机上启动 K3s。集群组'edge-onprem-arm64'包含两个在树莓派 4 上运行 K3s 的集群,这表明成员集群可以在 NAT 后面运行,并实现私有网络。
基于云的 K3s 集群:
使用 clusterGroupSelector 部署 Bundle
Bundle 配置中的 clusterGroupSelector 允许用户根据集群组标签或集群组名称来匹配集群。
下面显示的是一个同时使用 Helm 和 Kustomize(包括 manifest/模板中的 YAML)的示例 bundle 配置,使用 fleet 进行部署,fleet 使用标签和名称单独选择每个集群组。由于拓扑中每个集群组各有两个集群,因此会在所有集群中创建 6 个 pod,每个集群有一个 pod。如下图所示,kustomize 目录对每个集群类型都有单独的配置,在这里,它添加了一个带有集群区域的 nameprefix。Helm 包含一个示例 pod-template:'name: application-pod'。bundle.yaml 由目标部分的匹配器组成,它使用'clusterGroupSelector'(metadata.label.region)和'clusterGroup'(metadata.name)对集群组进行分组。
如下图所示,每个集群组都有一个独特的名称和标签(本例中为区域)与它们相关联。最初在部署上面的 bundle 之前,fleet 显示所有三个集群组,每个集群上有 2 个 bundle(agent 相关的控制平面)一个。
部署 bundle 'target-clustergroups' 将 bundle 部署在所有集群上。如下图所示,在 fleet 输出中,一个 bundle 被添加到所有集群上,clusters-desired 显示所有 6 个集群都有配置中提供的部署, bundle-deployments 显示每个集群都使用唯一的名称(namespace-clustergroup_name-cluster-**)进行 bundle 部署。
如下图所示,使用配置中的 Helm chart 和提供的 Kustomize 配置为每个 pod 添加了名称前缀, pod(<region>-application-pod)会被部署到所有集群组(每个组有 2 个集群)。同样,用户也可以使用 clusterGroupSelector 根据集群组标签和名称来控制跨越异构环境(边缘站点、云、私有网络中的设备等)的特定集群上的部署。
在目标配置中可以使用 "clusterGroup:{}"来在 controller 注册的所有集群上部署应用程序。
使用 clusterSelector 部署 Bundles
Bundle 配置中的'clusterSelector'允许用户匹配集群组中的单个集群。这个标志使用户能够使用集群注册时提供的标签,唯一地匹配/锁定分布在集群组中的单个集群。
下图所示的是一个同时使用 Helm 和 Kustomize 的示例 bundle 配置(包括 manifests/templates 中的 YAML),这一配置由 fleet 部署,fleet 使用标签单独选择 clustergroup 的每个集群的部分。如下所示,kustomize 目录对每个集群类型都有单独的配置,在这里,它添加了一个带有集群区域的名称前缀。Helm 包含一个示例 pod-template: ‘name: application-pod’。Bundle.yaml 由 target 部分的 matcher 组成,这些 matcher 用'clusterSelector'(metadata.label.env)注册的集群所附加的标签锁定集群。
部署 bundle ‘target-clusters’,将 bundle 部署在 3 个不同 clustergroup 的三个集群中。如下所示,一个 Bundle 只被添加到目标配置中选择的 3 个集群上,"clusters-desired "显示 6 个集群中的 3 个有配置中提供的部署,"bundle-deployments "显示 3 个集群有一个 bundle 使用一个独特的名称(namespace-clustergroup_name-cluster-**)部署。
如下图所示,pod(<region>-application-pod)被部署在三个不同集群组的 3 个集群上。用户可以使用 clusterSelector 精心挑选 特定/单个 集群来部署资源。
在目标配置中可以使用 clusterSelector: {} 来在 controller 注册的所有集群上部署应用程序。
使用 Rancher UI 可视化
在 Rancher 2.5 中,Rancher 启用了新的 UI 界面,用户可以导入 fleet-controller 集群,然后该 dashboard 会为 fleet 提供一个成熟的可视化和编辑功能的用户界面。除了 fleet 级别的可视化,dashboard 还为用户提供了添加监控和日志的选项。K3s 集群也可以导入,如下图所示:
Fleet-controller 集群:
为所有 3 个集群组生成 token。
添加 alt text:
3 个集群组,每个集群组有 2 个集群,并部署了 ready/desired 的 bundle 状态:
集群组的集群注册请求及其各自的标签:
在集群组下分组的各个集群,以及在集群级部署的 bundle 的 ready/desired 状态。
Bundle 部署和可用性状态:
由于 Fleet 是作为标准的 Kubernetes API 实现的,它应该可以很好地集成到现有的生态系统中。随着多集群应用的部署,人们可以很容易地执行这些标准 "每个集群必须安装多个安全工具 "或 "特定的集群组应该有 GDPR 启用服务 "或 "集群组中的特定集群应该有一个独特的应用程序 "等。
部署在 fleet controller 集群中的 ArgoCD 或 Flux 等工具,可以将 Git 中的资源复制到 fleet controller 中,然后由 fleet controller 管理在 agent 集群上的部署,从而实现了一个成熟的应用部署流水线,可以遍布 10 多个至 1000 多个集群。
零售商为每个存在点或每个监控摄像头运行 Kubernetes 集群,或汽车公司在每辆联网汽车上运行集群,或制造公司在联网工业机器人上运行基于 ARM 的小尺寸设备上的集群,fleet 与 Rancher 和 K3s 可以在边缘计算中发挥惊人的作用,将集群管理带到一个全新的规模。
原文链接:
https://itnext.io/fleet-management-of-kubernetes-clusters-at-scale-ranchers-fleet-de161cc52325
本文转载自:RancherLabs(ID:RancherLabs)
评论