前言
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 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/524997.html
標籤:其他
