二十五、基于ArgoCD的K8s多集群管理方案及落地
文章目录
- 二十五、基于ArgoCD的K8s多集群管理方案及落地
-
- 1、GitOps核心原则和工作流程
-
- [1.1 什么是 GitOps?](#1.1 什么是 GitOps?)
- [1.2 什么是 ArgoCD?](#1.2 什么是 ArgoCD?)
- [1.3 ArgoCD架构及核心组件](#1.3 ArgoCD架构及核心组件)
- [1.4 项目管理资源 --- AppProject](#1.4 项目管理资源 — AppProject)
- [1.5 应用配置生成器 --- ApplicationSet](#1.5 应用配置生成器 — ApplicationSet)
- [1.6 ArgoCD部署架构解析](#1.6 ArgoCD部署架构解析)
- [2、ArgoCD 部署](#2、ArgoCD 部署)
-
- [2.1 集群规划](#2.1 集群规划)
- [2.2 ArgoCD 安装部署](#2.2 ArgoCD 安装部署)
- [3、ArgoCD 初体验](#3、ArgoCD 初体验)
-
- [3.1 集群管理](#3.1 集群管理)
- [3.2 仓库管理](#3.2 仓库管理)
- [3.3 项目管理](#3.3 项目管理)
- [3.4 应用管理](#3.4 应用管理)
- [3.5 配置更新](#3.5 配置更新)
- [4、集成 Helm](#4、集成 Helm)
- 5、执行回滚
- [6、ArgoCD 客户端命令](#6、ArgoCD 客户端命令)
-
- [6.1 集群管理](#6.1 集群管理)
- [6.2 仓库管理](#6.2 仓库管理)
- [6.3 项目管理](#6.3 项目管理)
- [6.4 应用管理](#6.4 应用管理)
- [7、ArgoCD 多环境管理](#7、ArgoCD 多环境管理)
-
- [7.1 ArgoCD 配置多集群](#7.1 ArgoCD 配置多集群)
- [7.3 ArgoCD 多集群管理 APPSets](#7.3 ArgoCD 多集群管理 APPSets)
- [7.4 ArgoCD 添加新环境](#7.4 ArgoCD 添加新环境)
- [7.5 ArgoCD 个性化配置](#7.5 ArgoCD 个性化配置)
- 8、环境清理
- [9、 ArgoCD 多集群管理项目实战](#9、 ArgoCD 多集群管理项目实战)
-
- [9.1 ArgoCD 添加项目仓库](#9.1 ArgoCD 添加项目仓库)
- [9.2 ArgoCD 创建项目](#9.2 ArgoCD 创建项目)
- [9.3 ArgoCD 多集群部署应用](#9.3 ArgoCD 多集群部署应用)
-
- [9.3.1 部署 Handler 服务](#9.3.1 部署 Handler 服务)
- [9.3.2 部署 Receive 服务](#9.3.2 部署 Receive 服务)
- [9.3.3 部署前端服务](#9.3.3 部署前端服务)
- [9.3.4 访问测试](#9.3.4 访问测试)
- [10、集成 DevOps 建议](#10、集成 DevOps 建议)
1、GitOps核心原则和工作流程
1.1 什么是 GitOps?
GitOps 是一种为应用程序实现持续交付的现代化操作方法。GitOps 的核心思想是使用 Git 仓库作为应用程序和基础设施配置的唯一来源,并通过自动化的流程和工具确保系统状态与 Git 中声明的期望状态保持一致。
GitOps 核心原则:
- Git 代码作为唯一事实来源:GitOps 要求所有东西代码化,并存储于 Git 仓库中
- 声明式描述:整个应用和基础设施都必须能够通过声明式的语言进行描述
- 自动化的变更与交付:GitOps 工具监听 Git 中的变化,一旦代码发生变化,就会触发一个自动化的过程,把 Git 中定义的 "期望状态" 同步到系统中
GitOps 工作流程:

1.2 什么是 ArgoCD?
ArgoCD 是一个为 Kubernetes 和云原生设计的、声明式的、基于 GitOps 理念的一个持续交付工具。ArgoCD 采用声明式的资源配置即可实现自动化、一致性、可视化的多集群管理与服务部署。
ArgoCD 主要用途:
- 自动化同步部署:自动将 Git 仓库中定义的资源部署到 K8s 集群中
- 配置检测与修复:ArgoCD 可以检测配置的变更,并实现自动同步更正
- 复杂应用管理:ArgoCD 支持原生 Yaml 和 Helm 等工具,理论上支持几乎任何的 Kubernetes 应用
- 多集群、多环境:ArgoCD 支持管理多集群,实现多集群的统一管理与配置,同时支持多集群的个性化配置
- 声明式管理:ArgoCD 使用声明式资源即可完成服务发布相关工作,符合 GitOps 规范
- 可视化管理:ArgoCD 原生提供可视化页面,可以清晰的看到所部署的应用,以及每个应用的状态、健康状况和同步状态等
1.3 ArgoCD架构及核心组件
- APIServer:ArgoCD 的入口和控制中枢,用于处理所有的外部请求和内部调用。主要职责:
- 接受 UI、CLI 和 API 请求
- 管理应用的定义、同步和回滚操作
- 处理身份验证和权限控制
- Repository Server:仓库服务是一个内部服务,负责维护 Git 的本地缓存,作为 ArgoCD 的资料来源。主要职责:
- 用于存储和访问 Git 仓库中的内容
- 根据 Git 配置和自定义配置,动态生成最终的 YAML 文件
- 返回应用的配置清单给 APIServer
- Application Controller:应用程序控制器负责监听正在运行的应用,并将当前的实时状态与代码仓库中指定的期望目标状态进行比较,作为 ArgoCD 的自动化引擎。主要职责:
- 持续监控当前应用状态和期望状态的差异
- 自动采取纠正措施保证一致性
- 可在特定时刻执行钩子

1.4 项目管理资源 --- AppProject
AppProject:该资源主要用于提供逻辑分组的能力,比如多个团队共同使用 ArgoCD 时,可以使用该资源进行权限分配和隔离。
主要功能:
- 部署源限制:规定项目下的应用只能从哪些 Git 或 Helm 仓库获取资源
- 部署目标限制:规定项目下的应用只能部署到哪些集群和命名空间
- 资源访问限制:精细控制可以部署的资源类型(比如只能操作 Deployment)
- 权限控制:与 ArgoCD 自身的 RBAC 集成,控制用户或组对项目内资源的操作权限
1.5 应用配置生成器 --- ApplicationSet
ApplicationSet:该资源主要用于自动化和管理多个 Application 资源,可以实现多集群、多环境的部署管理,同时可以基于自定义字段实现多集群个性化配置。
1.6 ArgoCD部署架构解析

2、ArgoCD 部署
2.1 集群规划
| 区域 | 主机名称 | 主机IP | 备注 |
|---|---|---|---|
| 华北-北京 | k8s-bj-master01 | 192.168.200.60 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
| 华东-南京 | k8s-nj-master01 | 192.168.200.61 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
| 华南-广州 | k8s-gz-master01 | 192.168.200.62 | 实际(生产)上该地区要安装完整的k8s集群,这里仅测试单实例 |
2.2 ArgoCD 安装部署
直接使用 kubectl 安装最新稳定版 ArgoCD:
[root@k8s-bj-master01 ~]# kubectl create namespace argocd
[root@k8s-bj-master01 ~]# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
查看状态:
[root@k8s-bj-master01 ~]# kubectl get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 7m1s
argocd-applicationset-controller-7b6ff755dc-zlzkc 1/1 Running 0 7m2s
argocd-dex-server-584f7d88dc-kvqlq 1/1 Running 0 7m2s
argocd-notifications-controller-67cdd486c6-qcgp9 1/1 Running 0 7m2s
argocd-redis-6dbb9f6cf4-9jhlw 1/1 Running 0 7m2s
argocd-repo-server-57bdcb5898-kwt6z 1/1 Running 0 7m2s
argocd-server-57d9cc9bcf-cwl77 1/1 Running 0 7m1s
接下来安装客户端工具,下载地址,选择最新稳定版本,比如:


下载后,上传到/usr/local/bin/并重命名为 argocd 即可:
[root@k8s-bj-master01 ~]# mv argocd-linux-amd64 /usr/local/bin/argocd
[root@k8s-bj-master01 ~]# chmod +x /usr/local/bin/argocd
安装完成后,更改 ArgoCD Server 的 Service 为 NodePort,用于访问 Dashboard:
[root@k8s-bj-master01 ~]# kubectl get svc argocd-server -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server ClusterIP 10.101.96.227 <none> 80/TCP,443/TCP 8m20s
[root@k8s-bj-master01 ~]# kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
[root@k8s-bj-master01 ~]# kubectl get svc argocd-server -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server NodePort 10.101.96.227 <none> 80:32018/TCP,443:31164/TCP 8m31s
查看管理员密码:
[root@k8s-bj-master01 ~]# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
Im0eUlpMsIOnOi1w
3、ArgoCD 初体验
3.1 集群管理
ArgoCD 管理集群资源,需要先添加目标集群,接下来使用 ArgoCD 客户端工具添加集群。首先查看当前 Kubeconfig 所管理的集群列表:
[root@k8s-bj-master01 ~]# kubectl config get-contexts -o name
kubernetes-admin@kubernetes
ArgoCD 客户端登录 ArgoCD:
# 登录
[root@k8s-bj-master01 ~]# argocd login 10.101.96.227
WARNING: server certificate had error: error creating connection: tls: failed to verify certificate: x509: cannot validate certificate for 10.101.96.227 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.101.96.227' updated
添加集群,并且指定集群名字为 k8s-bj-master:
[root@k8s-bj-master01 ~]# argocd cluster add kubernetes-admin@kubernetes --name k8s-bj-cluster
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `kubernetes-admin@kubernetes` with full cluster level privileges. Do you want to continue [y/N]? y
{"level":"info","msg":"ServiceAccount \"argocd-manager\" created in namespace \"kube-system\"","time":"2025-11-29T16:55:43+08:00"}
{"level":"info","msg":"ClusterRole \"argocd-manager-role\" created","time":"2025-11-29T16:55:43+08:00"}
{"level":"info","msg":"ClusterRoleBinding \"argocd-manager-role-binding\" created","time":"2025-11-29T16:55:43+08:00"}
{"level":"info","msg":"Created bearer token secret \"argocd-manager-long-lived-token\" for ServiceAccount \"argocd-manager\"","time":"2025-11-29T16:55:43+08:00"}
Cluster 'https://192.168.200.60:6443' added
查看已添加的集群:
[root@k8s-bj-master01 ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://192.168.200.60:6443 k8s-bj-cluster 1.34 Successful
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
添加后,WebUI 也可以看到集群:


3.2 仓库管理
接下来添加一个用于测试的仓库:


点击 CONNECT 即可链接到该仓库(该仓库为公开仓库,所以无需配置访问密钥):

3.3 项目管理
接下来可以创建一个测试的项目,比如公司内有一个项目叫做 GuestBook,那么可以在 ArgoCD 上添加一个同名的项目:


接下来配置一下该项目的权限,比如可以部署资源到哪个集群和哪个空间,以及可以允许使用的 Git 仓库。首先添加允许使用的仓库:



配置可以操作的集群和目标 Namespace:

配置可以操作的资源:

开启资源监控:

3.4 应用管理
接下来在该项目下创建一个应用:

SYNC POLICY 有手动和自动两个选项,按需选择即可。
同步应用可选参数配置:

选择该应用所使用的仓库和路径:

选择部署的集群和 Namespace:

接下来点击创建即可:

此时应用已创建,但是状态未同步:

同步最新配置:

同步后,所有资源显示为绿色即可:

此时集群也可以查询相关资源:
[root@k8s-bj-master01 ~]# kubectl get ns guestbook
NAME STATUS AGE
guestbook Active 26s
[root@k8s-bj-master01 ~]# kubectl get po -n guestbook
NAME READY STATUS RESTARTS AGE
guestbook-ui-7b46b474ff-tmmkh 1/1 Running 0 26s
3.5 配置更新
由于配置的应用为手动更新方式,所以当仓库中的配置更新后,需要手动进行配置更新:

没有自动更新

接下来可以手动同步该资源:


接下来查看 NodePort 即可访问该服务:

4、集成 Helm
在生产环境中,推荐采用 Helm 的方式进行管理服务,可以实现多环境、多集群的个性化配置。
接下来使用 helm 形式再次部署一个测试应用,首先给 guestbook 新增一个 guestbook-helm 的 Namespace:

接下来创建一个新的应用:

新应用采用自动同步的方式,SELF HEAL 代表强制把 Git 中的的状态同步到集群,PRUNE RESOURCES 代表自动删除 Git 中不存在的资源。
其它配置和之前保持一致:

配置安装源:

当安装源为 Helm 时,ArgoCD 会自动渲染当前 Values 的配置:


选择部署的集群和 Namespace:

接下来创建即可,创建后资源会自动同步:

Helm 形式的资源,可以在 Details 处进行更新:


假设把副本更新为 2,直接编辑保存即可:


此时更新后的参数会在 app 资源中记录:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd guestbook-helm -oyaml
....
source:
helm:
parameters:
- name: replicaCount
value: "2"
valueFiles:
- values.yaml
path: helm-guestbook
repoURL: https://gitee.com/ywb1234/argocd-example-apps
targetRevision: HEAD
....
5、执行回滚
ArgoCD 记录了每次的更新,可以实现一键回滚,比如更改了一些配置,想要回滚到某个版本,可以点击 APP 的 HISTOTY AND ROLLBACK:

找到需要回滚的版本,点击 Rollback 即可:

虽然 ArgoCD 提供了一键回滚的功能,但是回滚后,ArgoCD 的状态将会和 Git 仓库中的配置不一致:

所以推荐非紧急问题需要通过回滚 Git 代码,再进行同步。
6、ArgoCD 客户端命令
- 登录登出:argocd login / argocd logout
- 集群管理:argocd cluster
- 项目管理:argocd proj
- 仓库管理:argocd repo
- 应用管理:argocd app
- 应用集管理:argocd appset
- 用户管理:argocd account
6.1 集群管理
添加集群:
# kubectl config get-contexts -o name
# argocd cluster add kubernetes-admin@kubernetes --name k8s-bj-cluster
通过指定 kubeconfig 添加集群:
# 将另外一个集群机器的config文件拷贝过来
[root@k8s-bj-master01 ~]# scp root@192.168.200.61:/root/.kube/config ./nj-kubeconfig
# 通过指定 kubeconfig 添加集群
[root@k8s-bj-master01 ~]# argocd cluster add kubernetes-admin@kubernetes --name k8s-nj-cluster --kubeconfig nj-kubeconfig
获取集群列表:
[root@k8s-bj-master01 ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://192.168.200.60:6443 k8s-bj-cluster 1.34 Successful
https://192.168.200.61:6443 k8s-nj-cluster 1.34 Successful
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
删除集群:
[root@k8s-bj-master01 ~]# argocd cluster rm k8s-nj-cluster
[root@k8s-bj-master01 ~]# argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://192.168.200.60:6443 k8s-bj-cluster 1.34 Successful
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
查看集群详情:
[root@k8s-bj-master01 ~]# argocd cluster get k8s-bj-cluster
config:
tlsClientConfig:
insecure: false
connectionState:
attemptedAt: "2025-11-29T10:08:27Z"
message: ""
status: Successful
....
6.2 仓库管理
查看仓库列表:
[root@k8s-bj-master01 ~]# argocd repo list
TYPE NAME REPO INSECURE OCI LFS CREDS STATUS MESSAGE PROJECT
git argocd-example-apps https://gitee.com/ywb1234/argocd-example-apps false false false false Successful
添加仓库:
# https 协议
# argocd repo add https://github.com/argoproj/argocd-example-apps.git --username git --password secret --insecure-skip-server-verification --name test-repo
# argocd repo add https://oauth:TOKEN@git.example.com/repos/repo.git
# ssh 协议
# argocd repo add git@git.example.com:repos/repo --insecure-ignore-host-key --ssh-private-key-path ~/id_rsa --name test-repo
获取仓库详情:
# argocd repo get https://github.com/argoproj/argocd-example-apps.git
删除仓库:
# argocd repo rm https://github.com/argoproj/argocd-example-apps.git
6.3 项目管理
项目管理功能推荐使用 WebUI。
获取项目列表:
[root@k8s-bj-master01 ~]# argocd proj list
NAME DESCRIPTION DESTINATIONS SOURCES CLUSTER-RESOURCE-WHITELIST NAMESPACE-RESOURCE-BLACKLIST SIGNATURE-KEYS ORPHANED-RESOURCES DESTINATION-SERVICE-ACCOUNTS
default *,* * */* <none> <none> disabled <none>
guestbook ArgoCD 测试项目 2 destinations https://gitee.com/ywb1234/argocd-example-apps */Namespace <none> <none> enabled (warn=true) <none>
添加项目:
[root@k8s-bj-master01 ~]# argocd proj create test
[root@k8s-bj-master01 ~]# argocd proj list
NAME DESCRIPTION DESTINATIONS SOURCES CLUSTER-RESOURCE-WHITELIST NAMESPACE-RESOURCE-BLACKLIST SIGNATURE-KEYS ORPHANED-RESOURCES DESTINATION-SERVICE-ACCOUNTS
....
test <none> <none> <none> <none> <none> disabled <none>
编辑项目配置:
[root@k8s-bj-master01 ~]# argocd proj edit guestbook
获取项目详情:
[root@k8s-bj-master01 ~]# argocd proj get guestbook
Name: guestbook
Description: ArgoCD 测试项目
Destinations: https://192.168.200.60:6443,guestbook
https://192.168.200.60:6443,guestbook-helm
Repositories: https://gitee.com/ywb1234/argocd-example-apps
Source Namespaces: <none>
Scoped Repositories: <none>
Allowed Cluster Resources: */Namespace
Scoped Clusters: <none>
Denied Namespaced Resources: <none>
Signature keys: <none>
Orphaned Resources: enabled (warn=true)
删除项目:
[root@k8s-bj-master01 ~]# argocd proj delete test
该资源也可以通过 kubectl 进行管理:
[root@k8s-bj-master01 ~]# kubectl get appproj -n argocd
NAME AGE
default 86m
guestbook 76m
6.4 应用管理
获取应用列表:
[root@k8s-bj-master01 ~]# argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/guestbook-helm https://192.168.200.60:6443 guestbook-helm guestbook OutOfSync Healthy Manual <none> https://gitee.com/ywb1234/argocd-example-apps helm-guestbook HEAD
argocd/guestbook-ui https://192.168.200.60:6443 guestbook guestbook Synced Healthy Manual <none> https://gitee.com/ywb1234/argocd-example-apps guestbook HEAD
根据项目获取:
# argocd app list -p default
根据标签获取:
# argocd app list -l tag=default
获取应用详情:
[root@k8s-bj-master01 ~]# argocd app get guestbook-ui
Name: argocd/guestbook-ui
Project: guestbook
Server: https://192.168.200.60:6443
Namespace: guestbook
URL: https://10.101.96.227/applications/guestbook-ui
Source:
- Repo: https://gitee.com/ywb1234/argocd-example-apps
Target: HEAD
Path: guestbook
SyncWindow: Sync Allowed
Sync Policy: Manual
Sync Status: Synced to HEAD (9b71c80)
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service guestbook guestbook-ui Synced Healthy service/guestbook-ui serverside-applied
apps Deployment guestbook guestbook-ui Synced Healthy
创建应用:
[root@k8s-bj-master01 ~]# 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
[root@k8s-bj-master01 ~]# argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/guestbook https://kubernetes.default.svc default default OutOfSync Missing Manual <none> https://github.com/argoproj/argocd-example-apps.git guestbook
....
同步应用:
[root@k8s-bj-master01 ~]# argocd app sync argocd/guestbook
删除应用:
[root@k8s-bj-master01 ~]# argocd app delete argocd/guestbook
该资源也可以通过 kubectl 进行管理:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd
NAME SYNC STATUS HEALTH STATUS
guestbook-helm OutOfSync Healthy
guestbook-ui Synced Healthy
7、ArgoCD 多环境管理
7.1 ArgoCD 配置多集群
首先把其它环境的集群添加到 ArgoCD,用来模拟多集群:
[root@k8s-bj-master01 ~]# argocd cluster add kubernetes-admin@kubernetes --name k8s-nj-cluster --kubeconfig nj-kubeconfig
[root@k8s-bj-master01 ~]# argocd cluster add kubernetes-admin@kubernetes --name k8s-gd-cluster --kubeconfig gd-kubeconfig

###7.2 ArgoCD 多环境项目配置
创建一个为名 multi 的测试项目:

配置集群和仓库源:


配置允许的资源:

开启监控:

7.3 ArgoCD 多集群管理 APPSets
由于是同时管理多个集群,所以不再推荐使用单独的 Application 资源,而应该使用 ApplicationSet 资源。
接下来创建一个 ApplicationSet 资源,先用于部署北京的环境:
[root@k8s-bj-master01 ~]# vim multi-appsets.yaml
[root@k8s-bj-master01 ~]# cat multi-appsets.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: multi
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: k8s-bj-cluster
url: https://192.168.200.60:6443
region: bj
template:
metadata:
name: 'multi-{{region}}'
spec:
destination:
namespace: multi
server: '{{url}}'
project: multi
source:
repoURL: 'https://gitee.com/ywb1234/argocd-example-apps.git'
targetRevision: HEAD
path: helm-guestbook
helm:
valueFiles:
- values.yaml
syncPolicy:
retry:
backoff:
duration: 5s
factor: 2
maxDuration: 3m0s
limit: 2
syncOptions:
- Validate=false
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- ServerSideApply=true
- PruneLast=true
- PrunePropagationPolicy=foreground
[root@k8s-bj-master01 ~]# kubectl create -f multi-appsets.yaml
创建该资源后,查看自动生成的 Application:

接下来点击同步,同步资源:

7.4 ArgoCD 添加新环境
假如现在需要把 multi 项目,部署到其它环境,只需要更改 APPSets 资源,之后同步新的 APP即可,比如添加南京和广东的集群:
[root@k8s-bj-master01 ~]# vim multi-appsets_v2.yaml
[root@k8s-bj-master01 ~]# cat multi-appsets_v2.yaml
....
elements:
- cluster: k8s-bj-cluster
url: https://192.168.200.60:6443
region: bj
- cluster: k8s-nj-cluster
url: https://192.168.200.61:6443
region: nj
- cluster: k8s-gd-cluster
url: https://192.168.200.62:6443
region: gd
....
[root@k8s-bj-master01 ~]# kubectl replace -f multi-appsets_v2.yaml
接下来更新该资源,之后查看 APP 列表:

同步状态后查看资源:

7.5 ArgoCD 个性化配置
上述的多集群部署配置都统一,但是在生产环境中,针对不同的集群可能会出现配置上的差异,比如某个集群是主集群,在这个集群中的服务可能比其它集群要多,或者分布在各个地区的镜像仓库地址不一样,此时就会出现配置的差异,这个时候可以利用 APPSets 的 parameters 字段实现个性化配置。
比如针对 multi 项目,nj 和 gd 集群设置副本为 2,bj 保持为 1 个,首先在 elements 字段下添加 replicaCount 属性:
[root@k8s-bj-master01 ~]# vim multi-appsets_v3.yaml
[root@k8s-bj-master01 ~]# cat multi-appsets_v3.yaml
....
elements:
- cluster: k8s-bj-cluster
url: https://192.168.200.60:6443
region: bj
replicaCount: "1"
- cluster: k8s-nj-cluster
url: https://192.168.200.61:6443
region: nj
replicaCount: "2"
- cluster: k8s-gd-cluster
url: https://192.168.200.62:6443
region: gd
replicaCount: "2"
....
接下来在 helm 字段中,添加 parameters 属性:
helm:
parameters:
- name: "replicaCount"
value: '{{replicaCount}}'
valueFiles:
- values.yaml
之后更新 APPSets 资源:
[root@k8s-bj-master01 ~]# kubectl replace -f multi-appsets_v3.yaml
同步配置:
[root@k8s-bj-master01 ~]# argocd app sync --project=multi
查看状态:
[root@k8s-bj-master01 ~]# argocd app list --project multi
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET
argocd/multi-bj https://192.168.200.60:6443 multi multi Synced Healthy Manual <none> https://gitee.com/ywb1234/argocd-example-apps.git helm-guestbook HEAD
argocd/multi-gd https://192.168.200.62:6443 multi multi Synced Healthy Manual <none> https://gitee.com/ywb1234/argocd-example-apps.git helm-guestbook HEAD
argocd/multi-nj https://192.168.200.61:6443 multi multi Synced Healthy Manual <none> https://gitee.com/ywb1234/argocd-example-apps.git helm-guestbook HEAD
# 也可以使用 kubectl 查看状态:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd
NAME SYNC STATUS HEALTH STATUS
guestbook-helm OutOfSync Healthy
guestbook-ui Synced Healthy
multi-bj Synced Healthy
multi-gd Synced Healthy
multi-nj Synced Healthy
8、环境清理
# 删除 APPSets:
[root@k8s-bj-master01 ~]# kubectl delete appsets -n argocd --all
# 删除其它 APP:
[root@k8s-bj-master01 ~]# kubectl delete app -n argocd --all
9、 ArgoCD 多集群管理项目实战
9.1 ArgoCD 添加项目仓库
接下来把改造好的项目仓库,添加到 ArgoCD 中:
[root@k8s-bj-master01 ~]# argocd repo add https://gitee.com/ywb1234/argocd-demo-charts.git --name demo
也可以通过页面添加

9.2 ArgoCD 创建项目
接下来为该项目创建一个 Project:





9.3 ArgoCD 多集群部署应用
9.3.1 部署 Handler 服务
之后为各个微服务创建 APPSets,首先添加 handler 服务:
[root@k8s-bj-master01 ~]# vim appsets-handler.yaml
[root@k8s-bj-master01 ~]# cat appsets-handler.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: handler
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: k8s-bj-cluster
url: https://192.168.200.60:6443
region: bj
replicaCount: "1"
- cluster: k8s-nj-cluster
url: https://192.168.200.61:6443
region: nj
replicaCount: "2"
- cluster: k8s-gd-cluster
url: https://192.168.200.62:6443
region: gd
replicaCount: "2"
template:
metadata:
name: 'handler-{{region}}'
labels:
project: demo
app: handler
spec:
destination:
namespace: demo
server: '{{url}}'
project: demo
source:
repoURL: 'https://gitee.com/ywb1234/argocd-demo-charts.git'
targetRevision: HEAD
path: handler
helm:
parameters:
- name: "replicaCount"
value: '{{replicaCount}}'
valueFiles:
- values.yaml
syncPolicy:
retry:
backoff:
duration: 5s
factor: 2
maxDuration: 3m0s
limit: 2
syncOptions:
- Validate=false
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- ServerSideApply=true
- PruneLast=true
- PrunePropagationPolicy=foreground
创建该资源:
[root@k8s-bj-master01 ~]# kubectl create -f appsets-handler.yaml -n argocd
查看创建的 APP:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd --show-labels
NAME SYNC STATUS HEALTH STATUS LABELS
handler-bj OutOfSync Missing app=handler,project=demo
handler-gd OutOfSync Missing app=handler,project=demo
handler-nj OutOfSync Missing app=handler,project=demo
同步状态:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd --show-labels
NAME SYNC STATUS HEALTH STATUS LABELS
handler-bj Synced Healthy app=handler,project=demo
handler-gd Synced Healthy app=handler,project=demo
handler-nj Synced Healthy app=handler,project=demo
查看服务:
[root@k8s-bj-master01 ~]# kubectl get po -n demo
NAME READY STATUS RESTARTS AGE
handler-854684c486-ddn8n 1/1 Running 0 8m45s
9.3.2 部署 Receive 服务
创建 APPSets 文件,并修改:
[root@k8s-bj-master01 ~]# cp appsets-handler.yaml appsets-demo-receive.yaml
[root@k8s-bj-master01 ~]# sed -i "s#handler#demo-receive#g" appsets-demo-receive.yaml
创建 APPSets:
[root@k8s-bj-master01 ~]# kubectl create -f appsets-demo-receive.yaml -n argocd
查看创建的 APP:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd --show-labels
NAME SYNC STATUS HEALTH STATUS LABELS
demo-receive-bj OutOfSync Missing app=demo-receive,project=demo
demo-receive-gd OutOfSync Missing app=demo-receive,project=demo
demo-receive-nj OutOfSync Missing app=demo-receive,project=demo
....
同步状态:
[root@k8s-bj-master01 ~]# argocd app sync -l app=demo-receive
查看服务部署状态:
[root@k8s-bj-master01 ~]# kubectl get po -n demo -l app.kubernetes.io/name=demo-receive
NAME READY STATUS RESTARTS AGE
demo-receive-568fc7bbdc-gd9f8 1/1 Running 0 69s
[root@k8s-bj-master01 ~]# kubectl get svc -n demo -l app.kubernetes.io/name=demo-receive
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-receive ClusterIP 10.102.10.246 <none> 8080/TCP 71s
[root@k8s-bj-master01 ~]# kubectl get ingress -n demo -l app.kubernetes.io/name=demo-receive
NAME CLASS HOSTS ADDRESS PORTS AGE
demo-receive nginx demo.test.com 192.168.200.60 80 83s
9.3.3 部署前端服务
创建 APPSets 文件,并修改:
[root@k8s-bj-master01 ~]# cp appsets-handler.yaml appsets-demo-ui.yaml
[root@k8s-bj-master01 ~]# sed -i "s#handler#demo-ui#g" appsets-demo-ui.yaml
创建 APPSets:
[root@k8s-bj-master01 ~]# kubectl create -f appsets-demo-ui.yaml -n argocd
查看创建的 APP:
[root@k8s-bj-master01 ~]# kubectl get app -n argocd --show-labels
NAME SYNC STATUS HEALTH STATUS LABELS
demo-ui-bj OutOfSync Missing app=demo-ui,project=demo
demo-ui-gd OutOfSync Missing app=demo-ui,project=demo
demo-ui-nj OutOfSync Missing app=demo-ui,project=demo
....
同步状态:
[root@k8s-bj-master01 ~]# argocd app sync -l app=demo-ui
查看服务部署状态:
[root@k8s-bj-master01 ~]# kubectl get po -n demo -l app.kubernetes.io/name=demo-ui
NAME READY STATUS RESTARTS AGE
demo-ui-7885fdb7f9-2b5xw 1/1 Running 0 79s
[root@k8s-bj-master01 ~]# kubectl get svc -n demo -l app.kubernetes.io/name=demo-ui
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-ui ClusterIP 10.106.203.189 <none> 80/TCP 85s
[root@k8s-bj-master01 ~]# kubectl get ingress -n demo -l app.kubernetes.io/name=demo-ui
NAME CLASS HOSTS ADDRESS PORTS AGE
demo-ui nginx demo.test.com 192.168.200.60 80 91s
9.3.4 访问测试
接下来即可通过域名访问该服务,注意需要把域名解析到三个集群中任意一个 ingress controller 的节点:

10、集成 DevOps 建议
接入流程:
- 如果是发布多环境(测试环境)
- CI 工具制作新镜像
- CI 工具把镜像更新至 Git
- CI 工具使用 ArgoCD 命令同步数据
- 如果是发布多集群(生产环境)
- 发版平台选择已经测试过的镜像
- CI 工具把镜像更新至 Git
- CI 工具使用 ArgoCD 命令同步数据
Jenkins Pipeline 示例代码:
pipeline {
agent any // 使用任何可用的代理执行流水线
environment {
// 定义一些环境变量,比如镜像地址、ArgoCD 仓库地址等
IMAGE_ADDRESS = "xxx:xxx"
GIT_REPO = 'https://xxx.git'
ARGOCD_APP_NAME = 'xxx'
}
stages {
stage('Checkout') {
steps {
// 1. 拉取最新代码
git branch: 'main', url: 'https://your-git-repo.com/yourusername/your-app-code.git'
}
}
stage('Update Deployment Manifest') {
steps {
script {
// 2. 更新 Git 仓库中的镜像地址
sh """
cd ${ARGOCD_APP_NAME}
sed -i 's|image: your-image:.*|image:${IMAGE_ADDRESS}|' values.yaml
"""
// 提交更改
sh """
git config user.email "dotbalo"
git config user.name "dukuan"
git add .
git commit -m "Update image to ${IMAGE_ADDRESS}"
git push origin main
"""
}
}
}
stage('Sync ArgoCD Application') {
steps {
script {
// 3. 触发 ArgoCD 同步应用
withCredentials([string(credentialsId:"${env.ARGOCD_CREDENTIALS_ID}", variable: 'ARGOCD_TOKEN')]) {
sh """
argocd login ARGOCD_ADDRESS --auth-token ${ARGOCD_TOKEN} # 用户名密码
argocd app sync -l app=${ARGOCD_APP_NAME}
# 可选:等待应用健康
argocd app wait -l app=${ARGOCD_APP_NAME} --health --timeout 300
"""
}
}
}
}
}
}
Tekton 更改 ArgoCD 资源文件的 Task 示例:
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: update-deployment-manifest
spec:
params:
- name: gitRepo
type: string
description: ArgoCD 资源文件仓库地址
- name: imageAddress
type: string
description: 镜像地址
- name: pathToManifests
type: string
description: 当前服务的文件路径
steps:
- name: update-and-push
image: alpine/git # 使用包含 git 和必要工具(如 sed, yq)的镜像
script: |
# 克隆仓库
git clone $(params.gitRepo) deployment-repo
cd deployment-repo/$(params.pathToManifests)
# 更新镜像标签,例如在 values.yaml 中
sed -i "s|image: your-image:.*|image: $(params.imageAddress)|" values.yaml
# 配置 git 并提交推送
git config user.email "dotbalo@example.com"
git config user.name "dukuan"
git add .
git commit -m "Update image to $(params.imageTag)"
git push
Tekton 同步 ArgoCD 的 Task:
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: argocd-sync
spec:
params:
- name: argocdServer
type: string
description: ArgoCD 服务器地址
default: "argocd-server.argocd.svc.cluster.local:443"
- name: argocdAppName
type: string
description: ArgoCD 应用名称
- name: argocdToken
type: string
description: ArgoCD 认证令牌,或者用户名密码
steps:
- name: sync-application
image: argoproj/argocd-cli:v2.7.6 # 包含 argocd CLI 的镜像
script: |
# ArgoCD 登录
argocd login $(params.argocdServer) \
--auth-token "$(params.argocdToken)" \
--grpc-web
# 同步应用
echo "正在同步应用: $(params.argocdAppName)"
argocd app sync -l app=$(params.argocdAppName)
# 等待应用健康状态
echo "等待应用同步成功..."
argocd app wait -l app=$(params.argocdAppName) --health --timeout 300
