自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一起學習使用 Argo CD 實現(xiàn) GitOps

云計算 云原生
Argo CD 是通過 Kubernetes 控制器來實現(xiàn)的,它持續(xù) watch 正在運行的應用程序并將當前的實時狀態(tài)與所需的目標狀態(tài)( Git 存儲庫中指定的)進行比較。

Argo CD 是一個為 Kubernetes 而生的,遵循聲明式 GitOps 理念的持續(xù)部署工具。Argo CD 可在 Git 存儲庫更改時自動同步和部署應用程序。

Argo CD 遵循 GitOps 模式,使用 Git 倉庫作為定義所需應用程序狀態(tài)的真實來源,Argo CD 支持多種 Kubernetes 清單:

  • kustomize
  • helm charts
  • ksonnet applications
  • jsonnet files
  • Plain directory of YAML/json manifests
  • Any custom config management tool configured as a config management plugin

Argo CD 可在指定的目標環(huán)境中自動部署所需的應用程序狀態(tài),應用程序部署可以在 Git 提交時跟蹤對分支、標簽的更新,或固定到清單的指定版本。

架構

ArgoCD架構

Argo CD 是通過 Kubernetes 控制器來實現(xiàn)的,它持續(xù) watch 正在運行的應用程序并將當前的實時狀態(tài)與所需的目標狀態(tài)( Git 存儲庫中指定的)進行比較。已經(jīng)部署的應用程序的實際狀態(tài)與目標狀態(tài)有差異,則被認為是 OutOfSync 狀態(tài),Argo CD 會報告顯示這些差異,同時提供工具來自動或手動將狀態(tài)同步到期望的目標狀態(tài)。在 Git 倉庫中對期望目標狀態(tài)所做的任何修改都可以自動應用反饋到指定的目標環(huán)境中去。

下面簡單介紹下 Argo CD 中的幾個主要組件:

API 服務:API 服務是一個 gRPC/REST 服務,它暴露了 Web UI、CLI 和 CI/CD 系統(tǒng)使用的接口,主要有以下幾個功能:

  • 應用程序管理和狀態(tài)報告
  • 執(zhí)行應用程序操作(例如同步、回滾、用戶定義的操作)
  • 存儲倉庫和集群憑據(jù)管理(存儲為 K8s Secrets 對象)
  • 認證和授權給外部身份提供者
  • RBAC
  • Git webhook 事件的偵聽器/轉發(fā)器

倉庫服務:存儲倉庫服務是一個內(nèi)部服務,負責維護保存應用程序清單 Git 倉庫的本地緩存。當提供以下輸入時,它負責生成并返回 Kubernetes 清單:

  • 存儲 URL
  • revision 版本(commit、tag、branch)
  • 應用路徑
  • 模板配置:參數(shù)、ksonnet 環(huán)境、helm values.yaml 等

應用控制器:應用控制器是一個 Kubernetes 控制器,它持續(xù) watch 正在運行的應用程序并將當前的實時狀態(tài)與所期望的目標狀態(tài)(repo 中指定的)進行比較。它檢測應用程序的 OutOfSync 狀態(tài),并采取一些措施來同步狀態(tài),它負責調(diào)用任何用戶定義的生命周期事件的鉤子(PreSync、Sync、PostSync)。

功能

  • 自動部署應用程序到指定的目標環(huán)境
  • 支持多種配置管理/模板工具(Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)
  • 能夠管理和部署到多個集群
  • SSO 集成(OIDC、OAuth2、LDAP、SAML 2.0、GitHub、GitLab、Microsoft、LinkedIn)
  • 用于授權的多租戶和 RBAC 策略
  • 回滾/隨時回滾到 Git 存儲庫中提交的任何應用配置
  • 應用資源的健康狀況分析
  • 自動配置檢測和可視化
  • 自動或手動將應用程序同步到所需狀態(tài)
  • 提供應用程序活動實時視圖的 Web UI
  • 用于自動化和 CI 集成的 CLI
  • Webhook 集成(GitHub、BitBucket、GitLab)
  • 用于自動化的 AccessTokens
  • PreSync、Sync、PostSync Hooks,以支持復雜的應用程序部署(例如藍/綠和金絲雀發(fā)布)
  • 應用程序事件和 API 調(diào)用的審計
  • Prometheus 監(jiān)控指標
  • 用于覆蓋 Git 中的 ksonnet/helm 參數(shù)

