App of Apps¶ ¶
概念讲解 ¶
1. 什么是 App of Apps ¶
-
“App of Apps” 是 Argo CD 中一种高效的应用编排模式,其核心思想是通过一个父应用(Parent App)集中管理多个子应用(Child Apps)。
-
父应用本身并不直接部署业务负载,而是通过声明式配置定义所有子应用的元信息(如 Git 仓库地址、目标集群、命名空间、同步策略等)。当父应用被部署、更新或同步时,Argo CD 会自动触发所有子应用的生命周期管理(包括创建、更新、删除),实现子应用的批量管控和统一协调。
2. 典型使用场景 ¶
- 微服务架构的统一管控 在微服务体系中,一个完整业务系统通常由多个独立微服务组成(如用户服务、订单服务、支付服务等)。通过 “App of Apps” 模式,可将每个微服务定义为一个子应用,由父应用统一管理:
- 父应用集中配置所有子应用的版本、部署环境和依赖关系;
- 当业务需要整体升级或回滚时,只需更新父应用的配置,即可批量同步所有子应用,避免逐个操作的繁琐和不一致风险。
- 多环境的标准化管理 对于开发、测试、预发布、生产等不同环境,往往需要一套统一的应用部署模板,仅通过环境变量、配置文件等参数区分差异。此时可通过 “App of Apps” 模式实现:
- 父应用定义环境通用的基础配置(如应用拓扑、资源约束);
- 子应用关联对应环境的配置仓库(如
dev-values.yaml
、prod-values.yaml
),实现 “一套模板、多环境复用”,同时保证环境间的配置一致性。 - 复杂应用的分层部署 对于包含前端、后端、数据库、中间件等组件的复杂应用,可按功能模块拆分为多个子应用(如前端子应用、API 服务子应用、数据库子应用),通过父应用实现分层部署:
- 父应用可定义子应用的部署顺序(如先启动数据库,再部署后端,最后启动前端);
- 当某个模块需要独立升级时,只需更新对应子应用的配置,不影响其他模块,提升迭代灵活性。
项目¶ ¶
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. 最佳实践 ¶
-
命名规范:
-
父应用:
team-name-platform
(如payment-team-prod
) -
子应用:
service-name
(如payment-service
) -
目录结构:
argo-config/
├── teams/
│ ├── team-a/
│ │ ├── app-of-apps.yaml
│ │ └── apps/
│ └── team-b/
│ ├── app-of-apps.yaml
│ └── apps/
└── shared/
└── apps/
-
权限控制:
-
使用 ArgoCD Projects 隔离不同团队的 App of Apps
- 结合 RBAC 控制访问权限
7. 常见问题 ¶
7.1 如何批量更新? ¶
使用同步策略中的 automated
配置或执行:
argocd app set root-application --sync-policy automated
7.2 如何解决依赖关系? ¶
- 使用
Sync Waves
:
metadata:
annotations:
argocd.argoproj.io/sync-wave: "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. 监控与告警 ¶
- 配置 Prometheus 监控:
annotations:
argocd.argoproj.io/application-status: '{{status.sync.status}}'
- 设置 Slack 通知:
argocd-notifications-cm create slack \
--recipient '#argo-alerts' \
--trigger on-sync-failed
注意:本文档假设您已安装并配置好 ArgoCD。实际使用时请替换示例中的仓库地址、路径等参数为您实际的值。