使用 Argo CD 实现 GitOps

介紹

Argo CD 是一個流行的開源實現,用於在 Kubernetes 頂部進行 GitOps 持續交付。您的應用程序、定義、配置和環境應該是聲明性的並且受版本控制。同時,應用程序部署和生命周期管理應該是自動化的、可審核的並且易於理解。所有這些都可以使用 Argo 實現。

Argo CD 遵循相同的 GitOps 模式和原則,因此使用聲明性方法來維護您的集群狀態。同步通過 Git 存儲庫進行,其中存儲了您的 Kubernetes 清單。Kubernetes 清單可以通過幾種方式指定:

  • Kustomize 應用程序。
  • Helm 圖表。
  • Ksonnet 應用程序。
  • Jsonnet 文件。
  • YAML/json 清單的普通目錄。
  • 配置為配置管理插件的任何自定義配置管理工具。

像 Kubernetes 集群中运行的每个应用程序一样,Argo CD 通过存储在 YAML 清单中的自定义资源定义(CRD)进行配置。其中最重要的一个是 Application CRD。在 Argo CD 应用程序中,您定义应使用哪个 Git 存储库来同步哪个 Kubernetes 集群。它可以是部署了 Argo CD 的相同 Kubernetes 集群,也可以是外部的一个。

Argo CD 被实现为一个 Kubernetes 控制器,它持续监视运行中的应用程序,并将当前(或实时)状态与目标状态(如在 Git 存储库中指定的)进行比较。其实时状态与目标状态不符的已部署应用程序被视为 OutOfSync。Argo CD 报告并可视化差异,同时提供自动或手动将实时状态同步回目标状态的功能。

Argo CD 提供许多功能,其中最值得注意的包括:

  • 支持多个配置管理/模板工具,如:KustomizeHelmKsonnetJsonnetplain-YAML
  • 管理和部署到多个集群的能力。
  • SSO 集成(OIDCOAuth2LDAPSAML 2.0GitHubGitLabMicrosoftLinkedIn)。
  • 多租户和 RBAC 授权策略。
  • 应用程序资源的健康状态分析。
  • 回滚/在Git存储库中提交的任何应用程序配置中的任何地方进行回滚。
  • 自动化配置漂移检测和可视化。
  • 提供应用程序活动实时视图的Web UI。
  • 用于自动化和CI集成的CLI。
  • Webhook集成(GitHub,BitBucket,GitLab)。
  • PreSync、Sync、PostSync钩子,以支持复杂的应用程序部署(例如蓝/绿色和金丝雀升级)。
  • Prometheus指标。

在本教程中,您将学习如何:

  • 使用Helm为您的DOKS集群提供Argo CD
  • 使用GitOps原则,使您的Kubernetes集群应用程序状态与Git存储库同步。
  • 通过Argo CD部署和管理应用程序。

完成本教程中的所有步骤后,您应该拥有一个部署了Argo CDDOKS集群,它将:

  • 通过Application CRDs处理集群协调。
  • 使用应用程序CRDs内定义的Helm源处理Helm发布。

DOKS 和 Argo CD 用於 Helm 發佈的概觀

下面的圖表顯示了 Argo CD 如何管理使用 Git 存儲庫托管的 Helm 應用程序:

目錄

先决条件

完成本教程,您需要:

  1. A working DOKS cluster that you have access to. Please follow the Starter Kit DOKS Setup Guide to find out more.to find out more.
  2. A GitHub repository and branch, to store Argo CD and your applications manifests. Must be created beforehand.
  3. A Git client, for cloning the Starter Kit repository.
  4. Kubectl CLI,用於與 Kubernetes 互動。遵循這些 指示 來使用 kubectldoctl 連接到您的集群。
  5. Argo CLI,使用命令行界面與 Argo CD 進行交互。
  6. Kubeseal,用於加密密鑰和 Sealed Secrets Controller 互動。
  7. Helm,用於管理 Argo CD 的發布和升級(選擇性,但通常建議在生產系統中使用)。

了解 Argo CD 概念進行應用部署

