天天看點

ArgoCD 簡明教程

1 Argo CD 簡介

Argo CD 是一個為 Kubernetes 而生的,遵循聲明式 GitOps 理念的持續部署(CD)工具,它的配置和使用非常簡單,并且自帶一個簡單易用的 Dashboard 頁面,并且支援多種配置管理/模闆工具(例如 Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)。Argo CD 被實作為一個 Kubernetes 控制器,它持續監控正在運作的應用程式并将目前的實時狀态與所需的目标狀态(例如 Git 倉庫中的配置)進行比較,在 Git 倉庫更改時自動同步和部署應用程式。

2 架構圖

Argo CD

在 CI/CD 流程中的位置如下圖所示,Argo CD 的主要職責是 CD(Continuous Delivery,持續傳遞),将應用部署到 Kubernetes 等環境中,而 CI(Continuous Integration,持續內建)主要是交給 Jenkins,Gitlab CI 等工具來完成。

ArgoCD 簡明教程

這裡簡單介紹一下

GitOps

的概念,GitOps 這個詞出現于 2017 年,是由

Weaveworks

公司根據多年雲計算基礎設施和應用程式管理經驗而提出的一個概念,它是一種進行 Kubernetes 叢集管理和應用程式傳遞的方式,GitOps 使用 Git 作為聲明性基礎設施和應用程式的單一事實來源。

GitOps 的核心思想是擁有一個 Git 倉庫,包含目标環境中目前所需基礎設施的聲明性描述,以及使目标環境與 Git 倉庫中描述的狀态相比對的自動化過程,Argo CD 就是一個遵循了 GitOps 理念的持續部署(CD)工具。

在 GitOps 模式的 CI/CD 流水線包含以下幾個流程:

  • 1.将應用的 Git 倉庫分為 Application Deployment file 和 Docker file 兩個庫。Docker file 用于存放應用的核心代碼以及 Docker build file,後續将會直接打包成 Docker image;Application Deployment file 可以 Kustomize、Helm、Ksconnet、Jsonnet 等多種 Kubernetes 包管理工具來定義;以 Helm 為例,Chart 中所使用到的 Image 由 Docker file Code 打包完成後提供。
  • 2.使用 Jenkins 或 Gitlab 等 CI 工具進行自動化建構打包,并将 Docker image push 到 Harbor 鏡像倉庫。
  • 3.使用 Argo CD 部署應用。Argo CD 可以獨立于叢集之外,并且支援管理多個 Kubernetes 叢集。在 Argo CD 上配置好應用部署的相關資訊後 Argo CD 便可以正常工作,Argo CD 會自動和代碼倉庫 Application deployment file 的内容進行校驗,當代碼倉庫中應用屬性等資訊發生變化時,Argo CD 會自動同步更新 Kubernetes 叢集中的應用;應用啟動時,會從 Harbor 鏡像倉庫拉取 Docker image。

本文主要介紹第 3 部分 Argo CD 部署應用,關于 GitOps 的完整實踐後續會發文進行介紹。

3 快速開始

3.1 前提條件

3.2 安裝 Argo CD

使用以下指令在 argocd 命名空間部署 Argo CD。

# 建立命名空間
kubectl create namespace argocd 
# 部署 argo cd
wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -n argocd -f install.yaml      

3.3 安裝 Argo CD CLI

