偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一起學(xué)習(xí)使用 Argo CD 實(shí)現(xiàn) GitOps

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

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

Argo CD 遵循 GitOps 模式,使用 Git 倉庫作為定義所需應(yīng)用程序狀態(tài)的真實(shí)來源,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 可在指定的目標(biāo)環(huán)境中自動(dòng)部署所需的應(yīng)用程序狀態(tài),應(yīng)用程序部署可以在 Git 提交時(shí)跟蹤對分支、標(biāo)簽的更新,或固定到清單的指定版本。

架構(gòu)

ArgoCD架構(gòu)

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

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

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

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

倉庫服務(wù):存儲(chǔ)倉庫服務(wù)是一個(gè)內(nèi)部服務(wù),負(fù)責(zé)維護(hù)保存應(yīng)用程序清單 Git 倉庫的本地緩存。當(dāng)提供以下輸入時(shí),它負(fù)責(zé)生成并返回 Kubernetes 清單:

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

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

功能

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

核心概念

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

安裝

當(dāng)然前提是需要有一個(gè) 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)境,則可以使用下面的命令部署一個(gè) 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)建一個(gè)新的命名空間 argocd,Argo CD 的服務(wù)和應(yīng)用資源都將部署到該命名空間。

$ 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、多集群管理這些特性不感興趣,只想把應(yīng)用變更同步到集群中,那么可以直接安裝核心組件即可:kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.3/manifests/core-install.yaml。

然后我們可以在本地(選擇對應(yīng)的版本)安裝 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í)行權(quán)限:

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

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

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

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

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

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

為了使用單個(gè) ingress 規(guī)則和主機(jī)名來暴露 Argo CD APIServer,必須使用 nginx.ingress.kubernetes.io/ssl-passthrough 這個(gè) annotation 來傳遞 TLS 連接并校驗(yàn) 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 上校驗(yàn) TLS,該服務(wù)器檢測到正在使用的協(xié)議,并做出適當(dāng)?shù)捻憫?yīng)。請注意,nginx.ingress.kubernetes.io/ssl-passthrough 注解要求將 --enable-ssl-passthrough 標(biāo)志添加到 nginx-ingress-controller 的命令行參數(shù)中。

由于 ingress-nginx 的每個(gè) Ingress 對象僅支持一個(gè)協(xié)議,因此另一種方法是定義兩個(gè) Ingress 對象。一個(gè)用于 HTTP/HTTPS,另一個(gè)用于 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é)議對應(yīng)的 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 的情況下運(yùn)行 APIServer。編輯 argocd-server 這個(gè) Deployment 以將 --insecure 標(biāo)志添加到 argocd-server 命令,或者簡單地在 argocd-cmd-params-cm ConfigMap 中設(shè)置 server.insecure: "true" 即可。

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

安全提示

默認(rèn)情況下 admin 帳號的初始密碼是自動(dòng)生成的,會(huì)以明文的形式存儲(chǔ)在 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

默認(rèn)的首頁如下所示:

argocd 首頁

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

$ 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 暴露的服務(wù)地址。

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 支持部署應(yīng)用到多集群,所以如果你要將應(yīng)用部署到外部集群的時(shí)候,需要先將外部集群的認(rèn)證信息注冊到 Argo CD 中,如果是在內(nèi)部部署(運(yùn)行 Argo CD 的同一個(gè)集群,默認(rèn)不需要配置),直接使用 https://kubernetes.default.svc 作為應(yīng)用的 K8S APIServer 地址即可。

首先列出當(dāng)前 kubeconfig 中的所有集群上下文:

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

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

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

創(chuàng)建應(yīng)用

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

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

我們可以通過 argocd app create xxx 命令來創(chuàng)建一個(gè)應(yī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)建應(yīng)用

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

配置應(yīng)用

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

配置集群

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

guestbook application

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

通過 CRD 創(chuàng)建

除了可以通過 CLI 和 Dashboard 可以創(chuàng)建 Application 之外,其實(shí)也可以直接通過聲明一個(gè) Application 的資源對象來創(chuàng)建一個(gè)應(yī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

部署應(yīng)用

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

使用 CLI 同步

應(yīng)用創(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

應(yīng)用程序狀態(tài)為初始 OutOfSync 狀態(tài),因?yàn)閼?yīng)用程序尚未部署,并且尚未創(chuàng)建任何 Kubernetes 資源。要同步(部署)應(yīng)用程序,可以執(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 部署應(yīng)用,執(zhí)行上面命令后 guestbook 應(yīng)用便會(huì)運(yùn)行在集群中了,現(xiàn)在我們就可以查看其資源組件、日志、事件和評估其健康狀態(tài)了。

通過 UI 同步

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

sync 操作

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

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 項(xiàng)目

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

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

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

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

該對象中有幾個(gè)核心的屬性:

  • sourceRepos:項(xiàng)目中的應(yīng)用程序可以從中獲取清單的倉庫引用
  • destinations:項(xiàng)目中的應(yīng)用可以部署到的集群和命名空間
  • roles:項(xiàng)目內(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/ 查看,項(xiàng)目創(chuàng)建完成后,在該項(xiàng)目下創(chuàng)建一個(gè) Application,代表環(huán)境中部署的應(yīng)用程序?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 存儲(chǔ)庫創(chuàng)建應(yīng)用程序時(shí),chart 必須指定 path
    repoURL: "https://gitee.com/cnych/argocd-example-apps.git"
    targetRevision: HEAD
    helm:
      parameters:
        - name: replicaCount
          value: "2"
      valueFiles:
        - values.yaml

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

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

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

刪除資源

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

自動(dòng)痊愈

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

app status

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

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

然后在 argocd-secret 這個(gè) 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,這樣就不用去手動(dòng)編碼了。

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

ApplicationSet

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

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

# applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  goTemplate: true # 使用 go template 模板
  goTemplateOptions: ["missingkey=error"] # 當(dāng)模板中缺少鍵時(shí),拋出錯(cuò)誤
  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

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

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

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

無論使用哪個(gè)生成器,生成器生成的參數(shù)都會(huì)替換為 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)容渲染生成多個(gè) 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 個(gè) Application 資源對象,和我們前面在 ApplicationSet 資源對象中定義的集群和 URL 是一一對應(yīng)的,當(dāng)然我們也可以在 Dashboard 界面中查看:

app list status

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

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

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-02-10 08:24:47

微服務(wù)CICD

2021-09-07 08:23:45

GitOpsCICD

2021-05-19 10:37:16

WebFlux 前置工具

2022-02-14 10:16:22

Axios接口HTTP

2023-06-26 15:14:19

WebGL紋理對象學(xué)習(xí)

2021-07-12 06:36:08

釘釘Argo CDPrometheus

2023-10-07 07:51:55

FluxCDKubernetes

2022-02-17 11:52:05

?Argo CD漏洞Kubernetes

2023-04-11 07:43:32

PostmanGraphQL查詢。

2021-11-26 09:44:42

鏈表節(jié)點(diǎn)定位

2022-12-01 09:59:57

內(nèi)核觀測性方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號