核心概念

  • Application:應用,一組由資源清單定義的 Kubernetes 資源,這是一個 CRD 資源對象
  • ApplicationSet:應用集,一組應用的集合,可以用來批量創(chuàng)建應用
  • Application source type:用來構建應用的工具
  • Target state:目標狀態(tài),指應用程序所需的期望狀態(tài),由 Git 存儲庫中的文件表示
  • Live state:實時狀態(tài),指應用程序?qū)崟r的狀態(tài),比如部署了哪些 Pods 等真實狀態(tài)
  • Sync status:同步狀態(tài)表示實時狀態(tài)是否與目標狀態(tài)一致,部署的應用是否與 Git 所描述的一樣?
  • Sync:同步指將應用程序遷移到其目標狀態(tài)的過程,比如通過對 Kubernetes 集群應用變更
  • Sync operation status:同步操作狀態(tài)指的是同步是否成功
  • Refresh:刷新是指將 Git 中的最新代碼與實時狀態(tài)進行比較,弄清楚有什么不同
  • Health:應用程序的健康狀況,它是否正常運行?能否為請求提供服務?
  • Tool:工具指從文件目錄創(chuàng)建清單的工具,例如 Kustomize 或 Ksonnet 等
  • Configuration management tool:配置管理工具
  • Configuration management plugin:配置管理插件

安裝

當然前提是需要有一個 kubectl 可訪問的 Kubernetes 的集群,直接使用下面的命令即可,這里我們安裝最新的 v2.8.4 版本:

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

如果你要用在生產(chǎn)環(huán)境,則可以使用下面的命令部署一個 HA 高可用的版本:

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

這將創(chuàng)建一個新的命名空間 argocd,Argo CD 的服務和應用資源都將部署到該命名空間。

$ kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          103s
argocd-applicationset-controller-68b9bdbd8b-jzcpf   1/1     Running   0          103s
argocd-dex-server-6b7745757-6mxwk                   1/1     Running   0          103s
argocd-notifications-controller-5b56f6f7bb-jqpng    1/1     Running   0          103s
argocd-redis-f4cdbff57-dr8jc                        1/1     Running   0          103s
argocd-repo-server-c4f79b4d6-7nh6n                  1/1     Running   0          103s
argocd-server-895675597-fr42g                       1/1     Running   0          103s

如果你對 UI、SSO、多集群管理這些特性不感興趣,只想把應用變更同步到集群中,那么可以直接安裝核心組件即可:kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.3/manifests/core-install.yaml。

然后我們可以在本地(選擇對應的版本)安裝 CLI 工具方便操作 Argo CD:

$ curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v2.12.3/argocd-linux-amd64

為 argocd CLI 賦予可執(zhí)行權限:

$ chmod +x /usr/local/bin/argocd

現(xiàn)在我們就可以使用 argocd 命令了。如果你是 Mac,則可以直接使用 brew install argocd 進行安裝。

Argo CD 會運行一個 gRPC 服務(由 CLI 使用)和 HTTP/HTTPS 服務(由 UI 使用),這兩種協(xié)議都由 argocd-server 服務在以下端口進行暴露:

  • 443 - gRPC/HTTPS
  • 80 - HTTP(重定向到 HTTPS)

我們可以通過配置 Ingress 的方式來對外暴露服務,其他 Ingress 控制器的配置可以參考官方文檔 https://argo-cd.readthedocs.io/en/stable/operator-manual/ingress/ 進行配置。

