作者:周靖峯,青雲科技容器顧問,雲原生愛好者,目前專注於 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 發佈!