Argo CD CLI 是用于管理 Argo CD 的指令行工具,不同作業系統具體的安裝方式可以參考 [Argo CD CLI Installation] (https://argo-cd.readthedocs.io/en/stable/cli_installation/)

Mac 系統可以直接使用 brew install 進行安裝。

brew install argocd      

3.4 釋出 Argo CD 服務

預設情況下, Argo CD 服務不對外暴露服務,可以通過 LoadBalancer 或者 NodePort 類型的 Service、Ingress、Kubectl 端口轉發等方式将 Argo CD 服務釋出到 Kubernetes 叢集外部。

這裡使用以下指令通過 NodePort 服務的方式暴露 Argo CD 到叢集外部。

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'      

現在我們已經将名字為 argocd-server 的 Service 改成 NodePort 類型了,可以在叢集外部通過 <節點 IP>:<随機生成的 NodePort 端口> 來通路 Argo CD,我這裡随機生成的 NodePort 端口是 32313。

$ kubectl get svc -n argocd 
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
argocd-dex-server       ClusterIP   10.68.51.140    <none>        5556/TCP,5557/TCP,5558/TCP   5m11s
argocd-metrics          ClusterIP   10.68.76.255    <none>        8082/TCP                     5m11s
argocd-redis            ClusterIP   10.68.223.131   <none>        6379/TCP                     5m11s
argocd-repo-server      ClusterIP   10.68.1.35      <none>        8081/TCP,8084/TCP            5m11s
argocd-server           NodePort    10.68.49.24     <none>        80:30582/TCP,443:32313/TCP   5m11s
argocd-server-metrics   ClusterIP   10.68.107.188   <none>        8083/TCP                     5m10s      

浏覽器輸入 https://<節點 IP>:32313 通路 Argo CD。

ArgoCD 簡明教程

3.5 擷取 Argo CD 密碼

預設情況下

admin

帳号的初始密碼是自動生成的,會以明文的形式存儲在 Argo CD 安裝的命名空間中名為

argocd-initial-admin-secret

的 Secret 對象下的

password

字段下,我們可以用下面的指令來擷取:

kubectl -n argocd get secret \
argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# 傳回結果
kj8bDMiDTnsEfnjg      

在浏覽器輸入密碼登入 Argo CD。

ArgoCD 簡明教程
ArgoCD 簡明教程
❯ argocd login <節點 IP>:32313
# 接收證書風險
WARNING: server certificate had error: x509: cannot validate certificate for 11.8.38.43 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username:  # 輸入使用者名
Password: # 輸入密碼
'admin:login' logged in successfully      

3.6 準備 Git 倉庫

在 Gitlab 上建立項目,取名為 argocd-lab,為了友善實驗将倉庫設定為 public 公共倉庫。在倉庫中建立 quickstart 目錄,在目錄中建立兩個 yaml 資源檔案,分别是 myapp-deployment.yaml 和 myapp-service.yaml。

ArgoCD 簡明教程

yaml 資源檔案内容如下:

# myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/public-namespace/myapp:v1
        name: myapp
        ports:
        - containerPort: 80
 
# myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32060
  type: NodePort
  selector:
    app: myapp      

實驗所需的鏡像我已經在阿裡雲的鏡像倉庫中準備好了,大家可以直接使用。

3.7 建立 Argo CD App

首先建立一個命名空間 devops 用于 Argo CD 部署應用。

kubectl create ns devops      

3.7.1 方式一:使用 UI 建立 App

  • Application Name: 自定義的應用名。
  • Project: 使用預設建立好的 default 項目。
  • SYNC POLICY:同步方式,可以選擇自動或者手動,這裡我們選擇手動同步。
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
root@cluster01-1:/root #kubectl get all -n devops 
NAME                         READY   STATUS    RESTARTS   AGE
pod/myapp-865f9f464f-qpjbc   1/1     Running   0          2m25s
NAME            TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/myapp   NodePort   10.68.93.5   <none>        80:32060/TCP   2m25s
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   1/1     1            1           2m25s
NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-865f9f464f   1         1         1       2m25s      

在叢集外部通過

<節點 IP>:<NodePort>

端口通路 myapp 程式,可以看到此時是 v1 版本。

ArgoCD 簡明教程

3.7.2 方式二:使用 CLI 建立 APP

argocd app create myapp2 \
--repo http://11.8.36.29/root/argocd-lab.git \
--path quickstart --dest-server \
https://kubernetes.default.svc \
--dest-namespace devops      

使用 argocd 指令檢視建立的應用。

# 列出應用
❯ argocd app list
NAME   CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                   PATH        TARGET
myapp  https://kubernetes.default.svc  devops     default  Synced  Healthy  <none>      <none>      http://11.8.36.29/root/argocd-lab.git  quickstart  main
# 檢視 myapp 應用
❯ argocd app get myapp
Name:               myapp
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          devops
URL:                https://11.8.36.159:32313/applications/myapp
Repo:               http://11.8.36.29/root/argocd-lab.git
Target:             main
Path:               quickstart
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to main (82baed1)
Health Status:      Healthy
GROUP  KIND        NAMESPACE  NAME   STATUS  HEALTH   HOOK  MESSAGE
       Service     devops     myapp  Synced  Healthy        service/myapp created
apps   Deployment  devops     myapp  Synced  Healthy        deployment.apps/myapp created      

3.7.3 方式三:使用 YAML 檔案建立

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
  namespace: argocd
spec:
  destination:
    namespace: devops # 部署應用的命名空間
    server: https://kubernetes.default.svc # API Server 位址
  project: default # 項目名
  source:
    path: quickstart # 資源檔案路徑
    repoURL: http://11.8.36.29/root/argocd-lab.git # Git 倉庫位址
    targetRevision: main # 分支名      

3.8 版本更新

這次我們将 myapp 應用從手動同步改成自動同步。點選 APP DETAILS -> SYNC POLICY,點選 ENABLE AUTO-SYNC。

ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程
ArgoCD 簡明教程

4 參考資料

  • [Argo CD 官方文檔] (https://argo-cd.readthedocs.io/en/stable/)
  • [GitOps 持續部署工具 Argo CD 初體驗] (https://blog.csdn.net/weixin_40046357/article/details/118447858)
  • [Argo CD 使用指南] (https://kubeoperator.io/docs/user_manual/argocd/)
  • [使用 GitLab CI 與 Argo CD 進行 GitOps 實踐] (https://cloud.tencent.com/developer/article/1664073?from=article.detail.1755628)
  • [在K8S中使用Argo CD做持續部署] (https://cloud.tencent.com/developer/article/1750692?from=article.detail.1664073)
  • [Pod 與 Service 的 DNS] (https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/)
  • [2021年25佳DevOps工具, 你用了幾個] (https://www.kubernetes.org.cn/9538.html)
  • [微服務 CI/CD 實踐-GitOps 完整設計與實作] (https://mp.weixin.qq.com/s/MN08YzdpDMYZ5xpQP1ECQQ)
  • [FluxCD, ArgoCD or Jenkins X: Which Is the Right GitOps Tool for You?] (https://blog.container-solutions.com/fluxcd-argocd-jenkins-x-gitops-tools)
  • [CI/CD是什麼?如何了解持續內建、持續傳遞和持續部署] (https://www.redhat.com/zh/topics/devops/what-is-ci-cd)
  • [當下最熱門的 GitOps,你了解嗎?] (https://cloud.tencent.com/developer/article/1588400)
  • [GitOps 應用實踐系列 - 綜述] (https://segmentfault.com/a/1190000040831398)