當前位置: 妍妍網 > 碼農

【運維幹貨分享】如何在 Kubernetes 上部署 Argo CD [初學者指南]

2024-09-26碼農

在這篇部落格中,我們將使用分步說明在 Kubernetes 上安裝 Argo CD。

安裝後,我們將了解如何以 GitOps 方式部署範例應用程式。我們將使用 git 儲存庫透過 ArgoCD 部署應用程式。

我們還將研究如何配置 github webhook,以便在配置的 git 儲存庫發生更改後立即啟用同步過程。

設定先決條件

要開始設定,你應該具備以下條件。

  • 一個正在執行的 Kubernetes 集群

  • Kubectl 配置了具有集群管理員許可權的集群。

  • Helm 在你的工作站上安裝了配置..

  • 讓我們開始設定。

    使用 Manifest 檔設定 ArgoCD

    在 Kubernetes 上設定 ArgoCD 的最簡單方法是使用 Argo 計畫 Github 儲存庫中提供的普通 Kubernetes 清單檔。

    你可以將此清單部署用於學習目的。如果要為計畫需求設定 ArgoCD,請使用下一節中給出的 helm 圖表。

    我們將在名為 argocd 的自訂名稱空間中部署 ArgoCD

    以下 kubectl 命令將建立名稱空間並部署清單

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

    它建立了許多與ArgoCD相關的Kubernetes物件 - Namespace scoped & cluster scoped resources

    關鍵物件是 Argocd 服務、部署和狀態集、ClusterRoles、Configmap 和 Secrets。

    它還建立了 Argo CD 自訂資源,如應用程式、應用程式集和應用程式計畫

    你可以使用以下埠守護命令在我們的工作站中存取 ArgoCD UI。

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

    由於將自簽名證書添加到 ArgoCD 伺服器,你將收到 SSL 錯誤。你可以單擊 繼續 存取 UI。

    要登入 UI,你需要使用者名稱和密碼。

    預設使用者名稱為 admin。要獲取密碼,請執行以下命令。

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

    登入後,你將獲得 ArgoCD 伺服器儀表板,如下所示。

    你可以使用以下命令清理設定。

    kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

    使用官方 Helm Chart 設定 ArgoCD

    如果你出於計畫目的設定 ArgoCD,我們強烈建議你使用 Helm 圖表而不是普通清單檔進行設定。

    按照以下步驟使用官方 Argoproject helm 圖表設定 ArgoCD。

    第 1 步:添加 argo cd repo 將 Argo CD repo 添加到你的系統中,以下載 helm chart 來設定 Argo CD。執行以下命令以添加儲存庫

    helm repo add argo https://argoproj.github.io/argo-helm

    現在,使用命令列出每個帶有單詞 argo 的儲存庫

    helm search repo argo

    你將獲得帶有單詞 argo 的儲存庫列表,如下所示。我們需要的圖表是 argo-cd

    你可以使用下面給出的命令將 argo-cd Helm 圖表轉換為 Kubernetes 清單。這允許你瀏覽與 Helm 圖表關聯的所有配置。當將 Helm Chart 用於計畫目的時,這一點尤其重要。

    helm template argo argo/argo-cd --output-dir argocd-manifests

    此 helm chart 部署以下 argocd 元件。

  • argocd 應用程式控制器 (Statefulset):Argo CD 的核心元件,負責管理和同步部署在 Kubernetes 集群中的應用程式(協調)與 Git 中的所需狀態

  • argocd 應用程式集 (Deployment):一個控制器,用於根據樣版自動生成和管理 Argo CD 應用程式。

  • argocd 通知(部署):將有關 Argo CD 事件的通知發送到各種渠道,例如電子信件、Slack 或 Webhook。

  • argocd reposerver (部署):管理 Git 儲存庫並提供用於存取和同步應用程式清單的 API 的元件。

  • argocd 伺服器(部署):公開 Argo CD API 並為管理應用程式和配置的 Web UI 提供服務的主要元件。

  • dex 伺服器 (部署):它是一個身份提供商,可以與 Argo CD 整合,以便與外部身份提供商(OIDC 提供商)(如 GitHub、SAML 等)進行使用者身份驗證和授權。

  • Redis (Deployment) :用於緩存以減少發送到 Kube API 和 Git 提供商的請求。

  • 步驟 2:自訂 Helm Chart 配置值 在部署之前,你需要更新 helm chart 中的 NodePort 配置,以便你可以在瀏覽器中存取 Argo CD UI,為此,請使用以下命令將 helm chart 的預設值保存在 YML 檔中。

    helm show values argo/argo-cd > values.yaml

    在服務配置塊中進行更改。將型別從 ClusterIP 更改為 NodePort,如下圖所示。它負責公開 Argo CD 伺服器 UI。預設的 nodePort 為 30080。你也可以對其進行自訂。

    透過將型別更改為 NodePort,你可以在瀏覽器上使用 URL <你的 k8s 節點的公有/私有 IP>:

    存取瀏覽器上的 Argo CD。

    確保使用你在 values.yml 檔中提到的相同節點埠號。

    以下是此 Helm 圖表中使用的影像。

  • quay.io/argoproj/argocd

  • ghcr.io/dexidp/dex

  • 公共.ecr.aws/docker/library/redis 如果你想在計畫環境中設定 ArgoCD,而無法存取這些公共登錄檔,則可能需要將它們上傳到相關的內部登錄檔,然後使用自訂值執行 helm chart。

  • 你還可以使用以下命令下載每個檔的整個 helm 圖表

    helm fetch argo/argo-cd

    此命令將下載 .tgz 包中 helm chart 的每個檔,執行以下命令以解壓檔

    tar -zxvf argo-cd-<version>.tgz

    現在,你可以看到包中打包的每個檔。

    第 3 步:部署 Argo CD 在部署 Argo CD 之前,使用命令

    kubectl create namespace argocd

    現在,使用以下命令將 Argo CD 部署到上面建立的名稱空間中

    helm install --values values.yaml argocd argo/argo-cd --namespace argocd

    成功部署後,你應該會看到以下輸出。

    使用命令驗證是否已建立並成功執行所有物件。

    kubectl get all -n argocd 第 4 步:登入 Argo CD Web UI 你可以使用以下命令透過埠轉發存取 Web UI。

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

    如果你存取 http://localhost:8080 你將能夠存取 webUI。你需要接受自簽名證書才能存取控制台。

    此外,我們還在 30080 上啟用了 NodePort

    你可以使用集群中任何節點的公有 IP 或私有 IP,節點埠號的格式為

    。在我的例子中,URL 將是 34.71.163.101:30080

    現在,使用 URL 在瀏覽器中存取 UI,你將看到以下視窗

    使用使用者名稱和密碼登入 Argo CD。

    你的預設使用者名稱將是 admin,要獲取密碼,請執行以下命令

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

    此命令將顯示你的 Argo CD 密碼,使用密碼並登入 Argo CD UI。

    登入後,你可以看到 Argo CD 的主界面,如下所示

    使用 ArgoCD 從 GitHub 部署應用程式 (GitOps Way)

    現在我們已經準備好了 ArgoCD 設定,我們可以測試一個 Nginx 部署,該部署在 NodePort 32000 上公開的 Index 頁面中顯示自訂訊息。

    我們在 Argo CD Guide 儲存庫中有 Nginx 部署檔。

    https://github.com/techiescamp/argocd-guide

    清單按以下方式組織在 nginx-deployment 資料夾下。

    ➜ nginx-deployment
    ├── configmap.yaml
    ├── deployment.yaml
    └── service.yaml

    在 Argo CD 儀表板中,按 + NEW APP 按鈕配置儲存庫。

    將彈出一個新視窗,將 Application Name 指定為 nginx-deployment,將 Project Name 指定為 default,並將 SYNC POLICY 設定為 automatic 或 manual 根據需要。

    如果將 設定為 automatic,則 Argo CD 會自動檢測 Git 儲存庫中所做的更改並觸發部署,或者如果將 SYNC POLICY 設定為 manual,則必須手動觸發它才能啟動部署。SYNC POLICY

    預設情況下,自動同步使用輪詢來尋找 git 儲存庫中發生的更改。預設輪詢間隔為 3 分鐘 (180 秒)。它是 helm chart 中的一個可配置選項。你可以根據同步要求修改 timeout.reconciliation。

    此外,啟用 AUTO-CREATE NAMESPACE 選項,以便在名稱空間不存在時建立名稱空間。

    此外,還有其他 SYNC POLICY 選項,請根據你的需要啟用它們。

    現在,添加源資訊,即你的 Git 儲存庫 URL,以及 YML 檔的路徑。

    然後,選擇 Cluster URL,當你選擇 Cluster URL 索引標籤時將顯示該 URL。選擇 https://kubernetes.default.svc,因為我們正在將應用程式部署在部署 Argo CD 的同一集群上。

    此外,將名稱空間指定為 webserver。現在點選 建立 按鈕,如下所示。

    當你單擊 create 按鈕時,它將同步儲存庫清單並部署它。你可以在控制台中檢視部署資訊,如下所示。

    單擊應用程式可檢視有關你的部署的詳細資訊,如下所示。

    為了驗證我們的部署,讓我們嘗試存取 NodePort 32000 上的 Nginx 部署。你應該會看到如下所示的頁面。

    配置 Github Webhook

    盡管 Argo CD 會持續監控 Git 的更改,但同步更改會有時間延遲,為了消除時間延遲,我們可以使用 webhook,一旦在 Git 中進行更改,它就會觸發同步過程。

    讓我們看看如何在 Argo CD 上配置 webhook。

    首先,轉到你使用 Argo CD 配置的 Git 儲存庫,然後轉到

    Setting->Webhooks->Add webhook,如下圖所示以配置 Webhook。

    按下 Add webhook 按鈕後,你可以看到如下所示的配置視窗。

    負載 ULR 將是附加了 /api/webhook 的 ArgoCD webUI 終端節點。即

    /api/webhook

    例如,https://34.71.163.101:30080/api/webhook。

    將 Content type (內容型別) 更改為 application/json,並根據需要提供 Secret。

    現在,如果你為 Argo CD 使用 SSL 證書,請選擇 Enable SSL verification,如果你未使用 SSL 證書,請選擇 Disable。

    然後選擇要觸發 webhook 的事件,它會根據你選擇的事件觸發 webhook。

    按 Add webhook 按鈕為你的 Argo CD 添加 webhook 配置,你可以看到 webhook 已添加,如下所示

    透過選擇它,你可以看到 hook 建立的觸發器,如下所示

    ArgoCD 設定最佳實踐

    以下是在為生產使用案例執行 ArgoCD 時需要遵循的一些最佳實踐。

  • 標準做法是每個環境(dev、stage、prod)執行一個 Argo CD 例項,以避免潛在的沖突。

  • 確保啟用 RBAC 以限制對 ArgoCD 例項的存取,以遵循最小許可權原則。根據角色和職責對使用者進行分類,並定期對其進行稽核。

  • 定期修補 ArgoCD 映像以避免安全漏洞。

  • 備份 ArgoCD 配置,用於災難恢復和備份目的。

  • 使用 Prometheus 等工具針對部署失敗、資源限制等事件設定監控和警報。

  • Argo CD 配置常見問題解答

    ArgoCD 如何儲存數據?由於 Argo CD 是一個無狀態的應用程式,它不需要任何卷來儲存數據。所有數據都儲存為 Kubernetes 物件。因此,最終所有 ArgoCD 數據都儲存在 kubernet 的 etcd 中。此外,它還使用 Redis 作為一次性緩存。