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

相关推荐
a***113543 分钟前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
ByNotD0g44 分钟前
Golang开发项目学习
学习·微服务·云原生·golang
沐雨风栉44 分钟前
被局域网困住的文件?cpolar让 Go File 随时随地能用
运维·服务器·开发语言·数据库·后端·缓存·golang
ManageEngineITSM1 小时前
把问题“消灭在未来”:IT 资产管理软件与问题管理的深度融合逻辑
大数据·运维·人工智能·itsm·工单系统
云计算老刘1 小时前
5. MariaDB 数据库管理
linux·运维·服务器·centos
_lst_1 小时前
Linux进程切换与调度
linux·运维·服务器
w***95491 小时前
运维实战---多种方式在Linux中部署并初始化MySQL
linux·运维·mysql
双子座断点1 小时前
Ubuntu 硬盘扩容
linux·运维·ubuntu
❀搜不到1 小时前
问题:Ubuntu设置没有WiFi,且蓝牙也无法打开
linux·运维·ubuntu