Argo CD 使用 Application 核心概念來管理應用程式部署和生命週期。在 Argo CD 應用程式清單中,您定義了托管應用程式定義的 Git 存儲庫,以及相應的 Kubernetes 叢集來部署應用程式。換句話說,Argo CD 應用程式定義了源代碼庫與 Kubernetes 叢集之間的關係。這是一個非常簡潔和可擴展的設計,您可以將多個源(Git 存儲庫)和相應的 Kubernetes 叢集關聯起來。

A major benefit of using applications is that you don’t need to deploy Argo to each cluster individually. You can use a dedicated cluster for Argo, and deploy applications to all clusters at once from a single place. This way, you avoid Argo CD downtime or loss, in case other environments have issues or get decommissioned.

此外,您可以將類似的應用程式分組到一個 Project 中。Project 允許對應用程式進行邏輯分組,並與多個團隊一起使用時,也可以分配相應的角色/權限。如果未指定,每個新應用程式都屬於 default 專案。default 專案會自動創建,並且沒有任何限制。可以修改默認專案,但不能刪除。

起始套件 使用 默認 項目,快速啟動使用 Argo CD。然後,您將學習如何為每個 起始套件組件 創建一個 應用程序,並使用 Helm 圖表 作為 應用程序來源。Argo CD 不僅限於 Helm 來源,您還可以利用 KustomizeKsonnetJsonnet 等的強大功能。請查看 應用程序來源 頁面以獲取更多詳細信息。

雖然您可以使用 Argo CD 的圖形 UI(Web 接口)創建應用程序,但起始套件依賴於 GitOps 声明式方式,通過 YAML 構建文件。每個 YAML 配置都充當每個應用程序的配方,因此它可以存儲在 Git 存儲庫中。這意味著,如果您重新創建環境或移至另一個集群,您始終可以重建您的 Argo CD 設置。更重要的是,您可以通過 Git 歷史來執行審計並跟踪每個更改。最佳實踐是將 Argo CD 配置文件存儲在單獨的 Git 存儲庫中,而不是用於應用程序開發的存儲庫。您可以從 Argo CD 官方文檔網站上的最佳 實踐頁面 中閱讀有關此主題的更多信息。

重要提示:
需要牢记的重要一点是,默认情况下,Argo CD 不会自动同步您的新应用程序。当首次创建 ArgoCD 应用程序时,其状态为 OutOfSync。这意味着 ArgoCD 应用程序指向的 Git 存储库状态与 Kubernetes 集群状态不匹配。创建新的 ArgoCD 应用程序不会触发目标集群上的自动部署。

要启用自动同步和删除孤立资源(修剪),您需要创建一个 syncPolicy。您还可以配置 Argo CD 自动恢复通过 kubectl 进行的手动更改。您可以在官方文档网站上阅读有关 自动同步策略 的更多信息。

使用 Git 存储库源的典型 Application CRD 如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: my-apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

上述配置的解释:

  • spec.project: 告诉 Argo CD 为应用程序使用哪个项目(在此示例中为 default)。
  • spec.source.repoURL: 用于同步集群状态的 Git 存储库 URL。
  • spec.source.targetRevision: 用于同步的 Git 存储库修订版本(也可以是分支或标签名称)。
  • spec.source.path: 存储源文件(YAML 清单)的 Git 存储库路径。
  • spec.destination.server: 目标 Kubernetes 集群地址。通常指向 https://kubernetes.default.svc,如果 Argo CD 使用部署它的同一集群。
  • spec.destination.namespace:用於您的應用程式的 Kubernetes 命名空間。
  • spec.syncPolicy.automated:啟用集群中應用程式與 Git 存儲庫的自動同步。
  • spec.syncPolicy.automated.prune:Prune 指定是否刪除在自動同步中不再在來源中找到的集群資源。
  • spec.syncPolicy.automated.selfHeal:指定是否在集群中手動修改資源時(例如通過 kubectl)將資源恢復到其所需的狀態。

您還可以使用 Helm 存儲庫作為在集群中安裝應用程式的來源。典型的使用 Helm 存儲庫源安裝應用程式的 Application CRD 如下(與 Git 存儲庫示例類似,只是改為使用 Helm 圖表存儲庫):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    chart: sealed-secrets
    repoURL: https://bitnami-labs.github.io/sealed-secrets
    targetRevision: 2.4.0
    helm:
      releaseName: sealed-secrets
      values: |
        replicaCount: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: kubeseal