Argo CD 在同一端口 (443) 上提供多個協(xié)議 (gRPC/HTTPS),所以當我們?yōu)?argocd 服務定義單個 nginx ingress 對象和規(guī)則的時候有點麻煩,因為 nginx.ingress.kubernetes.io/backend-protocol 這個 annotation 只能接受一個后端協(xié)議(例如 HTTP、HTTPS、GRPC、GRPCS)。

為了使用單個 ingress 規(guī)則和主機名來暴露 Argo CD APIServer,必須使用 nginx.ingress.kubernetes.io/ssl-passthrough 這個 annotation 來傳遞 TLS 連接并校驗 Argo CD APIServer 上的 TLS。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: nginx
  rules:
    - host: argocd.k8s.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argocd-server
                port:
                  name: https

上述規(guī)則在 Argo CD APIServer 上校驗 TLS,該服務器檢測到正在使用的協(xié)議,并做出適當?shù)捻憫?。請注意,nginx.ingress.kubernetes.io/ssl-passthrough 注解要求將 --enable-ssl-passthrough 標志添加到 nginx-ingress-controller 的命令行參數(shù)中。

由于 ingress-nginx 的每個 Ingress 對象僅支持一個協(xié)議,因此另一種方法是定義兩個 Ingress 對象。一個用于 HTTP/HTTPS,另一個用于 gRPC。

如下所示為 HTTP/HTTPS 的 Ingress 對象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-http-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argocd-server
                port:
                  name: http
      host: argocd.k8s.local
  tls:
    - hosts:
        - argocd.k8s.local
      secretName: argocd-secret # do not change, this is provided by Argo CD

gRPC 協(xié)議對應的 Ingress 對象如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-server-grpc-ingress
  namespace: argocd
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: argocd-server
                port:
                  name: https
      host: grpc.argocd.k8s.local
  tls:
    - hosts:
        - grpc.argocd.k8s.local
      secretName: argocd-secret # do not change, this is provided by Argo CD

然后我們需要在禁用 TLS 的情況下運行 APIServer。編輯 argocd-server 這個 Deployment 以將 --insecure 標志添加到 argocd-server 命令,或者簡單地在 argocd-cmd-params-cm ConfigMap 中設置 server.insecure: "true" 即可。

創(chuàng)建完成后,我們就可以通過 argocd.k8s.local 來訪問 Argo CD 服務了,不過需要注意我們這里配置的證書是自簽名的,所以在第一次訪問的時候會提示不安全,強制跳轉即可。

安全提示

默認情況下 admin 帳號的初始密碼是自動生成的,會以明文的形式存儲在 Argo CD 安裝的命名空間中名為 argocd-initial-admin-secret 的 Secret 對象下的 password 字段下,我們可以用下面的命令來獲?。?/p>

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

使用用戶名 admin 和上面輸出的密碼即可登錄 Dashboard。

argocd ui

默認的首頁如下所示:

argocd 首頁

同樣我們也可以通過 ArgoCD CLI 命令行工具進行登錄:

$ argocd login grpc.argocd.k8s.local
WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'grpc.argocd.k8s.local' updated

需要注意的是這里登錄的地址為 gRPC 暴露的服務地址。

CLI 登錄成功后,可以使用如下所示命令更改密碼:

$ argocd account update-password
*** Enter current password:
*** Enter new password:
*** Confirm new password:
Password updated
Context 'argocd.k8s.local' updated
$ argocd version
argocd: v2.12.3+6b9cd82
  BuildDate: 2024-08-27T15:31:43Z
  GitCommit: 6b9cd828c6e9807398869ad5ac44efd2c28422d6
  GitTreeState: clean
  GoVersion: go1.23.0
  Compiler: gc
  Platform: darwin/arm64
