FluxCD 多集群应用的设计与实现
前言
FluxCD 是 CNCF 的孵化项目,可以让我们以 GitOps 的方式轻松地交付应用。和另一个同类的 CNCF 孵化项目 ArgoCD 不同,FluxCD 是许多 toolkit 的集合,天然松耦合并且有良好的扩展性,用户可按需取用。我们希望通过集成 FluxCD 这样一个优秀的 GitOps 项目来为用户提供更多的选择。
我们综合考虑了以下三大要素:
- 为还没有接触过 GitOps 的用户提供易上手的体验;
- 为使用过 FluxCD 的用户提供无缝切换的体验;
- 为已经使用过 KubeSphere GitOps 功能的用户提供熟悉感的同时突出 FluxCD 的优势和特性。
多次重新设计了前端界面和后端实现,最终完成了一个还算比较满意的版本。
ks-devops
设计
- 模板复用:FluxCD 提供了 HelmChart 类型的 CRD,但是 HelmRelease 无法直接引用 HelmChart,我们希望添加模板的功能,这样许多配置就可以复用。
- 多集群:我们希望 FluxApplication 是一个多集群应用,这样我们就可以用一套模板配置然后添加不同的配置去部署到多个集群中。
CRD
现有的 gitops.kubesphere.io/applications CRD 已经包含了 ArgoApplication。为了集成 FluxCD,我们将 FluxCD 中的 HelmRelease 和 Kustomization 组合抽象成一个 FluxApplication 的概念放入 Application 里并且 kind 来标识用户启用了哪种 GitOps Engine。

一个完整的 GitOps 应用可以拆分成三大部分:
- 源:存放制品的仓库,制品包括是 Kubernetes Manifests、Kustomize 和 Helm,仓库的类型有 GitRepository、HelmRepository 以及 Bucket 等。
- 应用配置:对 Kustomize 可以是 path 和 patches,对 Helm 可以是 valuesFrom 和 values。
- 部署目标:制品的部署位置,是集群和相应名称空间的组合。
所以 FluxApplication 的具体实现如下,包含了 Source 和 Config,由于 FluxCD 是一个多集群应用,一个部署目标对应一个应用配置,所以部署目标被包含在应用配置中。
type FluxApplicationSpec struct {
// Source represents the ground truth of the FluxCD Application
Source *FluxApplicationSource `json:"source,omitempty"`
// Config represents the Config of the FluxCD Application
Config *FluxApplicationConfig `json:"config"`
}
Controller
application-controller 和 status-controller 是管理 FluxCD 多集群应用的具体实现。以下是 FluxCD Helm 应用的示意图:

application-controller负责 reconcile 自定义的多集群应用,解析自定义的 CR 然后转换成底层 FluxCD 的 CR 去驱动 FluxCD 的kustomize-controller或helm-controller去应用的部署。- 可以为同一个
HelmTemplate添加不同的应用配置和部署配置然后部署到多个集群中,还可以使用 FluxCD 的pause和resume功能,单独控制某个集群内应用的启停。 status-controller使底层 FluxCD 应用状态透出到上层 gitops.kubesphere.io/application CR 中。
可视化界面
应用创建
为了使体验过 KubeSphere GitOps 功能的用户感到熟悉,我们在基础信息配置标签中选择和 ArgoCD 保持一致。虽然在应用配置和部署配置中 FluxCD 和 ArgoCD 存在相似之处,但是为了可维护性并且突出 FluxCD 的特点,我们重新设计了部署设置标签页,并且正在迭代之中。

- 在类型这一栏中,可以选择 HelmRelease 或者 Kustomization。在以后模板 API 全部开发完成之后,用户可以在此处选择模板类型,然后就可以选择保存的模板并将该模板部署到任意集群。

- 在配置这一栏里可以配置 Chart 和 ValuesFiles,现阶段如果需要配置 ValuesFiles 要使用分号将路径隔开,如:
./helm-chart/values.yaml;./helm-chart/aliyun-values.yaml;并且可以选择是否将此配置保存为模板。 - 在部署这一栏中,用户可以为每一个部署位置配置不同的 Values、ValuesFrom 以及高级设置。Values 可以是任意 json 类型,是
helm install xxx --set后面加的参数,例如:ports.traefik.expose=true;而 ValuesFrom 是 FluxCD 特有的内容,是一个类型为 ConfigMap 或 Secret 的数组,可以让用户更灵活的注入参数,用户可以单击标签选择类型:

- 为了满足高级用户的需求并且照顾到刚接触 GitOps 的用户,我们提供了高级设置。现阶段的高级设置包括:同步间隔、ReleaseName、StorageNamespace 以及原生的 Helm 操作参数。和 Helm 的原生操作类似,例如经常使用的安装命令
helm install xxx --create-namespace中的--create-namespace的 flag 就可以通过设置安装参数createNamespace=True来达到相同的效果,如果你熟悉 Helm,你一定能够在这里找到熟悉的感觉,因为 FluxCD 的 helm-controller 内部就是使用了原生的 helm 库来完成对应的操作。

