基於Jenkins + Argo 實現多叢集的持續交付

kubesphere發表於2024-03-20

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

相關文章