argocd-server: v2.12.3+6b9cd82
  BuildDate: 2024-08-27T11:57:48Z
  GitCommit: 6b9cd828c6e9807398869ad5ac44efd2c28422d6
  GitTreeState: clean
  GoVersion: go1.22.4
  Compiler: gc
  Platform: linux/amd64
  Kustomize Version: v5.4.2 2024-05-22T15:19:38Z
  Helm Version: v3.15.2+g1a500d5
  Kubectl Version: v0.29.6
  Jsonnet Version: v0.20.0

配置集群

由于 Argo CD 支持部署應用到多集群,所以如果你要將應用部署到外部集群的時候,需要先將外部集群的認證信息注冊到 Argo CD 中,如果是在內(nèi)部部署(運行 Argo CD 的同一個集群,默認不需要配置),直接使用 https://kubernetes.default.svc 作為應用的 K8S APIServer 地址即可。

首先列出當前 kubeconfig 中的所有集群上下文:

$ kubectl config get-contexts -o name
kubernetes-admin@kubernetes
orbstack

從列表中選擇一個上下文名稱并將其提供給 argocd cluster add CONTEXTNAME,比如對于 orbstack 上下文,運行:

$ argocd cluster list
SERVER                          NAME        VERSION  STATUS      MESSAGE  PROJECT
https://kubernetes.default.svc  in-cluster  1.28     Successful
$ argocd cluster add orbstack

創(chuàng)建應用

Git 倉庫 https://github.com/argoproj/argocd-example-apps.git 是一個包含留言簿應用程序的示例庫,我們可以用該應用來演示 Argo CD 的工作原理。

通過 CLI 創(chuàng)建應用

我們可以通過 argocd app create xxx 命令來創(chuàng)建一個應用:

$ argocd app create --help
Create an application

Usage:
  argocd app create APPNAME [flags]

Examples:

        # Create a directory app
        argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse

        # Create a Jsonnet app
        argocd app create jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2

        # Create a Helm app
        argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2

        # Create a Helm app from a Helm repo
        argocd app create nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc

        # Create a Kustomize app
        argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1

        # Create a app using a custom tool:
        argocd app create kasane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane


Flags:
......

直接執(zhí)行如下所示命令即可:

$ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
application 'guestbook' created

通過 UI 創(chuàng)建應用

除了可以通過 CLI 工具來創(chuàng)建應用,我們也可以通過 UI 界面來創(chuàng)建,定位到 argocd.k8s.local 頁面,登錄后,點擊 +New App 新建應用按鈕。將應用命名為 guestbook,使用 default project,并將同步策略設置為 Manual:

配置應用

然后在下面配置 Repository URL 為 https://github.com/argoproj/argocd-example-apps.git,由于某些原因我們這里使用的是 Gitee 倉庫地址 https://gitee.com/cnych/argocd-example-apps,將 Revision 設置為 HEAD,并將路徑設置為 guestbook。然后下面的 Destination 部分,將 cluster 設置為 inCluster 和 namespace 為 default:

配置集群

填寫完以上信息后,點擊頁面上方的 Create 安裝,即可創(chuàng)建 guestbook 應用,創(chuàng)建完成后可以看到當前應用的處于 OutOfSync 狀態(tài):

guestbook application

Argo CD 默認情況下每 3 分鐘會檢測 Git 倉庫一次,用于判斷應用實際狀態(tài)是否和 Git 中聲明的期望狀態(tài)一致,如果不一致,狀態(tài)就轉換為 OutOfSync。默認情況下并不會觸發(fā)更新,除非通過 syncPolicy 配置了自動同步。

通過 CRD 創(chuàng)建

除了可以通過 CLI 和 Dashboard 可以創(chuàng)建 Application 之外,其實也可以直接通過聲明一個 Application 的資源對象來創(chuàng)建一個應用,如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
spec:
  destination:
    namespace: default
    server: "https://kubernetes.default.svc"
  source:
    path: guestbook
    repoURL: "https://github.com/cnych/argocd-example-apps"
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated: null

