Argo CD初體驗

chester·chen發表於2024-09-08

什麼是 Argo CD?

Argo CD 是一個宣告式的 GitOps 持續交付工具,用於 Kubernetes 叢集。它透過持續監控 Git 倉庫中的 Kubernetes 資源配置檔案,將這些配置自動應用到指定的 Kubernetes 叢集中,確保叢集的實際狀態與倉庫中的配置保持一致。Argo CD 支援各種 Kubernetes 清單格式,如 Kustomize、Helm Charts、Ksonnet、YAML 和 JSON,允許你透過 Git 倉庫管理和部署 Kubernetes 資源。

Argo CD 的好處

  1. 宣告式管理:Argo CD 採用宣告式的管理方式,開發者只需在 Git 倉庫中定義好應用的期望狀態,Argo CD 就會自動將叢集的實際狀態與之同步。這樣可以減少人為錯誤,並使配置管理更加清晰和可審計。

  2. GitOps 工作流:Argo CD 將 Git 倉庫作為配置管理的唯一真理來源(Source of Truth),實現了 GitOps 的最佳實踐。每一次應用的部署或更新都透過提交程式碼和合並請求觸發,從而保證了自動化和稽核跟蹤。

  3. 持續同步和自愈:Argo CD 能夠持續監控 Kubernetes 叢集中的資源狀態,並在檢測到任何偏離期望狀態的情況時自動糾正,使叢集的狀態始終與 Git 倉庫中的配置一致。

  4. 多叢集支援:Argo CD 可以管理多個 Kubernetes 叢集,使得跨叢集的應用部署和管理更加容易。

  5. 細粒度訪問控制:Argo CD 提供了細粒度的訪問控制機制,允許基於角色的訪問控制(RBAC)以及透過 SSO 整合來控制對特定專案和應用的訪問許可權。

Argo CD 與 Jenkins 的對比

功能Argo CDJenkins
架構 專注於 Kubernetes 叢集的宣告式部署 通用的 CI/CD 工具,支援多種程式語言和環境
GitOps 支援 內建支援 GitOps 工作流,Git 是唯一的真理來源 需要透過外掛或自定義指令碼來支援 GitOps 工作流
部署自動化 自動同步 Kubernetes 資源配置,持續保持叢集一致性 透過流水線(pipeline)手動配置部署過程
可觀測性和回滾 內建監控和自動回滾功能 透過第三方工具或外掛實現
外掛支援 提供基礎功能,無需大量外掛 透過外掛擴充套件功能,外掛種類豐富
CI/CD 整合 專注於 CD 部分,通常與 Argo Workflows 等其他工具整合使用 既支援 CI 又支援 CD,整合度較高

使用 Argo CD 部署一個服務

接下來我們將展示如何使用 Argo CD 部署一個簡單的服務。假設我們要在 Kubernetes 叢集中部署一個 Nginx 服務。

1. 安裝 Argo CD

首先,我們需要在 Kubernetes 叢集中安裝 Argo CD:

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

安裝完成後,可以透過以下命令獲取 Argo CD API Server 的外部訪問地址:

kubectl get svc -n argocd

2. 訪問 Argo CD

你可以透過 port-forward 訪問 Argo CD 的 Web 介面:

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

然後在瀏覽器中訪問 https://localhost:8080。預設的使用者名稱是 admin,可以透過以下命令獲取初始密碼:

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

3. 建立 Git 倉庫並推送配置

在 GitHub 或其他 Git 服務上建立一個新倉庫,並將以下內容儲存為 nginx-deployment.yaml 檔案,推送到你的 Git 倉庫中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

4. 使用 YAML 檔案定義 Argo CD 應用

建立一個新的 YAML 檔案 argo-nginx-app.yaml,並將以下內容新增到其中:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nginx-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: '<YOUR_GIT_REPOSITORY_URL>'
    targetRevision: HEAD
    path: '<YOUR_APP_PATH>'
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

<your-username><your-repo> 替換為你的 GitHub 使用者名稱和倉庫名。

5. 應用 YAML 檔案

透過以下命令將 Argo CD 應用的定義檔案應用到 Kubernetes 叢集:

kubectl apply -f argo-nginx-app.yaml

6. 驗證部署

回到 Argo CD 的 Web 介面,你應該能看到名為 nginx-app 的應用。如果狀態為 “Synced”,說明部署已經成功。

你也可以透過以下命令在 Kubernetes 中驗證 Nginx 服務是否正常執行:

kubectl get pods -l app=nginx
kubectl get svc nginx-service

總結

Argo CD 是一個強大的 Kubernetes 持續交付工具,能夠簡化和自動化 Kubernetes 叢集中的應用管理。透過 GitOps 工作流,Argo CD 使得應用部署和配置更具透明性和可追溯性。與 Jenkins 等傳統 CI/CD 工具相比,Argo CD 更專注於 Kubernetes 環境,尤其適合微服務和容器化應用的持續交付。