尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【GitOps·ArgoCD篇】应用管理:App-of-Apps 模式与多集群部署

【GitOps·ArgoCD篇】应用管理:App-of-Apps 模式与多集群部署 前言单个应用部署只是起步。本篇解决两个规模化问题如何管理几十上百个应用App-of-Apps以及如何用一个 ArgoCD 管理多个 K8s 集群。一、App-of-Apps 模式解决什么问题当有50个应用时: → 要创建50个 Application CRD → 手动管理太累 → 能不能用一个 Application 管理其他 Application App-of-Apps: → 一个父 Application 管理多个子 Application → Git 仓库中维护所有 Application 的定义 → 父 Application 同步后子 Application 自动创建仓库结构deploy-repo/ ├── apps/ # App-of-Apps 入口 │ └── app-of-apps.yaml # 父 Application 定义 ├── applications/ # 各应用的 Application 定义 │ ├── myapp.yaml │ ├── user-service.yaml │ ├── order-service.yaml │ └── payment-service.yaml └── services/ # 实际部署清单 ├── myapp/ ├── user-service/ ├── order-service/ └── payment-service/父 ApplicationApp-of-Apps# apps/app-of-apps.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app-of-apps namespace: argocd spec: source: repoURL: https://github.com/myorg/deploy-repo.git targetRevision: main path: applications # 这个目录下有多个 Application YAML destination: server: https://kubernetes.default.svc namespace: argocd # 子 Application 也部署在 argocd 命名空间 syncPolicy: automated: prune: true # Git 中删掉某个 Application集群中也删掉 selfHeal: true子 Application 示例# applications/myapp.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: myapp namespace: argocd spec: project: team-alpha source: repoURL: https://github.com/myorg/deploy-repo.git targetRevision: main path: services/myapp/overlays/prod destination: server: https://kubernetes.default.svc namespace: myapp-prod syncPolicy: automated: prune: true selfHeal: true工作流程1. 在 Git 仓库 applications/ 目录下新增 application.yaml 2. git push 3. ArgoCD 检测到 app-of-apps父 Application有变化 4. 同步在 argocd 命名空间创建新的 Application CRD 5. 新 Application 自动开始管理对应服务 6. 子 Application 从 services/ 目录读取部署清单 7. 同步到对应命名空间 整个流程完全自动化无需手动创建 Application培训要点App-of-Apps 是 ArgoCD 管理大规模应用的经典模式。但也有缺点——层级嵌套后调试复杂。新版本推荐用 ApplicationSet 替代 App-of-Apps。二、ApplicationSet 替代 App-of-AppsGit 目录生成器apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: all-services namespace: argocd spec: generators: - git: repoURL: https://github.com/myorg/deploy-repo.git revision: main directories: - path: services/* # 自动扫描 services/ 下的所有子目录 # 每个子目录生成一个 Application template: metadata: name: {{path.basename}} # 用目录名作为 Application 名 spec: project: default source: repoURL: https://github.com/myorg/deploy-repo.git targetRevision: main path: {{path}} # 用目录路径作为 source path destination: server: https://kubernetes.default.svc namespace: {{path.basename}} syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespacetrue集群生成器多集群spec: generators: - clusters: selector: matchLabels: env: production # 只选择标记为 production 的集群 template: metadata: name: {{name}}-myapp # 用集群名作为前缀 spec: source: repoURL: https://github.com/myorg/deploy-repo.git path: overlays/prod destination: server: {{server}} # 部署到匹配的集群 namespace: myapp-prod三、多集群部署注册外部集群# 方式1用 ArgoCD CLI 注册 argocd cluster add prod-cluster \ --server prod-cluster.mycompany.com:6443 \ --name prod-cluster \ --label envproduction \ --label regioncn-north # 方式2手动配置 argocd cluster add https://prod-cluster:6443 \ --name prod-cluster \ --service-account argocd-manager \ --upsert集群标签管理# 给集群打标签用于 ApplicationSet 选择器 argocd cluster set prod-cluster \ --label envproduction \ --label regioncn-north \ --label tiercritical # 查看所有集群 argocd cluster list # SERVER NAME LABELS # https://k8s-api:6443 in-cluster envlocal # https://prod-cluster:6443 prod-cluster envproduction,regioncn-north # https://dr-cluster:6443 dr-cluster envdr,regioncn-southApplication 部署到外部集群apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: myapp-prod namespace: argocd spec: source: repoURL: https://github.com/myorg/deploy-repo.git path: overlays/prod destination: server: https://prod-cluster:6443 # 外部集群地址 # 或用集群名 # name: prod-cluster namespace: myapp-prod syncPolicy: automated: prune: true selfHeal: true多集群 ApplicationSetapiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: myapp-multi-cluster namespace: argocd spec: generators: # 矩阵生成器环境 × 集群 - matrix: generators: # 环境列表 - list: elements: - env: dev path: overlays/dev - env: staging path: overlays/staging - env: prod path: overlays/prod # 集群列表 - clusters: selector: matchLabels: argocd.argoproj.io/secret-type: cluster template: metadata: name: myapp-{{env}}-{{name}} spec: project: default source: repoURL: https://github.com/myorg/deploy-repo.git path: {{path}} destination: server: {{server}} namespace: myapp-{{env}} syncPolicy: automated: prune: true selfHeal: true培训要点矩阵生成器matrix可以组合两个维度——环境 × 集群。3个环境 × 3个集群 9个 Application 自动生成。新增环境或集群时只需在列表中加一行。四、环境隔离策略策略一分支对应环境Git 仓库分支策略: main → 生产环境 staging → 预发环境 develop → 测试环境 Application 配置: myapp-dev: targetRevision: develop path: overlays/dev myapp-staging: targetRevision: staging path: overlays/staging myapp-prod: targetRevision: main path: overlays/prod策略二目录对应环境推荐Git 仓库目录策略: main 分支: overlays/ dev/ kustomization.yaml patch.yaml staging/ kustomization.yaml patch.yaml prod/ kustomization.yaml patch.yaml Application 配置: myapp-dev: targetRevision: main path: overlays/dev → 所有环境在同一分支用目录区分踩坑提示目录策略比分支策略更好——因为所有环境配置在同一分支中可以一次性看到所有环境的差异PR 审查更方便。分支策略容易遗漏某个环境的更新。策略三仓库分离仓库分离策略: deploy-dev/ → 测试环境专用仓库 deploy-prod/ → 生产环境专用仓库 好处: 仓库权限隔离开发团队只能改 dev 仓库 坏处: 多仓库维护成本高五、大规模应用管理的最佳实践1. 用 ApplicationSet 替代手动创建不要 手动创建 50 个 Application YAML 文件 要 用 ApplicationSet Git 目录生成器一个模板自动扫描生成2. 用 Kustomize 管理环境差异services/myapp/ ├── base/ # 所有环境共享的配置 │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml └── overlays/ ├── dev/ │ ├── kustomization.yaml │ └── patch.yaml # dev 专用覆盖 ├── staging/ │ ├── kustomization.yaml │ └── patch.yaml └── prod/ ├── kustomization.yaml └── patch.yaml3. 用 Project 做权限隔离AppProject: team-alpha → 只能部署到 team-alpha-* 命名空间 team-beta → 只能部署到 team-beta-* 命名空间 platform → 可部署到 kube-system 和基础设施命名空间4. 合理设置同步窗口# AppProject 中的同步窗口 syncWindows: - kind: allow schedule: 0 9 * * 1-5 # 工作日9点允许 duration: 12h # 持续12小时 applications: - myapp-prod # 只限制生产应用 manualSync: true # 允许手动同步紧急情况六、本篇要点回顾App-of-Apps一个父 Application 管理多个子 Application适合旧版本ApplicationSet用生成器自动创建 Application替代 App-of-AppsGit 目录生成器自动扫描 Git 目录每个目录生成一个 Application多集群用argocd cluster add注册外部集群用标签选择器匹配矩阵生成器环境 × 集群N × M N*M 个 Application 自动生成环境隔离目录策略 分支策略 仓库分离下一篇预告《同步策略自动同步、手动同步与同步钩子》——深入 ArgoCD 的同步机制学习如何精确控制何时同步、如何同步。
返回列表