部署應用

由于上面我們在創(chuàng)建應用的時候使用的同步策略為 Manual,所以應用創(chuàng)建完成后沒有自動部署,需要我們手動去部署應用。同樣可以通過 CLI 和 UI 界面兩種同步方式。

使用 CLI 同步

應用創(chuàng)建完成后,我們可以通過如下所示命令查看其狀態(tài):

$ argocd app get argocd/guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://grpc.argocd.k8s.local/applications/guestbook
Source:
- Repo:             https://gitee.com/cnych/argocd-example-apps
  Target:           HEAD
  Path:             guestbook
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        OutOfSync from HEAD (3b08dd4)
Health Status:      Missing

GROUP  KIND        NAMESPACE  NAME          STATUS     HEALTH   HOOK  MESSAGE
       Service     default    guestbook-ui  OutOfSync  Missing
apps   Deployment  default    guestbook-ui  OutOfSync  Missing

應用程序狀態(tài)為初始 OutOfSync 狀態(tài),因為應用程序尚未部署,并且尚未創(chuàng)建任何 Kubernetes 資源。要同步(部署)應用程序,可以執(zhí)行如下所示命令:

$ argocd app sync argocd/guestbook
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2024-09-08T10:42:02+08:00            Service     default          guestbook-ui  OutOfSync  Missing
2024-09-08T10:42:02+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing
2024-09-08T10:42:03+08:00            Service     default          guestbook-ui  OutOfSync  Missing              service/guestbook-ui created
2024-09-08T10:42:03+08:00   apps  Deployment     default          guestbook-ui  OutOfSync  Missing              deployment.apps/guestbook-ui created
2024-09-08T10:42:03+08:00            Service     default          guestbook-ui    Synced  Healthy                  service/guestbook-ui created
2024-09-08T10:42:03+08:00   apps  Deployment     default          guestbook-ui    Synced  Progressing              deployment.apps/guestbook-ui created

Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://grpc.argocd.k8s.local/applications/argocd/guestbook
Source:
- Repo:             https://gitee.com/cnych/argocd-example-apps
  Target:           HEAD
  Path:             guestbook
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        Synced to HEAD (3b08dd4)
Health Status:      Progressing

Operation:          Sync
Sync Revision:      3b08dd4969319e053d9cab2a02f949abc9f4aa45
Phase:              Succeeded
Start:              2024-09-08 10:42:02 +0800 CST
Finished:           2024-09-08 10:42:03 +0800 CST
Duration:           1s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH       HOOK  MESSAGE
       Service     default    guestbook-ui  Synced  Healthy            service/guestbook-ui created
apps   Deployment  default    guestbook-ui  Synced  Progressing        deployment.apps/guestbook-ui created

此命令從 Git 倉庫中檢索資源清單并執(zhí)行 kubectl apply 部署應用,執(zhí)行上面命令后 guestbook 應用便會運行在集群中了,現(xiàn)在我們就可以查看其資源組件、日志、事件和評估其健康狀態(tài)了。

通過 UI 同步

直接添加 UI 界面上應用的 Sync 按鈕即可開始同步:

sync 操作

同步完成后可以看到我們的資源狀態(tài),甚至還可以直接查看應用的日志信息:

Sync 完成

也可以通過 kubectl 查看到我們部署的資源:

$ kubectl get pods
NAME                                 READY   STATUS      RESTARTS       AGE
guestbook-ui-6c96fb4bdc-bdwh9        1/1     Running     0              3m3s
?  ~ kubectl get svc
NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
guestbook-ui         ClusterIP      10.100.170.117   <none>         80/TCP                       3m16s
kubernetes           ClusterIP      10.96.0.1        <none>         443/TCP                      42d

和我們從 Git 倉庫中同步 guestbook 目錄下面的資源狀態(tài)也是同步的,證明同步成功了。

