什么是 GitOps?
雖然軟件開發生命周期的大部分已經實現自動化,但基礎設施仍然在很大程度上依賴于人工,需要專業團隊的參與。隨著當今基礎設施需求的不斷增長,實施基礎設施自動化變得越來越重要。現代基礎設施需要具備彈性,以便能夠有效管理持續部署所需的云資源。
現代云原生應用程序的開發都兼顧了速度和規模。擁有成熟 DevOps 文化的組織每天可以將代碼部署到生產環境中數百次。DevOps 團隊可以通過版本控制、代碼審查和 CI/CD 流水線等開發最佳實踐來實現這一點,這些實踐可以自動化測試和部署。
GitOps 用于自動化基礎設施的配置流程,尤其是現代云基礎設施。與團隊使用應用程序源代碼的方式類似,采用 GitOps 的運營團隊使用以代碼形式存儲的配置文件(即基礎設施即代碼)。GitOps 配置文件每次部署時都會生成相同的基礎設施環境,就像應用程序源代碼每次構建時都會生成相同的應用程序二進制文件一樣。
Argo CD是什么?
Argo CD 是針對 Kubernetes 的聲明式 GitOps 持續交付工具。
?
Argo CD 的主要功能
- 基于 Git 的工作流:以代碼形式管理基礎設施和應用程序。
- 聲明式應用程序管理和同步機制。
- 支持多個 Git 倉庫和應用程序源。
- 自動回滾和應用程序狀態健康檢查。
Argo CD 的架構
Argo CD 組件
- Web 應用
? ? Argo CD 附帶一個強大的 Web 界面,可用于管理部署在給定 Kubernetes 集群中的應用程序。
- CLI
? ? Argo CD 提供了一個 CLI,用戶可以使用它與 Argo CD API 交互。該 CLI 還可用于自動化和腳本編寫。
- API 服務器
? ? 定義 Argo CD 公開的專有 API,用于支持 Web 應用和 CLI 功能。
- 應用程序控制器
? ? 應用程序控制器負責協調 Kubernetes 中的應用程序資源,將所需的應用程序狀態(由 Git 提供)與實時狀態(由 Kubernetes 提供)同步。應用程序控制器還負責協調項目資源。
- ApplicationSet 控制器
? ApplicationSet 控制器負責協調 ApplicationSet 資源。
- Repo 服務器
? Repo 服務器在 Argo CD 架構中扮演著重要的角色,因為它負責與 Git 存儲庫交互,為屬于給定應用程序的所有 Kubernetes 資源生成所需的狀態。
- Redis
Argo CD 使用 Redis 提供緩存層,以減少發送到 Kube API 以及 Git 提供程序的請求。它還支持一些 UI 操作。
- Kube API
Argo CD 控制器將連接到 Kubernetes API 以運行協調循環。
- Git
作為 gitops 工具,Argo CD 要求在 Git 存儲庫中提供 Kubernetes 資源的所需狀態。
我們在這里使用“git”來代表實際的 git 存儲庫、Helm 存儲庫或 OCI 工件存儲庫。Argo CD 支持所有這些選項。
- Dex
Argo CD 依賴 Dex 為外部 OIDC 提供程序提供身份驗證。但是,可以使用其他工具代替 Dex。
Argo CD 與 Git 倉庫和 Kubernetes 集群交互的工作流程。