上述配置的解釋:

  • spec.source.chart:要用作應用程式來源的 Helm 圖表。
  • spec.source.repoURL:Helm 圖表存儲庫 URL。
  • spec.source.targetRevision:用於應用程式的 Helm 圖表版本。
  • spec.source.helm.releaseName:要在您的 Kubernetes 集群中創建的 Helm 發布名稱。
  • spec.source.helm.values:指定要傳遞給 helm 模板的 Helm 值,通常定義為一個區塊。
  • spec.destination.server:目標 Kubernetes 集群地址。如果 Argo CD 使用部署它的相同集群,通常指向 https://kubernetes.default.svc
  • spec.destination.namespace:Kubernetes 命名空間,用於您的應用程式。

請繼續閱讀有關 Argo CD 核心概念 的官方文件網站。接下來,您將發現可用的安裝選項,以在您的 Kubernetes 叢集中部署 Argo CD。

安裝 Argo CD

Argo CD 可以使用 kubectlHelm 進行安裝:

  1. 使用 kubectl 和安裝清單文件。此方法不提供對各種安裝參數的直接控制。如果您對基於 Helm 的安裝不太熟悉,這是開始使用的最直接選擇。
  2. Helm 基於安裝。提供對 Argo CD 應用程式部署和生命週期的更精細控制。建議用於 HA(高可用性)配置和如果 Argo CD 用於 生產

接下來,根據您想要的功能,您有兩個選擇:

  • 多租戶 模式。此類安裝通常用於為組織中的多個應用程式開發團隊提供服務,並由平台團隊維護。最終用戶可以通過 API 伺服器 使用 Web UIargocd CLI 訪問 Argo CD。
  • 核心 僅模式。這是一個簡化安裝,沒有圖形用戶界面、API 服務器、SSO 等,並安裝每個組件的輕量級(非 HA)版本。

Starter Kit 正在使用 多租戶高可用性 模式在您的 DOKS 集群中安裝 Argo CD。這樣,您將擁有一個可靠的設置並探索所有可用的功能,包括用戶界面。請訪問安裝方法文檔頁面,獲取有關該主題的更多信息。

基於 Kubectl 的安裝

此方法需要 kubectl,並且是一個兩步過程:

  1. 創建一個 命名空間,以部署 Argo CD 本身。
  2. 通過 kubectl 運行 HA 安裝清單。

請按照以下命令運行:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

現在,請繼續檢查安裝是否成功。首先,檢查所有 Argo CD 部署是否正常:

kubectl get deployments -n argocd

輸出看起來類似於(檢查 READY 列 – 所有 Pods 必須正在運行):

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 51s argocd-dex-server 1/1 1 1 50s argocd-notifications-controller 1/1 1 1 50s argocd-redis-ha-haproxy 3/3 3 3 50s argocd-repo-server 2/2 2 2 49s argocd-server 2/2 2 2 49s

Argo CD 服務器在 HA 模式下必須具有 replicaset 的最小值為 2。如果由於某些原因某些部署未能正常工作,請檢查受影響組件 Pods 的 Kubernetes 事件和日誌。

基於 Helm 的安裝

此方法需要在您的本地機器上安裝 Helm。Starter Kit 提供了一個準備好的 Helm values 文件供您開始使用,並在 HA 模式下安裝 Argo CD(不包括自動縮放)。

請按照以下步驟完成基於 Helm 的安裝:

  1. 首先,克隆 Starter Kit 目錄(如果尚未),並將目錄更改為您的本地副本:
git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers
  1. 接下來,添加 Argo CD Helm 存儲庫:
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo 
  1. 現在,搜索可用於安裝的 argo Helm 存儲庫中的圖表:
helm search repo argo

輸出類似於:

Output
NAME CHART VERSION APP VERSION DESCRIPTION argo/argo 1.0.0 v2.12.5 A Helm chart for Argo Workflows argo/argo-cd 4.9.4 v2.4.0 A Helm chart for Argo CD, a declarative, GitOps... ...
  1. 然後,使用您選擇的編輯器(最好支持 YAML lint)打開並檢查 Starter Kit 存儲庫中提供的 Argo CD Helm values 文件。例如,您可以使用 VS Code
code 14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v4.9.4.yaml
  1. 最後,將 Argo CD 部署到您的 DOKS 集群:
HELM_CHART_VERSION="4.9.4"
helm install argocd argo/argo-cd --version "${HELM_CHART_VERSION}" \
  --namespace argocd \
  --create-namespace \
  -f "14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v${HELM_CHART_VERSION}.yaml"

–create-namespace \

注意:
使用了 Helm 圖表的 特定 版本。在這種情況下,選擇了 4.9.4 版本,它對應應用程序的 2.4.0 版本。通常,鎖定到特定版本是一個良好的做法。這有助於獲得可預測的結果,並通過 Git 實現版本控制。

helm ls -n argocd

現在,檢查 Helm 發布是否成功:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
argocd  argocd          1               2022-03-23 11:22:48.486199 +0200 EET    deployed        argo-cd-4.9.4   v2.4.0

輸出看起來類似於(STATUS列的值應設置為deployed):

kubectl get deployments -n argocd

最後,驗證 Argo CD 應用程序的部署狀態:

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 2m9s argocd-dex-server 1/1 1 1 2m9s argocd-notifications-controller 1/1 1 1 2m9s argocd-redis-ha-haproxy 3/3 3 3 2m9s argocd-repo-server 2/2 2 2 2m9s argocd-server 2/2 2 2 2m9s

輸出看起來類似於(檢查READY列 – 所有Pods必須正在運行):

Argo CD 服務器的replicaset最小值必須為2,以便進入HA模式。如果出於某些原因,一些部署不健康,請檢查受影響組件 Pod 的 Kubernetes 事件和日誌。

您還可以通過訪問社區維護的存儲庫來獲取有關 Argo CD Helm 圖表的更多信息。

接下來,您將學習如何訪問並探索由 Argo CD 提供的圖形用戶界面的主要功能。

訪問和探索 Argo CD Web 介面

Argo CD提供的一個很棒的功能是網絡界面,用於執行各種管理任務和查看應用程序部署狀態。您可以使用圖形用戶界面創建應用程序並以各種方式與Argo CD進行交互。另一個重要功能是檢查每個應用程序的狀態並訪問Kubernetes事件,以及您的應用程序日誌。此外,Argo CD還提供了每個應用程序部署正在使用的所有Kubernetes對象(副本集、Pod等)的可視表示。

kubectl port-forward svc/argocd-server -n argocd 8080:443

通過端口轉發Kubernetes服務argocd-server,可以訪問Web界面。請在Shell終端中運行以下命令:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

現在,打開Web瀏覽器,並導航到localhost:8080(請暫時忽略無效的TLS證書)。您將會看到Argo CD登錄頁面。默認的管理員用戶名是admin,密碼在安裝時隨機生成。您可以運行以下命令獲取它:

接下來,您將被重定向到應用程序儀表板頁面。從這裡,您可以通過UI查看、創建或管理應用程序(還提供了一個YAML編輯器),以及執行同步或刷新操作:

如果您點擊任何應用程序圖塊,還將顯示所有涉及對象的可視表示:

在下一部分,您可以管理應用程序項目、存儲庫和集群:

最後,用戶信息部分顯示可用用戶並允許管理員密碼更新:

你可以玩弄并详细探索每个部分和子部分,以查看所有可用的功能。接下来,您将学习如何使用名为 argocd 的CLI对应项。

了解 Argo CD CLI

argocd
Usage:
  argocd [flags]
  argocd [command]

Available Commands:
  account     Manage account settings
  admin       Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
  app         Manage applications
  cert        Manage repository certificates and SSH known hosts entries
  cluster     Manage cluster credentials
  completion  output shell completion code for the specified shell (bash or zsh)
  context     Switch between contexts
  gpg         Manage GPG keys used for signature verification
  help        Help about any command
...

Argo CD允许通过Web界面或CLI使用相同的功能集。要使用 argocd CLI,您需要打开一个单独的shell窗口,然后只需键入 argocd,不带任何参数。默认情况下,它会显示可用的命令和选项:

argocd app --help

对于任何命令或子命令,您都可以使用以下模式调用相应的帮助页面:argocd <command/subcommand> --help。例如,如果您想要检查 app 命令的可用选项:

Manage Applications
Usage:
  argocd app [flags]
  argocd app [command]

Examples:
  输出类似于:
  argocd app list
  
  # 列出所有应用程序。
  argocd app get my-app
...