Helm 項目

如果有多個團隊,每個團隊都要維護大量的應用,就需要用到 Argo CD 的另一個概念:項目(Project)。Argo CD 中的項目(Project)可以用來對 Application 進行分組,不同的團隊使用不同的項目,這樣就實現(xiàn)了多租戶環(huán)境。項目還支持更細粒度的訪問權限控制:

  • 限制部署內(nèi)容(受信任的 Git 倉庫);
  • 限制目標部署環(huán)境(目標集群和 namespace);
  • 限制部署的資源類型(例如 RBAC、CRD、DaemonSets、NetworkPolicy 等);
  • 定義項目角色,為 Application 提供 RBAC(例如 OIDC group 或者 JWT 令牌綁定)。

比如我們這里創(chuàng)建一個名為 demo 的項目,將該應用創(chuàng)建到該項目下,只需創(chuàng)建一個如下所示的 AppProject 對象即可:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  # 項目名
  name: demo
  namespace: argocd
spec:
  # 目標
  destinations:
    # 此項目的服務允許部署的 namespace,這里為全部
    - namespace: "*"
      # 此項目允許部署的集群,這里為默認集群,即為Argo CD部署的當前集群
      server: https://kubernetes.default.svc
  # 允許的數(shù)據(jù)源
  sourceRepos:
    - https://gitee.com/cnych/argocd-example-apps

該對象中有幾個核心的屬性:

  • sourceRepos:項目中的應用程序可以從中獲取清單的倉庫引用
  • destinations:項目中的應用可以部署到的集群和命名空間
  • roles:項目內(nèi)資源訪問定義的角色

直接創(chuàng)建該對象即可:

$ kubectl get appproject -n argocd
NAME      AGE
default   47h
demo      6s

更多配置信息可以前往文檔 https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/ 查看,項目創(chuàng)建完成后,在該項目下創(chuàng)建一個 Application,代表環(huán)境中部署的應用程序?qū)嵗?/p>

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: gitops-demo
  namespace: argocd
spec:
  destination:
    namespace: default
    server: "https://kubernetes.default.svc"
  project: demo
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  source:
    path: helm-guestbook # 從 Helm 存儲庫創(chuàng)建應用程序時,chart 必須指定 path
    repoURL: "https://gitee.com/cnych/argocd-example-apps.git"
    targetRevision: HEAD
    helm:
      parameters:
        - name: replicaCount
          value: "2"
      valueFiles:
        - values.yaml

這里我們定義了一個名為 gitop-demo 的應用,應用源來自于 helm 路徑,使用的是 values.yaml 文件,此外還可以通過 source.helm.parameters 來配置參數(shù)。

同步策略可以選擇使用自動的方式,該策略下面還有兩個屬性可以配置:

  • PRUNE RESOURCES:開啟后 Git Repo 中刪除資源會自動在環(huán)境中刪除對應的資源。

刪除資源

  • SELF HEAL:自動痊愈,強制以 Git Repo 狀態(tài)為準,手動在環(huán)境中修改不會生效。

自動痊愈

正常創(chuàng)建后這個應用就會自動部署了,根據(jù)我們配置會生成兩個副本。

app status

由于 Argo CD 默認并不是實時去監(jiān)測 Config Repo 的變化的,如果要更快的檢測到變化我們可以使用 Git Webhook 的方式。

默認情況下 Argo CD 每三分鐘輪詢一次 Git 存儲庫,以檢測清單的更改。為了消除輪詢延遲,可以將 API 服務器配置為接收 Webhook 事件。Argo CD 支持來自 GitHub、GitLab、Bitbucket、Bitbucket Server 和 Gogs 的 Git webhook 通知。

然后在 argocd-secret 這個 Kubernetes Secret 中,使用上面配置的 Git 提供商的 Webhook 密鑰配置以下密鑰之一。

gitlab token

