二十五、基于ArgoCD的K8s多集群管理方案及落地

二十五、基于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

登录 Dashboard

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

此博客来源于:https://edu.51cto.com/lecturer/11062970.html

相关推荐
Leinwin4 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382504 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇4 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7594 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣5 小时前
智能体选型实战指南
运维·人工智能
yy55275 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ6 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔7 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密7 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20157 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