写点什么

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:003640

评论

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

“阿里味”的「Redis核心实践全彩手册」给你,还学不会就转行吧

做梦都在改BUG

Java 数据库 redis 缓存 面试

果然!GitHub上哄抢的500页微服务前后端分离开发手册,是出自Alibaba

做梦都在改BUG

Java 微服务 Spring Boot Vue 前后端分离

高频面试:如何解决MySQL主从复制延时问题

做梦都在改BUG

Java MySQL 面试 主从复制

互联网大厂2700道Java高频面试题(2023年最新版)不管你工作几年,都可以看看

架构师之道

Java 编程

GitHub已开源—在国内外都被称为分布式理论+实践的巅峰之作

做梦都在改BUG

Java 数据库 分布式 系统设计 设计数据密集型应用

阿里大佬倾情力荐:Java全线成长宝典,从P5到P8一应俱全

三十而立

Java java面试

TiCDC 源码阅读(七) TiCDC Sorter 模块揭秘

TiDB 社区干货传送门

基于OCR进行Bert独立语义纠错实践

华为云开发者联盟

人工智能 华为云 OCR 华为云开发者联盟 企业号 4 月 PK 榜

瓴羊Quick BI连续入选魔力象限ABI报告,实至名归

流量猫猫头

堡垒机厂商都是大企业吗?你比较推荐哪家?

行云管家

网络安全 等级保护

Flink MongoDB CDC 在 XTransfer 的生产实践|Flink CDC 专题

Apache Flink

大数据 flink 实时计算

开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门

JackJiang

“信创”滚滚而来,私有化或将迎来第二春

WorkPlus

值得一看!阿里内部“M9”级别全彩版分布式实战笔记

做梦都在改BUG

Java 架构 分布式 分布式事务 微服务

TiDB损坏多副本之有损恢复处理方法

TiDB 社区干货传送门

集群管理 6.x 实践 TiKV 底层架构

TiCDC 源码阅读(五)TiCDC 对 DDL 的处理和 Filter 解析

TiDB 社区干货传送门

Stable Diffusion:一种新型的深度学习AIGC模型

GPU算力

tiup cluster display 执行流程代码详解

TiDB 社区干货传送门

实践案例 集群管理 故障排查/诊断 安装 & 部署

知行合一!AI大模型与算法二三事

深数

深度学习 科普 数字化 NLP 大模型 LLM

MySQL架构与SQL执行流程

做梦都在改BUG

Java MySQL 数据库 SQL执行流程

团队RONG合三状态,您的团队是哪一种?

禅道项目管理

从零学习SDK(3)如何安装和配置SDK

MobTech袤博科技

TiCDC 源码阅读(六)TiCDC Puller 模块介绍

TiDB 社区干货传送门

ByteBase是什么,他怎么和tidb结合提高工作效率的

TiDB 社区干货传送门

实践案例

HummerRisk 使用教程:操作审计

HummerCloud

云安全

文盘Rust -- 用Tokio实现简易任务池

TiDB 社区干货传送门

开发语言

瓴羊Quick BI国产数字化智能工具口碑怎么样?30天免费试用

小偏执o

堡垒机主流品牌有哪些?如何选择?

行云管家

堡垒机 IT运维

牛客网2023Java最新面试宝典(附答案解析)正式开源

采菊东篱下

编程 java面试

企业数字化升级迫在眉睫,瓴羊Quick BI工具应运而生

夏日星河

API First 再先一步,OpenAPI 定义被 openAI 定为 ChatGPT 插件标准

Apifox

人工智能 OpenAPI openai 开放api ChatGPT

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