$ kubectl edit secret argocd-secret -n argocd
apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  namespace: argocd
type: Opaque
data:
...

stringData:
  # github webhook secret
  webhook.github.secret: shhhh! it's a GitHub secret

  # gitlab webhook secret
  webhook.gitlab.secret: shhhh! it's a GitLab secret

  # bitbucket webhook secret
  webhook.bitbucket.uuid: your-bitbucket-uuid

  # bitbucket server webhook secret
  webhook.bitbucketserver.secret: shhhh! it's a Bitbucket server secret

  # gogs server webhook secret
  webhook.gogs.secret: shhhh! it's a gogs server secret

可以直接使用 stringData 來配置 secret,這樣就不用去手動編碼了。

因為 GitOps 的核心是 Git,所以我們一定要將部署到集群中的資源清單文件全都托管到 Git 倉庫中,這樣才能實現(xiàn) GitOps 的自動同步部署。上面我們是在 CI 流水線中去修改 Git 倉庫中的資源清單文件,其實我們也可以通過其他方式去修改,比如 Argo CD 也提供了一個新的工具 Argo CD Image Updater。

ApplicationSet

ApplicationSet 用于簡化多集群應用編排,它可以基于單一應用編排并根據(jù)用戶的編排內(nèi)容自動生成一個或多個 Application。

比如現(xiàn)在我們創(chuàng)建一個如下所示的 ApplicationSet 資源對象:

# applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  goTemplate: true # 使用 go template 模板
  goTemplateOptions: ["missingkey=error"] # 當模板中缺少鍵時,拋出錯誤
  generators: # 生成器,用于生成參數(shù)
    - list: # 列表生成器
        elements: # 元素
          - cluster: dev
            url: https://1.2.3.4
          - cluster: staging
            url: https://9.8.7.6
          - cluster: prod
            url: https://kubernetes.default.svc
  template:
    metadata:
      name: "{{.cluster}}-guestbook"
    spec:
      project: demo
      source:
        repoURL: https://gitee.com/cnych/argocd-example-apps
        targetRevision: HEAD
        path: helm-guestbook
        helm:
          valueFiles:
            - "{{.cluster}}.yaml"
      syncPolicy:
        syncOptions:
          - CreateNamespace=true
      destination:
        server: "{{.url}}"
        namespace: guestbook

在上面的資源對象中,我們定義了一個 ApplicationSet 資源對象,其中使用了模板和生成器:

  • goTemplate: true:表示使用 go template 的模板
  • goTemplateOptions: ["missingkey=error"]:當模板中缺少鍵時,拋出錯誤
  • generators:生成器,用于生成參數(shù),ApplicationSet 控制器當前支持多種生成器:
  • 包含 JSON 值的文件將被解析并轉換為模板參數(shù)。
  • Git 存儲庫中的各個目錄路徑也可以用作參數(shù)值。
  • 列表生成器:根據(jù)集群名稱/URL 值的固定列表生成參數(shù),如上例所示。
  • 集群生成器:集群生成器不是基于 clusters 的字面列表(與列表生成器一樣),而是根據(jù) Argo CD 中定義的集群自動生成集群參數(shù)。
  • Git 生成器:Git 生成器根據(jù)生成器資源中定義的 Git 存儲庫中包含的文件或文件夾生成參數(shù)。
  • 矩陣生成器:矩陣生成器結合了其他兩個生成器生成的參數(shù)。
  • template:模板,用于生成 Application 資源對象

這里我們通過列表生成器定義了多個生成器元素,里面包含 cluster 和 url 兩個參數(shù),ApplicationSet 控制器會根據(jù)這些參數(shù)生成多個 Application 資源對象,每個 Application 資源對象都會部署到對應的集群和命名空間中,每個 Application 資源就是通過這些參數(shù)將模板中的內(nèi)容渲染生成。