应用管理
在创建好一个 FluxCD 应用之后,在持续部署的主页可以看到创建的应用的概要预览,其中包括应用的类型(HelmRelease|Kustomization)、源(GitRepository|HelmRepository|Bucket)、版本以及就绪个数,就绪个数的意思是,当选择将应用部署至多个位置时应用的就绪情况,例如将应用部署至三个集群内,其中两个集群中的应用已经处于 Ready 状态,另外一个集群内的应用还处于 Reconciling 的状态时,就绪个数为 2/3。用户还可以对该应用进行信息编辑,Yaml 编辑以及删除等操作。

点击应用名称可以进入应用详情页,在应用详情页可以看到应用的状态、部署位置、以及消息等内容,该部分会持续完善。

Demo
demo 视频的前端采用 kubesphere/console PR-3761;后端采用 kubesphere/ks-devops master branch。
Demo Video
本文由博客一文多发平台 OpenWrite 发布!
FluxCD 多集群应用的设计与实现的更多相关文章
- dubbo源码解析五 --- 集群容错架构设计与原理分析
欢迎来我的 Star Followers 后期后继续更新Dubbo别的文章 Dubbo 源码分析系列之一环境搭建 博客园 Dubbo 入门之二 --- 项目结构解析 博客园 Dubbo 源码分析系列之 ...
- 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?
作者 | 蚂蚁金服技术专家 沧漠 关注『阿里巴巴云原生』公众号,回复关键词"1024",可获取本文 PPT. 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器 ...
- 新闻实时分析系统-HBase分布式集群部署与设计
HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...
- 新闻网大数据实时分析可视化系统项目——6、HBase分布式集群部署与设计
HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...
- HBase分布式集群部署与设计
先是把cdh版本的hbase上传上来 把安装吧的权限设置一下 解压 把没用的东西干掉 hbase的官网 配置文件 到hbase-site.xml 下面我不基于HA配置了 把hbase分发到其他两个节点 ...
- RabbitMQ学习系列(六): RabbitMQ 高可用集群
前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...
- smartroute简单集成集群聊天通讯
在制定一个规模比较多大的聊天应用时,往往需要制定部署多个应用服务,其一可以保障服务的可靠性,其二可以增加用户负载量.但制定这样一种应用体系是一件复杂的事情,毕竟同一群体的用户实际上会在不同的服务器接入 ...
- Rabbitmq集群高可用测试
Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...
- Mongodb集群【三】
Mongodb常用三种集群 1 主从(Master/Slave) 不推荐,但是mongodb依然保留有.一主多从,不支持链式结构.简单主从,没有裁仲者不能自动恢复. 2 副本集(Relica Set) ...
- Rabbitmq集群
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 Rabbitmq集群高 ...
随机推荐
- ×被替换成x 的解决办法
今天写代码遇到一个很有趣的问题: 在php中使用echo 输出url的时候当url中包含×字段时就会被html直接解析成 x (乘号)这样一来我返回的地址就不能正常访问url了: 解 ...
- 图片热区。vue3+ts和vue3+js写法(js没写完数据,功能完善)
废话不多说,上代码 vue3+ts <!-- 热区组件 --> <template> <el-dialog v-model="dialog_visible&qu ...
- debian10环境安装rtpengine
操作系统 :debian 10.13_x64 rtpengine版本:10.5 最新的debian12环境可通过apt直接安装rtpengine,但工作中有时候还会涉及到debian10这样的老系统, ...
- P4823 [TJOI2013] 拯救小矮人
感觉这个题的操作很新奇,做个记录. P4823 [TJOI2013] 拯救小矮人 大概题面: 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决 定搭一个人梯.即:一个小矮人站在另一小矮人 ...
- IDEA 忽然无法打开某个特定文件
背景:IDEA中双击打开一个.py文件时,弹出一个文件类型的弹窗(没注意是什么,估计是不小心按到了什么快捷键),当时随便选的Text,结果不知道为什么,这个文件无法在IDEA中打开(之前都正常) 由于 ...
- ServletConfig 类和ServletContext 类
ServletConfig 类 ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类. Servlet 程序和 ServletConfig 对象都是由 Tomcat ...
- 【YashanDB知识库】oracle dblink varchar类型查询报错记录
问题单:Oracle DBLINK查询崖山DB报错 oracle服务器上ODBC安装 unixodbc安装:yum -y install unixODBC mysql 配置安装对应版本的odbc: m ...
- 前端解决Long类型精度丢失的问题
问题 数据库数据: 前端得到的数据: 出现了Long类型的数据出现精度丢失问题! 原因 JS中Long最大值:9007199254740992 JAVA中Long最大值:922337203685477 ...
- Angular 18+ 高级教程 – Change Detection & Ivy rendering engine
前言 不熟悉 Angular 的朋友可能不了解 Change Detection 和目前当火的 Signal 之间的关系,以至于认为现在应该要学习新潮流 Signal 而不是已经过时的 Change ...
- 手撸MQ消息队列——循环数组
队列是咱们开发中经常使用到的一种数据结构,它与栈的结构类似.然而栈是后进先出,而队列是先进先出,说的专业一点就是FIFO.在生活中到处都可以找到队列的,最常见的就是排队,吃饭排队,上地铁排队,其他就不 ...