安裝和配置
1.創建namespace?
2. 使用官方的yaml文件來安裝
kubectl?apply?-n?argocd?-f?https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
3. 等待Argo CD 組件啟動和運行
ninjamac@ip-192-168-1-101 ~ % kubectl get pod -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 12m
argocd-applicationset-controller-cc68b7b7b-fvdb8 1/1 Running 0 12m
argocd-dex-server-555b55c97d-2sbsl 1/1 Running 1 (92s ago) 12m
argocd-notifications-controller-65655df9d5-xgtw9 1/1 Running 0 12m
argocd-redis-764b74c9b9-m7qn7 1/1 Running 0 12m
argocd-repo-server-7dcbcd967b-k9nbz 1/1 Running 0 12m
argocd-server-5b9cc8b776-rkfkv 1/1 Running 0 12m
4.訪問Argo CD API server
使用 LoadBalancer 服務公開 Argo CD API 服務器(用于外部訪問)或使用端口轉發進行本地訪問:
kubectl?port-forward?svc/argocd-server?-n?argocd?8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
獲得Argo CD?管理員密碼
ninjamac@ip-192-168-1-101 kong % argocd admin initial-password -n argocd
xxxxxxxxxxxxxx
登錄Argo CD
在瀏覽器中輸入http://127.0.0.1:8080,輸入用戶名admin和修改后的密碼。
使用 Argo CD 管理應用程序
首先,我們需要運行以下命令將當前命名空間設置為 argocd:
ninjamac@ip-192-168-1-101 argocd % kubectl config set-context --current --namespace=argocd
Context "minikube" modified.
使用以下命令創建示例guestbook應用程序:?
ninjamac@ip-192-168-1-101 argocd % argocd login 127.0.0.1:8080 --username admin --password argocd2025WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
'admin:login' logged in successfully
Context '127.0.0.1:8080' updated
ninjamac@ip-192-168-1-101 argocd % 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
將 Argo CD 與 Jenkins 流水線集成
生成token?
ninjamac@ip-192-168-1-101 argocd % curl -X POST https://localhost:8080/api/v1/session -H "Content-Type: application/json" -d '{"username": "admin", "password": "xxxxxxxx"}' -k
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJhZG1pbjpsb2dpbiIsImV4cCI6MTc0NTcxNjkzNCwibmJmIjoxNzQ1NjMwNTM0LCJpYXQiOjE3NDU2MzA1MzQsImp0aSI6ImU0ZDQwNjk0LTNkYTktNDBiNS1hODRmLWM1ZWU0NDJkMGQxMCJ9.OkmofUhhb7EG9TDSm_ZQNE9-HQBCYpSVKVXtN70wAJI"}
?創建jenkins file
pipeline {agent anyenvironment {ARGOCDSERVER = "https://argocd-server.example.com"ARGOCDPROJECT = "my-project"ARGOCDAPP = "my-app"K8SCONTEXT = "my-k8s-context"K8SNAMESPACE = "my-namespace"ARGOCDSYNCOPTIONS = "--sync-policy=auto --prune"}stages {stage('Deploy') {steps {script {def argocdToken = credentials('argocd-token')def appSpecFile = readFile("argocd/myapp.yaml")def argocd = new Argocd(server: ARGOCDSERVER, token: argocdToken)argocd.createApplication(appSpecFile, project: ARGOCDPROJECT)argocd.syncApplication(ARGOCDAPP, ARGOCDSYNCOPTIONS)}}}}
}
創建myapp.yaml?
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: myapp
spec:destination:server: https://kubernetes.default.svcnamespace: myappproject: defaultsource:repoURL: https://github.com/myorg/myapp.gittargetRevision: HEADpath: kubernetes/overlays/devsyncPolicy:automated:prune: trueselfHeal: truesyncOptions:- --skip-hookshelm:valueFiles:- values.yaml
創建deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: myapplabels:app: myapp
spec:replicas: 1selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myorg/myapp:latestports:- containerPort: 8080env:- name: MYAPP_ENVvalue: "prod"
創建service.yaml
apiVersion: v1
kind: Service
metadata:name: myapplabels:app: myapp
spec:selector:app: myappports:- name: httpport: 80targetPort: 8080type: LoadBalancer
??
Argo CD 與GitLab CI的集成
讓我們深入了解 ArgoCD 與 GitLab CI 集成的詳細步驟。
GitLab 和 ArgoCD 簡化了 CI/CD 工作流程,支持無縫部署到 Kubernetes 集群。
配置 GitLab CI/CD 流水線
設置您的 GitLab CI 流水線,通過 ArgoCD 觸??發部署。
在您的 git 倉庫根目錄中創建 .gitlab-ci.yaml 文件
stages:- build- deployvariables:# Set your Docker image name to nginxIMAGE_NAME: nginxIMAGE_TAG: latest# Define your AWS ECR repository URLECR_REPOSITORY: your-account-id.dkr.ecr.your-region.amazonaws.com/nginx
# Define your Kubernetes context for EKSKUBE_CONTEXT: dev-eks-clusterAWS_ACCESS_KEY_ID: $DEV_AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY: $DEV_AWS_SECRET_ACCESS_KEYbuild:stage: buildScript:- apk add --no-cache aws-cli - aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID} --profile default- aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY} --profile default- echo "Building the Nginx Docker image"- docker build -t $IMAGE_NAME:$IMAGE_TAG .- echo "Logging in to AWS ECR..."- aws ecr get-login-password --region your-region | docker login --username AWS --password-stdin $ECR_REPOSITORY- echo "Tagging Docker image for ECR..."- docker tag $IMAGE_NAME:$IMAGE_TAG $ECR_REPOSITORY:$IMAGE_TAG- echo "Pushing Docker image to ECR..."- docker push $ECR_REPOSITORY:$IMAGE_TAGonly:- devdeploy:stage: deployScript:- apk add --no-cache aws-cli - aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID} --profile default- aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY} --profile default- echo "Deploying to Kubernetes"- echo "Setting Kubernetes context to $KUBE_CONTEXT"- kubectl config use-context $KUBE_CONTEXT # Switch to the specified Kubernetes context- kubectl apply -f k8s/deployment.yamlonly:- dev
上述流水線包含一個構建階段和一個部署階段,部署階段將在構建成功后觸發 Kubernetes 部署。
設置 ArgoCD 以跟蹤您的 GitLab 代碼庫
現在,配置 ArgoCD 以監控 Git 代碼庫的更改并自動部署更新。
創建 ArgoCD 應用程序 YAML:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:name: gitlab-appnamespace: argocd
spec:project: defaultsource:repoURL: 'https://gitlab.com/repo-name.git'path: 'k8s'targetRevision: developerdestination:server: 'https://kubernetes.default.svc'namespace: argocdsyncPolicy:automated:prune: trueselfHeal: true
現在,使用以下命令應用上述文件:
Kubectl apply -f gitlab-argo.yaml -nargocd
此配置指示 ArgoCD 跟蹤 GitLab 代碼庫中的更改并將更新部署到 Kubernetes 集群中。
觸發 GitLab CI 流水線
將更改推送到 GitLab 中的開發者分支,.gitlab-ci.yml 中定義的流水線將觸發:
- 構建階段:執行測試或構建 Docker 鏡像并將其推送到 aws ecr 代碼庫。
- 部署階段:推送配置更改,這些更改將由 ArgoCD 同步并自動應用到您的 Kubernetes 集群。
您可以在 ArgoCD 用戶界面中監控部署進度,從而可以直觀地了解應用程序的狀態。
將 GitLab CI 的靈活性與 ArgoCD 的強大功能相結合,您的 Kubernetes 工作流程將煥然一新。
監控和可觀察性
應用控制器
ArgoCD 中的應用控制器負責管理和協調應用程序的預期狀態。監控應用控制器時,您可以收集和分析以下指標和信息:
- 應用同步狀態:您可以監控應用程序的同步狀態,包括它們是否為最新版本或是否遇到同步錯誤。
- 資源健康狀況:監控應用程序內資源(例如 Pod、服務)的健康狀況,以檢測崩潰或資源過度使用等問題。
- 應用部署歷史記錄:跟蹤應用程序部署和回滾的歷史記錄,以識別趨勢和異常。
- 性能指標:收集與應用控制器的資源消耗和響應時間相關的性能指標。
- 錯誤和事件日志:收集應用控制器生成的日志和事件,以診斷和解決問題。
ArgoCD 服務器
ArgoCD 服務器是核心組件,它提供基于 Web 的用戶界面和 API,用于管理應用程序和 GitOps 工作流。監控 ArgoCD 服務器時,您可以捕獲以下信息:
- API 請求指標:監控 ArgoCD REST API 的使用情況和性能,包括請求數量、響應時間和錯誤率。
- 用戶身份驗證和授權:跟蹤用戶登錄、身份驗證失敗和訪問控制事件,以確保安全性和合規性。
- 資源使用情況:監控服務器資源利用率(CPU、內存),以檢測性能瓶頸和擴展需求。
- 應用程序活動:收集有關應用程序 CRUD(創建、讀取、更新、刪除)操作和部署的信息。
- 儀表板指標:如果 ArgoCD 提供基于 Web 的儀表板,您可以監控儀表板的使用情況、用戶交互和導航模式。
代碼庫服務器
ArgoCD 中的代碼庫服務器負責與 Git 代碼庫交互,以獲取應用程序清單并同步應用程序狀態。監控代碼庫服務器時,您可以收集以下數據:
- Git 代碼庫同步:監控 Git 代碼庫同步的狀態,包括同步錯誤和代碼庫獲取時間。
- 資源緩存:跟蹤 Git 倉庫資源的緩存,這有助于減少頻繁獲取數據的需求,從而優化性能。
- 身份驗證和訪問:監控 Git 倉庫的身份驗證和訪問控制,以確保對 Git 倉庫的安全訪問。
- 資源完整性:驗證 Git 倉庫數據的完整性,并識別任何損壞或不一致問題。
- 資源使用情況:監控倉庫服務器的資源利用率,例如 CPU 和內存消耗。
在本文中,我將僅指導如何通過應用程序控制器和 ArgoCD 服務器公開指標,并使用其 CRD 在 Prometheus 端收集這些指標。
ArgoCD 服務器指標 (8083)
編輯 argocd-server svc 文件 (kubectl edit svc argocd-server -n argocd)
如果 argocd-server svc 文件中不存在該端口,請在 spec.ports 下添加指標端點端口,目標端口為 8083
編輯 argocd-server 部署文件 (kubectl edit deploy argocd-server -n argocd)
在 argocd-server 部署文件的 spec.template.annotations 下添加以下內容:
在 argocd-server 部署文件的 spec.template.spec.containers.args 下添加以下內容:
在 ports.containerPort 下,根據需要將端口更改為 8083
完成上述所有步驟后,您可以驗證指標是否在 8083 端口公開。
操作方法:kubectl port-forward -n argocd svc/argocd-server 8083
檢查 localhost:8083/metrics 是否可用。
驗證成功后,可以在 Prometheus 端設置服務監視器,以便在該端點查找指標。
argocd-server 指標的 ServiceMonitor:
SVC 名稱應準確指定,例如:argocd-server
ServiceMonitor 配置成功后,它應該以如下方式在 Prometheus 用戶界面中可見。
應用程序控制器指標 (8082)
在本例中,Argocd-application-controller 是一個 StatefulSet。我們可以通過以下命令檢查 StatefulSet 配置:kubectl edit statefulset <name> -n <namespace>
在 spec.template.metadata.annotations 下添加:
值得注意的是,在服務監視器或 Pod 監視器的 matchLabels 下,必須準確指定標簽,否則可能導致 CRD 配置錯誤。
實際上,指定的名稱應該與選擇器下相關 Pod 或服務中的鍵值對匹配。如下圖所示。
完成這些步驟后,我們可以運行以下命令進行端口轉發,以便在 8082 端口收集指標:kubectl port-forward -n argocd pod/argocd-application-controller-0 8082
與 argocd-server 類似,可以通過檢查 localhost:8082/metrics 端點來驗證指標是否從 argocd 公開。
將指標獲取到 Prometheus
由于應用程序控制器指標通過 statefulSet 公開,因此必須創建一個 PodMonitor。如果為此目的創建了 servicemonitor,argocd-application-controller 將不會被列為活動目標之一,因此標簽會被丟棄,從而導致 servicemonitor 中 matchLabels 下提到的標簽無法匹配。因此,必須實現 podmonitor。
成功配置 PodMonitor 后,它應該會以這樣的方式顯示在 Prometheus 界面中。
終于!您可以通過 Prometheus 查看指標了?

