写点什么

Fleet 架构详解:让海量集群管理成为现实

  • 2021-04-06
  • 本文字数:4234 字

    阅读完需:约 14 分钟

Fleet架构详解:让海量集群管理成为现实

在业界目前常见的模式是将独立的 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)

原文链接:Fleet架构详解:让海量集群管理成为现实

2021-04-06 13:003609

评论

发布
暂无评论
发现更多内容

QT 实现生成压缩包

小肉球

qt 7月月更

【愚公系列】2022年7月 Go教学课程 008-数据类型之整型

愚公搬代码

7月月更

双目立体匹配之匹配代价计算

秃头小苏

7月月更 双目立体匹配

OKALEIDO:我们为何如此看好多媒体NFT板块?

鳄鱼视界

电商系统微服务架构

泋清

#架构实战营

新星计划Day3【JavaSE】 集合 Part1

京与旧铺

7月月更

Jenkins centOS搭建和task创建

沃德

ci 程序员 7月月更

Python反爬,JS反爬串讲,从MAOX眼X开始,本文优先解决反爬参数 signKey

梦想橡皮擦

Python 爬虫 7月月更

Spring Cloud源码分析之Eureka篇第七章:续约

程序员欣宸

Java Spring Cloud Eureka 7月月更

C++|登录后通知各个显示页面,观察者模式

中国好公民st

c++ 7月月更

Node.js的非阻塞I/O

是乃德也是Ned

Node 7月月更

Python|揭开「pip不是内部或外部命令,也不是可运行的程序或批处理文件」的神秘面纱

AXYZdong

Python 7月月更

OKALEIDO:我们为何如此看好多媒体NFT板块?

股市老人

14岁懂社会 - 《你没有那么笨》读书笔记

懒时小窝

读书笔记 14岁懂社会

Android Wear开发步骤

芝麻粒儿

android 手机 7月月更

java零基础入门-Number & Math 类

喵手

Java 7月月更

架构实战营模块六作业

Geek_Q

ORACLE进阶(十二)union(all)学习总结

No Silver Bullet

oracle 7月月更 union union all

人最痛苦的时候就是没有目标的时候

KEY.L

7月月更

LeetCode-125. 验证回文串(java)

bug菌

Leet Code 7月月更

Hive说我变了,Spark说不你没变

怀瑾握瑜的嘉与嘉

spark 7月月更

基于物联网设计的铂电阻气体测温仪(华为云IOT)

DS小龙哥

7月月更

【C语言深度剖析】详解strlen与sizeof的区别及用法

Albert Edison

7月月更

拆分电商系统为微服务

爱晒太阳的大白

关于 HTTP post 请求 form data 里的特殊符号,比如加号 plus symbol

汪子熙

HTTP web开发 7月月更 encoding form

前端异常监控平台对比

南城FE

前端 7月月更 异常监控

ORACLE进阶(十一)MERGE INTO学习总结

No Silver Bullet

oracle MERGE INTO 7月月更

内部排序——归并排序

乔乔

7月月更

数据库每日一题---第21天:员工花费的总时间

知心宝贝

数据库 云计算 后端 开发 7月月更

C 语言入门(二)

逝缘~

c 7月月更

Fleet架构详解:让海量集群管理成为现实_架构_Rancher_InfoQ精选文章