無論使用哪個生成器,生成器生成的參數(shù)都會替換為 ApplicationSet 資源的 template: 部分中的 {{parameter name}} 值。我們這里列表生成器定義了 cluster 和 url 參數(shù),然后將它們分別替換為模板的 {{cluster}} 和 {{url}} 值。

我們可以直接使用 argocd appset 命令來創(chuàng)建:

$ argocd appset create applicationset.yaml
ApplicationSet 'guestbook' created
$ argocd appset list
NAME              PROJECT  SYNCPOLICY  CONDITIONS                                                                                                                                                                                                                                     REPO                                         PATH            TARGET
argocd/guestbook  demo     nil         [{ParametersGenerated Successfully generated parameters for all Applications 2024-09-08 11:48:52 +0800 CST True ParametersGenerated} {ResourcesUpToDate ApplicationSet up to date 2024-09-08 11:48:52 +0800 CST True ApplicationSetUpToDate}]  https://gitee.com/cnych/argocd-example-apps  helm-guestbook  HEAD

創(chuàng)建完成后可以通過 argocd appset list 查看 ApplicationSet 資源對象的狀態(tài),從上面輸出可以看到 ApplicationSet 資源對象的狀態(tài)為 ParametersGenerated,表示參數(shù)已經(jīng)生成成功,也就是已經(jīng)將 ApplicationSet 資源對象中的內(nèi)容渲染生成多個 Application 資源對象了。查看下 Application 資源對象的狀態(tài)即可:

$ argocd argocd app list
NAME                      CLUSTER                         NAMESPACE  PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS           REPO                                             PATH            TARGET
argocd/dev-guestbook      https://1.2.3.4                 guestbook  demo     Unknown    Unknown  Manual      InvalidSpecError(2)  https://gitee.com/cnych/argocd-example-apps      helm-guestbook  HEAD
argocd/prod-guestbook     https://kubernetes.default.svc  guestbook  demo     OutOfSync  Missing  Manual      <none>               https://gitee.com/cnych/argocd-example-apps      helm-guestbook  HEAD
argocd/staging-guestbook  https://9.8.7.6                 guestbook  demo     Unknown    Unknown  Manual      InvalidSpecError(2)  https://gitee.com/cnych/argocd-example-apps      helm-guestbook  HEAD

可以看到現(xiàn)在渲染了 3 個 Application 資源對象,和我們前面在 ApplicationSet 資源對象中定義的集群和 URL 是一一對應的,當然我們也可以在 Dashboard 界面中查看:

app list status

更多關于生成器的詳細信息可以前往 https://argo-cd.readthedocs.io/en/latest/operator-manual/applicationset/Generators/ 查看。

責任編輯:姜華 來源: k8s技術圈
相關推薦

2021-07-09 06:40:59

TektonArgo CD GitOps

2022-08-16 22:39:01

Argo CDKubernetes

2023-09-27 08:24:49

2024-05-22 08:03:15

2021-07-04 07:24:48

GitOps 工具 Argo CD

2022-08-18 17:07:00

sopsGitOps

2021-06-24 07:20:21

Linked GitOps Argo CD

2021-12-08 12:20:55

KubernetesGitOpsLinux

2024-08-07 10:14:35

2021-09-07 08:23:45

GitOpsCICD

2021-02-10 08:24:47

微服務CICD

2021-05-19 10:37:16

WebFlux 前置工具

2022-02-14 10:16:22

Axios接口HTTP

2023-06-26 15:14:19

WebGL紋理對象學習

2023-10-07 07:51:55

FluxCDKubernetes

2021-07-12 06:36:08

釘釘Argo CDPrometheus

2023-04-11 07:43:32

PostmanGraphQL查詢。

2022-02-17 11:52:05

?Argo CD漏洞Kubernetes

2024-02-23 10:25:33

Kubernetes自動擴縮容工作負載

2023-03-28 07:32:37

點贊
收藏

51CTO技術棧公眾號