使用 Argo CD 的最佳實踐
1. 擁抱 GitOps 原則
Argo CD 的核心是一款 GitOps 工具。為了有效地使用它,您應該完全擁抱 GitOps 原則:
使用 Git 作為單一事實來源:所有應用程序清單、配置文件和環境狀態都應駐留在受版本控制的 Git 倉庫中。這種方法可確保您的 Kubernetes 集群始終反映 Git 中定義的狀態,從而提高一致性和可追溯性。
使用 Git 提交自動同步:配置 Argo CD 以自動將應用程序狀態與 Git 提交同步。此設置可確保推送到倉庫的任何更改都能快速一致地反映在您的 Kubernetes 集群中。
2. 合理組織倉庫和清單
合理組織倉庫和清單對于可維護性和可擴展性至關重要:
使用多倉庫方法:對于較大的組織或項目,可以考慮將清單拆分到多個倉庫中——一個用于應用程序清單,一個用于特定于環境的配置,另一個用于共享資源。這種結構使權限管理、關注點分離和維護清晰的歷史記錄更加容易。
利用 Helm Charts 或 Kustomize:使用 Helm 或 Kustomize 管理您的 Kubernetes 清單。這些工具提供的模板功能可以減少重復,簡化配置管理,并更輕松地處理應用程序的多個環境或版本。
3. 正確配置 Argo CD 應用程序
Argo CD 使用“應用程序”來表示部署。正確的配置是關鍵:
使用聲明式應用程序定義:在 Git 代碼庫中以聲明式方式定義您的 Argo CD 應用程序。這種做法使您能夠將應用程序作為代碼進行管理、版本控制更改并強制一致性。
設置適當的同步策略:配置同步策略以匹配您的部署策略。對于持續部署到非生產環境,請使用“自動同步”,對于可能需要人工審批的生產部署,請使用“手動同步”。
4. 實施強大的安全實踐
在管理大規模部署時,安全性至關重要。以下是一些關鍵實踐:
使用 RBAC 進行訪問控制:在 Argo CD 中實施基于角色的訪問控制 (RBAC),以限制對關鍵操作的訪問。為不同的團隊定義角色,并確保只有授權用戶才有權部署或修改應用程序。
啟用單點登錄 (SSO) 和外部身份驗證:將 Argo CD 與外部身份驗證提供程序(例如 OAuth、SAML 或 LDAP)集成,以啟用單點登錄 (SSO)。此設置簡化了用戶管理,增強了安全性,并符合組織標準。
監控訪問日志和審計跟蹤:定期監控 Argo CD 訪問日志和審計跟蹤,以跟蹤用戶活動。這些日志對于檢測未經授權的訪問或配置更改以及滿足合規性要求至關重要。
5. 優化應用程序健康和同步設置
Argo CD 提供健康檢查和同步選項,以確保應用程序保持理想狀態:
定義自定義健康檢查:使用自定義健康檢查來驗證除默認 Kubernetes 探測之外的應用程序健康狀況。這可能包括對應用程序功能至關重要的特定服務、端點或業務邏輯的檢查。
啟用資源修剪:Argo CD 允許您修剪 Git 代碼庫中不再定義的資源。此功能有助于防止配置漂移,并確保您的集群始終與所需狀態同步。
利用同步:使用同步波來控制資源同步的順序。當您需要確保某些資源(例如 ConfigMap 或 Secret)先于其他資源(例如 Deployment)創建時,此做法尤為有用。
Argo CD 監控和可觀察性最佳實踐
1. 啟用詳細指標和警報
監控對于維護應用程序的健康和性能至關重要。Argo CD 提供了多種內置監控功能:
啟用 Prometheus 指標:配置 Argo CD 以將指標公開給 Prometheus。此集成允許您跟蹤各種指標,例如同步操作的數量、同步時長和應用程序健康狀況。
為關鍵事件設置警報:使用 Prometheus Alertmanager 或 Grafana Alerts 等警報工具,為關鍵事件(例如同步失敗、應用程序降級或漂移檢測)創建通知。警報可幫助您快速響應事件并保持高可用性。
2. 有效利用 Argo CD 儀表板
Argo CD 儀表板提供應用程序及其狀態的實時視圖:
監控應用程序的健康狀況和狀態:定期檢查儀表板了解應用程序的狀態,包括同步狀態、健康檢查和錯誤消息。儀表板提供可視化概覽,幫助您快速識別和解決問題。
使用事件日志進行故障排除:Argo CD 的事件日志會捕獲與應用程序相關的所有同步操作、錯誤和事件。利用此日志來解決問題、了解根本原因并實施糾正措施。
3. 與外部可觀察性工具集成
雖然 Argo CD 提供了基本的監控功能,但與外部可觀察性工具集成可以增強可見性:
使用 Grafana 進行高級可視化:設置 Grafana 以可視化從 Argo CD 收集的 Prometheus 指標。創建自定義儀表板來監控部署的性能、健康狀況和狀態。
與集中式日志系統集成:將 Argo CD 日志轉發到 Elasticsearch、Loki 或 Fluentd 等集中式日志解決方案。此集成支持高級日志分析、搜索以及與其他基礎架構組件的關聯。
4. 實施 GitOps 監控工具
GitOps 監控工具提供用于觀察和管理 GitOps 工作流的專用功能:
使用 Argo CD 通知:配置 Argo CD 通知,以便直接在 Slack、Microsoft Teams 或電子郵件等工具中接收警報和通知。此集成可幫助團隊實時了解部署事件和應用程序狀態。
利用 Flux 或 Weave GitOps 等工具:將 Argo CD 與其他 GitOps 工具(例如 Flux 或 Weave GitOps)結合使用,以擴展跨多個集群或環境的監控和可觀察性功能。
優化 Argo CD 性能的技巧
擴展 Argo CD 以實現高可用性:以高可用性模式部署 Argo CD,每個組件(例如 API 服務器、控制器和存儲庫服務器)均有多個副本,以處理大規模部署并確保冗余。
調整資源限制和請求:為 Argo CD 組件定義適當的資源請求和限制,以確保最佳性能,避免資源爭用。定期監控資源使用情況,并根據工作負載調整限制。
使用緩存存儲庫實現更快同步:在 Argo CD 中啟用存儲庫緩存以加快同步操作速度,尤其適用于大型存儲庫或包含多個應用程序的環境。緩存可減少從 Git 獲取清單并將其應用于集群所需的時間。
定期清理舊應用程序和資源:從 Argo CD 和 Git 存儲庫中刪除未使用的應用程序、資源和清單。此清理操作可減少混亂,最大限度地降低資源消耗,并確保精簡高效的部署環境。
結論
通過遵循這些最佳實踐和技巧,您可以充分利用 Argo CD 的強大功能,在 Kubernetes 環境中實現無縫的應用程序部署和監控。從擁抱 GitOps 原則、優化部署配置到增強可觀察性和安全性,Argo CD 提供了一套全面的功能,可簡化您的持續交付工作流程。