作者:周靖峰,青雲科技容器顧問,雲原生愛好者,目前專注於 DevOps,雲原生領域技術涉及 Kubernetes、KubeSphere、Argo。
前文概述
前面我們已經掌握瞭如何透過 Jenkins + Argo CD 的方式實現單叢集的持續交付,明白了整個 CI/CD 過程中不同工具在流水線中的關係。所以接下來我們將更深入的瞭解 Argo CD 的特性。
前文連結:KubeSphere DevOps 基於 Jenkins + Argo 實現單叢集的持續交付實踐。
KubeSphere 配置
叢集配置
這裡我們需要準備至少 2 個叢集,並且需要開啟多叢集元件、DevOps 元件。
因為 KubeSphere 已經內建了 Argo,所以只要被 KubeSphere 所管理的叢集會自動註冊上 Argo。
DevOps 配置
這裡我們依舊要準備一個 Git 倉庫, 這裡仍然是使用我們之前的倉庫例子。
https://github.com/Feeeenng/devops-maven-sample.git
不過需要注意,這次我們需要選擇 multi-cluster
分支。
Argo CD 部分
ApplicationSet
這裡主要介紹 ArgoCD 的一個控制器 ApplicationSet controller
。
此控制器追加了對跨多叢集以及 monorepos
的支援。該專案以前是一個獨立專案,後在 Argo CD v2.3 版本中合入主分支。
ApplicationSet 控制器主要應用場景:
- 透過 Argo CD 單一 Kubernetes 資源管理應用釋出多叢集;
- 單一 Kubernetes 資源釋出一個 Git 或者多個 Git 倉庫來部署多個應用;
- 增加了 monorepos 的支援;
- 多租戶叢集模式下,提高了單個叢集租戶使用 Argo CD 部署能力。
Generators
ApplicationSet 主要透過 generators
來實現對資源的定義, 透過 template
來實現引數值的替換。目前主要支援以下幾種:
- List generator:基於叢集名/URL 值的固定列;
- Cluster generator:基於 Argo CD 自定義方式;
- Git generator:基於 Git 儲存中包含的檔案或資料夾;
- Matrix generator:基於上述兩種生成器的組合方式。
更多的方式參考地址:
https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/
實踐操作
這次我們使用 List generator 的方式生成配置模版。
程式碼目錄 deploy 下包含一個檔案 applicationset.yaml
。
# 採用 List generator 方式進行生成
# 叢集資訊都注入在配置裡面
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: devops-maven-sample
spec:
generators:
- list:
elements:
- cluster: dev
url: https://kubernetes.default.svc
- cluster: test
url: https://172.31.73.92:6443
開啟 OnDeletion 配置
preserveResourcesOnDeletion
參數列示刪除 ApplicationSet 資源以後,透過模版自動生成出來的 Application 一併刪除。
請注意,生產環境不建議開啟這個引數!
syncPolicy:
preserveResourcesOnDeletion: true
更多模版配置參考:
https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/
配置同步策略
配置 Application CRD 同步策略。
CreateNamespace 自動建立 namespace。
PrunePropagationPolicy 刪除採用友好刪除方式策略。
prune 預設情況下,Argo CD 考慮安全機制不會自動同步 Git 資源變更操作,這裡手動開啟。確保當我們 Git 進行變更以後,Argo 會自動進行 Git 修改部署資源。
syncPolicy:
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
automated:
prune: true
更多描述檢視地址:
https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/
模版定義
透過上述 List generator 的定義引數,對應好模版,這種型別都屬於 Key/Values 型別。
source:
repoURL: https://github.com/Feeeenng/devops-maven-sample.git
targetRevision: multi-cluster
path: deploy/{{cluster}}
destination:
server: '{{url}}'
namespace: multi-demo
最後執行流水行以後,等待流水線執行完畢。Argo 自動進行 GitOps 觸發管理同步。
然後進入 KubeSphere 介面,配置 Argo 設定為 NodePort 型別 觀察 web 介面。
開啟 Argo CD UI 介面,這裡我配置了 Argo CD 對接 KubeSphere 的 LDAP。
所以可以透過 KubeSphere 的賬號密碼進行登入。如果沒有配置的話,預設密碼需要執行下面命令進行檢視。
kubectl get secret -n argocd argocd-initial-admin-secret
這個時候我們能夠看到,我們剛才透過 Jenkins pipeline 執行的流水線已經成功。並且 Argo CD 也已經自動同步釋出應用。
回到 KubeSphere 介面上觀察應用部署情況能夠看到,我們所釋出的 2 個叢集也已經正常部署完成。
Dev 叢集:
Test 叢集:
至此,我們使用 Jenkins 完成了透過 Argo CD 來部署多叢集的應用釋出。
後續
當前例子使用的是簡單的列表生成器的方式,但 ApplicationSet 的控制器其實也支援更多複雜的場景。比如透過 Git Generator 的方式只定義一個配置引數,滿足多個應用的釋出支援。這樣也能夠把應用程式碼跟配置程式碼進行分離。從而開發跟運維互不影響。
參考文件:
- https://argo-cd.readthedocs.io/en/stable/
- https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/
- https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/
- https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/
- https://github.com/Feeeenng/devops-maven-sample
本文由部落格一文多發平臺 OpenWrite 釋出!