# 获取应用程序的详细信息

请继续探索其他命令/子命令,以查看所有可用的选项。接下来,您将学习如何引导您的第一个Argo CD应用程序,该应用程序将自动部署所有Starter Kit组件。

啟動 Argo CD 應用程式

在新安裝的情況下,Argo CD 不知道從哪裡同步您的應用程式,或者可用於源應用程式清單的 Git 存儲庫是什麼。因此,第一步是執行一次稱為啟動的操作。您可以使用 argocd CLI 或圖形用戶界面執行本節中介紹的所有操作。

有多種啟動群集的方式(例如,通過腳本),但通常,Argo CD 用戶會使用 app of apps 模式。這意味著您將通過使用 good CLI(或 Web 介面)創建一個父應用程序,該應用程序將引用並啟動 Kubernetes 集群中其餘的應用程序。

準備 Git 存儲庫佈局

clusters
└── dev
    └── helm
        ├── cert-manager-v1.8.0.yaml
        ├── nginx-v4.1.3.yaml
        ├── prometheus-stack-v35.5.1.yaml
        ├── sealed-secrets-v2.4.0.yaml
        └── velero-v2.29.7.yaml

首先,您需要準備您的 Git 存儲庫以使用一致的佈局。在以下示例中,您將創建一個類似於的 Git 存儲庫佈局結構:

  1. 請打開終端並按照以下步驟為您的 Git 存儲庫創建佈局:
git clone <YOUR_ARGOCD_GIT_REPOSITORY_ADDRESS>
  1. 首先,克隆您用於測試 Argo CD 的 git 存儲庫(請確保相應地替換 <> 佔位符):
cd <YOUR_GIT_REPO_LOCAL_COPY_DIRECTORY>
mkdir -p clusters/dev/helm
  1. 接下來,將目錄更改為您的本地副本並創建目錄結構(請確保相應地替換 <> 佔位符):
