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

作者:周靖峯,青雲科技容器顧問,雲原生愛好者,目前專注於 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 的方式只定義一個配置參數,滿足多個應用的發佈支持。這樣也能夠把應用代碼跟配置代碼進行分離。從而開發跟運維互不影響。

參考文檔:

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章