大家好,我是張晉濤。
在上一篇『GitOps 應用實踐系列 - 綜述(一)』中,我介紹了 GitOps 的概念、如何工作以及基於 Pull 和 Push 的模型等內容。本篇,我們重點介紹用於實施 GitOps 的工具 ArgoCD 。
Argo CD 概覽
2020 年 4 月 7 日,CNCF Technical Oversight Committee (TOC) 投票通過 Argo 專案進入 CNCF 孵化。
其實 Argo 是在 2017 年由 Applatix 公司建立的(這家公司的主要產品和服務目前主要與 AWS 進行深度融合,當然也包括一些多雲的服務),2018 年初被 Intuit 收購。 之後,BlackRock 為 Argo 專案貢獻了 Argo Events 子專案。兩家公司都積極參與專案和社群的開發和培育中。
Argo 及其子專案提供了一種簡單的方法管理 Workflow,事件和應用程式。所有 Argo 工具都通過 CRD 的方式實現。他們可以使用或整合其他 CNCF 專案,如 gRPC、Prometheus、NATS、Helm 和 CloudEvents。
Argo 生態目前主要由四個子專案組成,包括:
- Argo Workflows -- 第一個 Argo 專案,是 Kubernetes 的原生工作流引擎,支援 DAG 和 step-based 的工作流;
- Argo Events -- Kubernetes 上的基於事件的依賴管理器,用於觸發 Kubernetes 中的 Argo 工作流和其他操作。
- Argo CD -- 是 Argo 社群和 Intuit 帶來的開源專案,支援基於 GitOps 的宣告性部署 Kubernetes 資源。
- Argo Rollouts -- 支援宣告式漸進式交付策略,例如 canary 、blue-green 和更多形式。
Argo CD 旨在提供一個宣告式持續交付 (CD) 工具。Argo CD 支援多種配置管理工具,包括 ksonnet /jsonnet,kustomize 和 Helm 等。Argo CD 擴充套件了宣告式和基於 Git 的配置管理的優勢,以在不影響安全性和合規性的情況下加速應用程式的部署和生命週期管理。
Argo CD 的適用場景
- 應用程式及其部署環境的配置是宣告性的,並且是版本可控的;
- 應用程式部署和生命週期管理簡單、可自動和可審計(企業友好);
- 應用程式部署快速、可靠和冪等;
- 需要檢測並糾正與版本控制配置的任何偏差;
- 回滾簡單;
Argo CD 的主要功能
- 可搭配使用各種配置管理工具(如 ksonnet/jsonnet、Helm 和 kustomize)使應用程式與 Git 中定義的保持一致;
- 將應用程式自動部署到指定的目標環境;
- 持續監控已部署的應用程式;
- 基於 Web 和 CLI 的操作,以及應用程式視覺化;
- 部署或回滾到 Git 倉庫中提交的應用程式的任何狀態(這也是使用 Git 進行版本管理的一大好處);
- PreSync、Sync、PostSync hooks 以支援複雜的應用程式部署策略(例如:blue/green 、canary upgrades);
- SSO 整合(OIDC、LDAP、SAML 2.0、GitLab、Microsoft、LinkedIn),這些是企業比較需要的功能;
- Webhook 整合(GitHub、BitBucket、GitLab)。
- 可以獨立使用,也可以作為現有 Pipeline 的一部分使用,例如與 Argo Workflow、Jenkins 以及 GitLab CI 等配合使用;
Argo CD 架構
從整體上看,Argo CD 有三個主要的組成部分:API Server 、Repository Server 、Application Controller。
API Server
Argo CD 的 API Server 是一個 gRPC/REST server,它公開 Web UI、CLI 以及一些其他場景需要用到的 API。
它主要進行以下幾個內容:
- 應用程式管理和狀態報告;
- 呼叫應用程式操作(例如:同步、回滾、使用者定義的操作);
- repository 和叢集 credential 管理(存 K8s secrets);
- 身份驗證和授權委託給外部身份認證元件;
- RBAC(Role-based access control 基於角色的訪問控制);
- Git webhook 事件的 listener/forwarder;
Repository Server
Repository Server 是一個內部服務,它負責儲存應用程式 Git 倉庫的本地快取,並負責生成和返回可供 Kubernetes 使用的 manifests,它接受的輸入資訊主要有以下內容:
- 倉庫地址(URL)
- revision(commit, tag, branch)
- 應用程式路徑
- 模板的特定設定:比如 helm values.yaml 等
Application Controller
Application Controller 是一個 Kubernetes controller,它持續監聽正在執行的應用程式並將當前的實時狀態與所需的目標狀態(如 repo 中指定的)進行比較。它檢測 OutOfSync 應用程式狀態並有選擇地採取糾正措施。它負責為生命週期事件(PreSync、Sync、PostSync)呼叫任何使用者定義的 hooks。
Argo CD 的主要特性
自2019年3月17號釋出了 v1.0.0 版本開始,到現在,Argo CD已經全面進入了 v2.x 時代,當前最新的版本是 v2.1.5。
在 2.0 中引入了Pods View功能、重寫了日誌視覺化、新增了通知橫幅功能、還有很多後臺操作及自定義操作,並且致力於打造 Argo CD Core (輕量級 Argo CD 發行版,僅打包核心 GitOps 功能,依賴Kubernetes API/RBAC 為 UI 和 CLI 提供支援)。
- Pods View :對於擁有數百個 Pod 的應用程式特別有用。它沒有視覺化應用程式的所有 Kubernetes 資源,而是僅顯示 Kubernetes pod 和密切相關的資源。
- 新日誌視覺化:支援分頁、過濾、禁用/啟用日誌流的能力,甚至為終端愛好者提供暗模式。支援檢視多個部署 Pod 的聚合日誌,Argo CD CLI 也支援日誌流。
- UI通知橫幅功能:使用ConfigMap 中的ui.bannercontent和ui.bannerurl屬性指定通知訊息和可選 URL argocd-cm。
- 後臺操作:資源的deletion/pruning、僅同步更改的資源、Prune Last、引入了對 Sealed-secrets、kubernetes-external-secrets 和 strimzi CRD 的健康檢查。
部署 Argo CD
Argo CD 有四種安裝方式:多租戶(multi-tenant)、 core 、自定義 、Helm。
多租戶(multi-tenant)
多租戶是 Argo CD 使用最多的部署方式。使用者可以使用 Web UI 或 argocd CLI 通過 API Server訪問 Argo CD 。
該 argocd CLI 必須先執行 argocd login <server-host>
命令。
argocd login SERVER [flags]
# Login to Argo CD using a username and password
argocd login cd.argoproj.io
# Login to Argo CD using SSO
argocd login cd.argoproj.io --sso
# Configure direct access using Kubernetes API server
argocd login cd.argoproj.io --core
在專案的 GitHub 倉庫中預設提供了兩種部署方式(manifests):
非高可用
這種型別的安裝通常用於演示和測試。(不推薦用於生產)
- install.yaml - 具有叢集管理員許可權的標準 Argo CD 安裝。可使用 Argo CD 在其執行的同一叢集中部署應用程式,當然也可以使用輸入的 credentials 部署到外部叢集。
- namespace-install.yaml - 只需要名稱空間級別的許可權(不需要叢集管理員許可權)。但這種安裝的話 Argo CD 不能在其所執行的同一叢集中部署應用程式,並且將僅依賴於輸入的外部叢集 credentials 。
注意:Argo CD CRD 不包含在 namespace-install.yaml 中 必須單獨安裝。CRD manifests 位於manifests/crds目錄中。使用以下命令安裝它們:
kubectl apply -k https://github.com/argoproj/argo-cd/manifests/crds\?ref\=stable
高可用
強烈建議生產環境使用高可用方式安裝。
bundle 包含相同的元件,但針對高可用性和彈性進行了調整。
- ha/install.yaml - 與上文中提到的 install.yaml 相同,但配置了相關元件的多個副本;
- ha/namespace-install.yaml - 與上文提到的 namespace-install.yaml 相同,但配置了相關元件的多個副本;
core
core 安裝最適合獨立使用 Argo CD 且不需要多租戶功能的叢集管理員。
此安裝包括較少的元件,並且更易於設定。bundle 不包括 API Server或 UI,並只安裝每個元件的輕量級(非 HA)版本。
使用者需要 Kubernetes 訪問許可權來管理 Argo CD。該 argocd CLI 必須使用下面的命令進行配置:
kubectl config set-context --current --namespace=argocd
argocd login --core
Web UI 也可以使用,可以使用以下命令啟動。
argocd admin dashboard
具體的 manifests 對應於倉庫中的 core-install.yaml 。
自定義安裝
Argo CD manifests 也可以使用自定義安裝。建議將 manifests 作為遠端資源包含在內,並使用 Kustomize 補丁應用其他自定義。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: argocd
resources:
- https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/ha/install.yaml
Helm
Argo CD 可以使用Helm安裝。Helm chart 目前由社群維護,訪問 https://github.com/argoproj/a... 獲取即可,此處不再新增示例。
Argo CD 的 Secret 管理
Argo CD 沒有明確限制 Secret 管理的方式。這裡羅列些 GitOps 的管理 Secret 的方式,對其他場景也適用:
- Hashicorp Vault 推薦,這是一種比較通用的方案,並且應用場景很廣泛。(https://www.vaultproject.io/)
- Bitnami Sealed Secrets 將 Secret 加密為可安全儲存的 SealedSecret,甚至可以儲存到公共庫中;SealedSecret 只能由執行在目標叢集中的控制器解密,其他人(甚至原作者)都無法從 SealedSecret 中獲取原始 Secret。(https://github.com/bitnami-la...);
- Banzai Cloud Bank-Vaults 為 Vault 提供各種工具,使 Hashicorp Vault 的使用和操作更容易。它是官方 Vault 客戶端的封裝,具有自動令牌更新和內建 Kubernetes 支援、基於Golang 的客戶端的動態資料庫憑據提供程式。它有一個 CLI 工具來自動初始化、解封和配置 Vault。它還提供了一個用於配置的 Kubernetes operator,以及一個用於注入機密的 mutating webhook。(https://github.com/banzaiclou...)
- Helm Secrets 與Argo CD的整合是從 helm-secrets v3.9.0 開始可用;
- argocd-vault-plugin 從各種 secrets 管理工具(HashiCorp Vault、IBM Cloud Secrets Manager、AWS Secrets Manager 等)中檢索 secrets 並將它們注入到 Kubernetes 資源中(https://github.com/IBM/argocd...);
- Kustomize secret generator plugins Kubernetes ConfigMaps和Secrets都是 key:value (KV) 對映。kustomize 有三種不同的方法來從本地檔案生成 secrets,詳細可檢視連結 。(https://github.com/kubernetes...)
- aws-secret-operator 一個 Kubernetes operator,可根據 AWS Secrets Manager 中儲存的內容自動建立和更新 Kubernetes secrets。aws-secret-operator 自定義資源將 AWS secrets對映到 Kubernetes 。(https://github.com/mumoshu/aw...)
- secrets-store-csi-driver 是一個利用 CSI 介面,將金鑰資訊掛載進 Pod 的工具。支援多種金鑰儲存方式,比如 Vault,GCP,AWS,Azure 等;
資源健康評估
Argo CD 為幾種標準的 Kubernetes 資源提供了內建的健康評估,然後將這些評估作為一個整體呈現在整體應用程式健康狀態中。
對以下幾種型別的 Kubernetes 資源進行檢查:
- Deployment,ReplicaSet,StatefulSet,DaemonSet
- Service
- Ingress
- PersistentVolumeClaim
- Argocd App
也可以新增自定義的健康檢查,Argo CD 支援用 Lua 編寫自定義健康檢查,支援兩種配置方式:
1) 在argocd-cm 這個 ConfigMap 中定義自定義健康檢查
可以在 argocd-cm
的 resource.customizations.health.<group_kind>
欄位中定義自定義健康檢查。
2) 捆綁到 Argo CD 中。自定義健康檢查指令碼位於 https://github.com/argoproj/a... 目錄中。
以上就是關於 Argo CD 的核心內容了,下一篇我們將進行 Argo CD 的實踐。歡迎大家繼續關注和反饋!
歡迎訂閱我的文章公眾號【MoeLove】