CERT_MANAGER_CHART_VERSION="1.8.0"
NGINX_CHART_VERSION="4.1.3"
PROMETHEUS_CHART_VERSION="35.5.1"
SEALED_SECRETS_CHART_VERSION="2.4.0"
VELERO_CHART_VERSION="2.29.7"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml" > "clusters/dev/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/nginx-v${NGINX_CHART_VERSION}.yaml" > "clusters/dev/helm/nginx-v${NGINX_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml" > "clusters/dev/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml" > "clusters/dev/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/velero-v${VELERO_CHART_VERSION}.yaml" > "clusters/dev/helm/velero-v${VELERO_CHART_VERSION}.yaml"
  1. 複製提供的每個組件在 Starter Kit 存儲庫中的應用程序清單(您也可以查看並了解每個清單的結構):

最後,提交更改並推送到原始碼庫。

接下來,您將創建父應用程序部署,並讓 Argo CD 自動將所有 Starter Kit 應用程序同步到您的 DOKS 集群。

使用 Argo CD CLI 的 App of Apps 模式

在本節中,您將學習如何使用 argocd CLI 創建並使用 app of apps 模式來在您的 DOKS 集群中部署所有 Starter Kit 組件。下圖顯示了主要概念:

kubectl port-forward svc/argocd-server -n argocd 8080:443

首先,您需要在本地機器上的單獨終端窗口中對 Argo CD 主服務器進行端口轉發:

ADMIN_USER="admin"
ADMIN_PASSWD="$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)"
argocd login localhost:8080 --username $ADMIN_USER --password $ADMIN_PASSWD --insecure

接下來,argocd CLI 需要訪問 Argo CD API 服務器才能工作。在另一個終端窗口中,您需要使用以下命令對argocd客戶端進行身份驗證,以連接到您的 Argo CD 服務器實例:

Output
'admin:login' logged in successfully Context 'localhost:8080' updated

輸出看起來類似於:

argocd app create starter-kit-apps \
    --dest-namespace argocd \
    --dest-server https://kubernetes.default.svc \
    --repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
    --path clusters/dev/helm

然後,請運行以下命令來創建starter-kit-apps父應用程式(請確保相應替換<>佔位符):

  • –dest-namespace argocd \
  • –dest-server https://kubernetes.default.svc \
  • 上述命令將在argocd命名空間中創建一個名為starter-kit-apps的新Argo CD 應用程式,配置為:

將目標設置為與 Argo CD 部署的同一 Kubernetes 集群,因為--dest-server設置為https://kubernetes.default.svc

argocd app sync starter-kit-apps 

使用--repo參數設置的 GitHub 存儲庫來同步您的集群。

Output
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd sealed-secrets-controller OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd velero OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd ingress-nginx OutOfSync Missing ... ... GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE argoproj.io Application argocd sealed-secrets-controller Synced application.argoproj.io/sealed-secrets-controller created argoproj.io Application argocd ingress-nginx Synced application.argoproj.io/ingress-nginx created argoproj.io Application argocd kube-prometheus-stack Synced application.argoproj.io/kube-prometheus-stack created argoproj.io Application argocd velero Synced application.argoproj.io/velero created argoproj.io Application argocd cert-manager Synced application.argoproj.io/cert-manager created

掃描並應用在clusters/dev/helm目錄中找到的所有應用程序清單(--path參數)。

接下來,您需要同步starter-kit-apps應用程序(請記住,除非明確指定,否則 Argo CD 默認不同步任何內容):

argocd app list

輸出看起來類似於:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY ... ingress-nginx https://kubernetes.default.svc ingress-nginx default OutOfSync Missing Auto-Prune ... cert-manager https://kubernetes.default.svc cert-manager default OutOfSync Missing Auto-Prune ... kube-prometheus-stack https://kubernetes.default.svc monitoring default OutOfSync Missing Auto-Prune ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default OutOfSync Missing Auto-Prune ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune ...

在上述命令完成后,您應該會在 Argo CD 伺服器的主控台上看到一個新應用程式。請打開瀏覽器並導航至 http://localhost:8080。然後選擇 應用程式 選項卡,並點擊 starter-kit-apps 磚塊(請注意組合圖中的 應用程式的應用程式 模式):

argocd app sync -l argocd.argoproj.io/instance=starter-kit-apps

您也可以通過 CLI 檢查新的應用程式:

輸出類似於:

argocd app list

父應用程式 starter-kit-apps 將顯示為已同步,但子應用程式將不同步。接下來,您可以通過 Web 介面或 CLI 進行同步操作:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS ... ingress-nginx https://kubernetes.default.svc ingress-nginx default Synced Healthy Auto-Prune <none> ... cert-manager https://kubernetes.default.svc cert-manager default Synced Healthy Auto-Prune <none> ... kube-prometheus-stack https://kubernetes.default.svc monitoring default Synced Healthy Auto-Prune <none> ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default Synced Healthy Auto-Prune <none> ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune SyncError ...

同步操作可能需要一段時間才能完成(甚至可能需要 5-10 分鐘),具體取決於部署的所有應用程式的 Kubernetes 物件的複雜性和數量。

過一段時間後,請再次列出所有應用程式:

argocd app create starter-kit-apps \
  --dest-namespace argocd \
  --dest-server https://kubernetes.default.svc \
  -repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
  --path clusters/dev/helm \
   --sync-policy automated \
  --auto-prune \
  --self-heal
  • 輸出類似於(請注意現在所有應用程式都已同步):
argocd app get velero

Velero 應用程式部署將會失敗並且故意保留在 SyncError 狀態,以便讓讀者練習並學習如何診斷 Argo CD 中的應用程式問題。請參考下面的 提示 區段,了解如何診斷 Argo CD 應用程式問題。

引導啟動父應用程式是一次性操作。對於每個應用程式的後續 Git 變更,Argo CD 將檢測漂移並應用所需的變更。Argo CD 默認使用 輪詢機制 來檢測 Git 儲存庫中的變更。默認的 刷新間隔 設置為 3 分鐘。您也可以利用 Git Webhook 的功能,而不是依賴輪詢機制。請訪問官方文件網站,了解如何創建和配置 Argo CD 以使用 Git Webhook

Output
Name: velero Project: default Server: https://kubernetes.default.svc Namespace: velero URL: https://argocd.example.com/applications/velero Repo: https://vmware-tanzu.github.io/helm-charts Target: 2.27.3 Path: SyncWindow: Sync Allowed Sync Policy: Automated (Prune) Sync Status: OutOfSync from 2.27.3 Health Status: Missing CONDITION MESSAGE LAST TRANSITION SyncError Failed sync attempt to 2.27.3: one or more objects failed to apply (dry run) (retried 5 times). 2022-03-24 12:14:21 +0200 EET GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE velero.io VolumeSnapshotLocation velero default Failed SyncFailed PostSync error validating data: ValidationError(VolumeSnapshotLocation.spec): missing required field "provider" in io.velero.v1.VolumeSnapshotLocation.spec velero.io BackupStorageLocation velero default Failed SyncFailed PostSync error validating data: [ValidationError(BackupStorageLocation.spec.objectStorage): missing required field "bucket" in io.velero.v1.BackupStorageLocation.spec.objectStorage, ValidationError(BackupStorageLocation.spec): missing required field "provider" in io.velero.v1.BackupStorageLocation.spec] ...

提示:如果希望自動配置父應用程式進行同步(同時啟用自我修復和自動修剪),您可以使用以下命令(不要忘記相應地替換 <> 佔位符):

–dest-namespace argocd \

–dest-server https://kubernetes.default.svc \

–sync-policy automated \

–auto-prune \

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

在任何同步失敗的情況下,您都可以通過檢查相應應用程式的 Kubernetes 事件來解決(通過argocd app get <application_name>):

輸出類似於:

  • 接下來,您將學習如何使用應用程式的應用程式模式,並通過 Argo CD 圖形用戶界面執行相同的步驟。
  • 通過 Argo CD Web 界面使用 App of Apps 模式
  • 在本部分中,您將學習如何使用 Argo CD Web 界面來創建和使用應用程式的應用程式模式,以在您的 DOKS 集群中部署所有 Starter Kit 組件。下圖說明了主要概念:
  • 正如上圖所示,通過 Web 界面引導新應用程式與 CLI 對應的操作非常相似。唯一的區別在於您將在不同的面板/窗口之間導航並使用點擊操作。在幕後,Argo CD 將創建所需的應用程式 CRD 並將更改應用到您的 Kubernetes 集群中。
  • 首先,請打開 Web 瀏覽器並登錄到 Argo CD Web 控制台。默認用戶名為admin,默認密碼可通過以下方式獲取:
  • 一旦登录,您将被重定向到应用程序仪表板页面(在新安装中,仪表板为空)。 接下来,点击创建应用程序按钮。 一个新面板弹出,要求输入应用程序细节:
  • 请适当填写每个字段:

应用程序名称:新应用程序名称(例如starter-kit-apps)。

项目:此应用程序所属的项目名称(第一次使用 Argo CD 时,您可以使用default)。

同步策略同步选项:配置同步策略和选项(例如手动自动,重试次数,重试之间的间隔等)。

存储库 URL:您的 GitHub 存储库 URL 地址 – 例如https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git

路径:存储应用程序清单的 GitHub 存储库目录路径(例如clusters/dev/helm)。

目标集群 URL:与您的 GitHub 存储库同步的目标 Kubernetes 集群(例如https://kubernetes.default.svc,用于部署 Argo CD 的本地集群)。

目标命名空间:用于 Argo CD 应用程序的目标 Kubernetes 集群命名空间(通常为argocd)。

填写所有应用程序详细信息后,点击顶部的创建按钮。 仪表板页面上显示一个新的应用程序磁贴:

如果您點擊應用程式圖塊,您可以觀察到app of apps pattern,通過查看組合圖:

如果您查看上面的圖片,您會注意到所有應用程式都標記為OutOfSync。下一步是在父應用程式上觸發同步操作。然後,所有子應用程式也將同步。請繼續按下父應用程式圖塊上的Sync按鈕。右側將彈出一個新面板(請注意,下面所有子應用程式都被選中):

保留默認值,然後按上方的Synchronize按鈕,觀看Argo CD如何將同步操作串聯到所有應用程式:

Velero應用程式部署將失敗並故意保留在SyncError狀態,作為讓讀者熟悉並學習如何診斷Argo CD應用程式問題的練習。請查閱下面的Hints部分,了解如何診斷Argo CD應用程式問題。

如果一切順利,所有應用程序應該都具有綠色邊框,狀態應該為健康同步。引導過程是一次性操作。對於每個應用程序的後續Git更改,Argo CD將檢測偏移並應用所需的更改。Argo CD默認使用輪詢機制來檢測Git存儲庫中的更改。默認的刷新間隔設置為3分鐘。您也可以利用Git Webhook的強大功能,而不是依賴輪詢機制。請訪問官方文檔網站以了解如何創建和配置Argo CD以使用Git Webhooks

提示:
如果需要,您可以通過將 SYNC POLICY 字段值設置為 Automatic 來自動同步父應用程序。要啟用自我修復和自動修剪,請勾選 PRUNE RESOURCES SELF HEAL 复選框:

在任何同步失敗的情況下,您都可以查看該應用程序的Kubernetes事件。使用Web界面,您可以導航到受影響的應用程序磚塊:

然後,從應用程式頁面標頭的 LAST SYNC RESULT 部分中點擊以紅色標記的 Sync failed 訊息連結。一個新的面板彈出,顯示有關同步操作失敗的有用信息:

  • 在下一節中,您將學習如何使用單個CRD(Custom Resource Definition)來管理多個應用程序 – ApplicationSet
  • 使用 Argo CD 應用程序集

應用程序集是 Argo CD 提供的另一個強大功能。 ApplicationSet 控制器是 Argo CD 的一個子項目,通過模板化定義添加應用程序自動化。此功能可幫助您在應用程序清單中避免重複(利用DRY原則)。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app
spec:
  generators:
    - list:
        elements:
          - cluster: dev
            url: https://kubernetes.dev.svc
          - cluster: qa
            url: https://kubernetes.qa.svc
          - cluster: prod
            url: https://kubernetes.prod.svc
  template:
    metadata:
      name: '{{cluster}}-app'
    spec:
      project: default
      source:
        repoURL: https://github.com/myrepo/my-applicationset.git
        targetRevision: HEAD
        path: clusters/{{cluster}}/my-apps
      destination:
        server: '{{url}}'
        namespace: argocd

ApplicationSet 控制器安裝在 Argo CD 旁邊(在同一個命名空間內),並根據新的 ApplicationSet 自訂資源(CR)的內容自動生成 Argo CD 應用程序。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-app
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-applicationset.git
    targetRevision: HEAD
    path: clusters/dev/my-apps
  destination:
    server: https://kubernetes.dev.svc
    namespace: argocd

注意:
從 Argo CD 的版本 2.3.x 開始,您無需單獨安裝 ApplicationSet 控制器,因為它是 Argo CD 主要安裝的一部分。 Starter Kit 使用 version >= 2.3.1,因此您無需做任何更改。

ApplicationSet 的主要概念是基於擁有一個值列表作為 generator,以及一個template,該模板通過輸入列表值進行填充。對於列表中的每個項目,都按順序生成一個新的應用程序模板。基本上,您定義了一個 ApplicationSet CRD,然後讓它根據輸入值為您生成您想要的任意多個 ArgoCD Application CRD。因此,您不需要創建和處理多個 Application manifests,而是通過一個single manifestApplicationSet 來管理所有事務。

這個概念還通過使用帶有參數的應用程序模板簡化了multi-clustermulti-environment設置的管理。Application set還包括其他生成器,除了List Generators外:

Cluster generator:使用Argo CD定義的集群來模板化應用程序。

argocd app delete starter-kit-apps

Git generator:使用Git存儲庫的文件/目錄來模板化應用程序。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
...

典型的ApplicationSet CRD使用List Generator,如下所示:

將上述ApplicationSet應用於您的Kubernetes集群將呈現三個Argo CD應用程序。例如,dev環境應用程序顯示如下:

模板引擎在性质上非常强大,提供了许多可能性。请访问主要的ApplicationSet文档网站,了解更多关于这个功能的信息。

卸载 Argo CD 应用程序

通过从 Git 存储库源中删除相应的清单来完成对由 Argo CD 管理的应用程序的卸载(或删除)。对于使用应用程序集模式创建的应用程序,您只需要删除父应用程序(通过 CLI 或 Web 界面)。然后,所有子应用程序将作为流程的一部分被删除。

  • 如何使用argocd CLI 删除starter-kit-apps父应用程序(包括子应用程序):
  • 如果您希望在删除父应用程序时确保子应用程序及其所有资源也被删除,请确保向您的应用程序定义中添加适当的finalizer

Source:
https://www.digitalocean.com/community/developer-center/implementing-gitops-using-argo-cd