跳转至

App of Apps

概念讲解

1. 什么是 App of Apps

  • “App of Apps” 是 Argo CD 中一种高效的应用编排模式,其核心思想是通过一个父应用(Parent App)集中管理多个子应用(Child Apps)

  • 父应用本身并不直接部署业务负载,而是通过声明式配置定义所有子应用的元信息(如 Git 仓库地址、目标集群、命名空间、同步策略等)。当父应用被部署、更新或同步时,Argo CD 会自动触发所有子应用的生命周期管理(包括创建、更新、删除),实现子应用的批量管控和统一协调。

2. 典型使用场景

  1. 微服务架构的统一管控 在微服务体系中,一个完整业务系统通常由多个独立微服务组成(如用户服务、订单服务、支付服务等)。通过 “App of Apps” 模式,可将每个微服务定义为一个子应用,由父应用统一管理:
  2. 父应用集中配置所有子应用的版本、部署环境和依赖关系;
  3. 当业务需要整体升级或回滚时,只需更新父应用的配置,即可批量同步所有子应用,避免逐个操作的繁琐和不一致风险。
  4. 多环境的标准化管理 对于开发、测试、预发布、生产等不同环境,往往需要一套统一的应用部署模板,仅通过环境变量、配置文件等参数区分差异。此时可通过 “App of Apps” 模式实现:
  5. 父应用定义环境通用的基础配置(如应用拓扑、资源约束);
  6. 子应用关联对应环境的配置仓库(如 dev-values.yamlprod-values.yaml),实现 “一套模板、多环境复用”,同时保证环境间的配置一致性。
  7. 复杂应用的分层部署 对于包含前端、后端、数据库、中间件等组件的复杂应用,可按功能模块拆分为多个子应用(如前端子应用、API 服务子应用、数据库子应用),通过父应用实现分层部署:
  8. 父应用可定义子应用的部署顺序(如先启动数据库,再部署后端,最后启动前端);
  9. 当某个模块需要独立升级时,只需更新对应子应用的配置,不影响其他模块,提升迭代灵活性。

项目

AppProject CRD 是 Kubernetes 资源对象,代表应用程序的逻辑分组。它由以下关键信息定义:

  • sourceRepos引用项目内的应用程序可以从中提取清单的存储库。
  • destinations引用项目内的应用程序可以部署到的集群和命名空间。
  • roles实体列表及其对项目内资源的访问权限的定义。

可以部署到 Argo CD 命名空间的项目授予管理员访问权限

如果项目的destinations配置允许部署到安装 Argo CD 的命名空间,则该项目下的应用程序将具有管理员级别的访问权限。 应谨慎限制对管理员级别项目的RBAC 访问sourceRepos,并且推送访问权限应仅限于管理员。

创建 App of Apps

仓库结构规划

> https://gitea.gitops.linuxcdn.com:60000/argocd-test/app-of-apps.git
> git@gitea.gitops.linuxcdn.com:argocd-test/app-of-apps.git

app-of-apps
├── mysql-app1
│   ├── statefulset.yaml
│   ├── configs.yaml
│   └── svc.yaml
├── wordpress-app2
│   ├── deployment.yaml
│   ├── configs.yaml
│   └── svc.yaml
└── wordpress-apps
    └── applications.yaml
git clone https://gitea.gitops.linuxcdn.com:60000/argocd-test/app-of-apps.git
cd app-of-apps
mkdir app{1,2}
touch

3. 创建 App of Apps

3.1 基本 YAML 示例

# app-of-apps.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root-application
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-repo/argo-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd

3.2 目录结构示例

argo-apps/
├── apps/
│   ├── app1/
│   │   └── application.yaml
│   ├── app2/
│   │   └── application.yaml
│   └── app3/
│       └── application.yaml
└── app-of-apps.yaml

4. 高级配置

4.1 同步策略

spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true

4.2 使用 Kustomize

# kustomization.yaml
resources:
- ../../base/app1
- ../../base/app2
- ../../base/app3

5. 操作命令

5.1 部署 App of Apps

argocd app create -f app-of-apps.yaml

5.2 同步所有应用

argocd app sync root-application

5.3 查看状态

argocd app get root-application

6. 最佳实践

  1. 命名规范

  2. 父应用:team-name-platform(如 payment-team-prod)

  3. 子应用:service-name(如 payment-service)

  4. 目录结构

argo-config/
├── teams/
│   ├── team-a/
│   │   ├── app-of-apps.yaml
│   │   └── apps/
│   └── team-b/
│       ├── app-of-apps.yaml
│       └── apps/
└── shared/
    └── apps/
  1. 权限控制

  2. 使用 ArgoCD Projects 隔离不同团队的 App of Apps

  3. 结合 RBAC 控制访问权限

7. 常见问题

7.1 如何批量更新?

使用同步策略中的 automated配置或执行:

argocd app set root-application --sync-policy automated

7.2 如何解决依赖关系?

  1. 使用 Sync Waves
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "1"  # 先部署
  1. 使用健康检查钩子

7.3 如何调试问题?

argocd app logs root-application --kind Application

8. 与 ApplicationSet 的区别

特性 App of Apps ApplicationSet
管理方式 手动声明 自动生成
适用场景 固定应用集 动态环境
模板支持 有限 丰富
多集群支持 需要手动配置 内置支持

9. 实际案例:微服务部署

# microservices-app-of-apps.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: microservices-platform
spec:
  source:
    repoURL: https://git.example.com/microservices.git
    path: argo
  destination:
    server: https://kubernetes.default.svc
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - Validate=false

对应目录结构:

microservices/
├── argo/
│   ├── frontend/
│   ├── backend/
│   ├── database/
│   └── cache/
└── microservices-app-of-apps.yaml

10. 监控与告警

  1. 配置 Prometheus 监控:
annotations:
  argocd.argoproj.io/application-status: '{{status.sync.status}}'
  1. 设置 Slack 通知:
argocd-notifications-cm create slack \
  --recipient '#argo-alerts' \
  --trigger on-sync-failed

注意:本文档假设您已安装并配置好 ArgoCD。实际使用时请替换示例中的仓库地址、路径等参数为您实际的值。