news 2026/7/7 4:28:15

告别手动kubectl apply:ArgoCD多集群GitOps统一管理20+个Kubernetes集群的架构设计与落地实录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别手动kubectl apply:ArgoCD多集群GitOps统一管理20+个Kubernetes集群的架构设计与落地实录

告别手动kubectl apply:ArgoCD多集群GitOps统一管理20+个Kubernetes集群的架构设计与落地实录

一、"谁改了生产配置":多集群管理的混乱之源

管理5个K8s集群时,kubectl apply -f deployment.yaml逐个集群执行还能接受。但管理20+个集群时,这种方式暴露三个致命问题:

配置漂移。同一个deployment.yaml在集群A和集群B的副本数不一致,因为有人手动kubectl scale过但没更新Git仓库。审计缺失。"这个ConfigMap是谁、什么时间、因为什么原因改的?"在直接kubectl操作模式下无法回答。回滚困难。"上次发布的版本是什么?"如果没有严格的Git tag管理,回滚就是一场考古。

GitOps的核心理念是将Git仓库作为配置的唯一真理源(Single Source of Truth)。ArgoCD作为GitOps的Operator,持续监控Git仓库与集群实际状态的差异,一旦发现漂移就自动同步——或者仅告警(取决于Sync Policy配置)。

flowchart TB subgraph Git["Git仓库(唯一真理源)"] direction TB M[基础配置目录<br/>base/] O1[集群A overlays<br/>overlays/cluster-a/] O2[集群B overlays<br/>overlays/cluster-b/] O3[集群C overlays<br/>overlays/cluster-c/] end M --> O1 M --> O2 M --> O3 subgraph ArgoCD["ArgoCD控制平面"] APP[Application CRD<br/>声明式管理] ARP[ApplicationSet<br/>批量管理多集群] end O1 -.->|"每3分钟poll"| APP O2 -.->|"Webhook触发"| APP O3 -.->|"混合模式"| APP APP -->|"Sync"| K1[(集群A<br/>生产)] APP -->|"Sync"| K2[(集群B<br/>生产)] APP -->|"Sync"| K3[(集群C<br/>预发布)] ARP -->|"模板化生成"| APP style M fill:#e0f2fe,stroke:#0284c7 style APP fill:#fef3c7,stroke:#d97706

二、Kustomize + ApplicationSet:两个武器的组合使用

ArgoCD管理多集群的标准范式是"Kustomize Overlay + ApplicationSet"。Kustomize负责"Base + Overlay"的配置分层——Base定义通用配置,Overlay定义各集群的差异化配置。ApplicationSet负责将一套Application模板批量部署到多个集群。

先看目录结构设计:

deploy/ ├── base/ │ ├── kustomization.yaml │ ├── deployment.yaml # 基础Deployment模板 │ ├── service.yaml │ └── configmap.yaml ├── overlays/ │ ├── cluster-a-prod/ │ │ ├── kustomization.yaml # 集群A特定配置 │ │ └── patches/ │ │ └── replicas.yaml # 集群A需要更高的副本数 │ ├── cluster-b-prod/ │ │ ├── kustomization.yaml │ │ └── patches/ │ │ └── resources.yaml # 集群B需要不同的资源限制 │ └── cluster-c-staging/ │ ├── kustomization.yaml │ └── patches/ │ └── ingress.yaml # 集群C使用不同的域名 └── argocd/ └── applicationset.yaml

Kustomization Overlay配置示例:

# overlays/cluster-a-prod/kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: production # 引用Base配置 resources: - ../../base # 应用集群A专属的补丁 patches: - path: patches/replicas.yaml target: kind: Deployment name: payment-api # 覆盖ConfigMap中的集群特定值 configMapGenerator: - name: app-config behavior: merge literals: - CLUSTER_NAME=cluster-a - LOG_LEVEL=info - REDIS_HOST=redis-cluster-a.internal # 所有资源统一添加标签 commonLabels: cluster: cluster-a-prod managed-by: argocd # 添加注解 commonAnnotations: sync.argoproj.io/managed: "true"

ApplicationSet是管理20+集群的关键。它为每个集群自动生成一个Application资源,避免手动创建20份几乎相同的Application YAML。

# argocd/applicationset.yaml apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: cluster-apps namespace: argocd spec: # 使用列表生成器:显式列出所有目标集群 generators: - list: elements: - cluster: cluster-a-prod url: https://10.0.1.100:6443 env: production region: cn-east - cluster: cluster-b-prod url: https://10.0.2.100:6443 env: production region: cn-north - cluster: cluster-c-staging url: https://10.0.3.100:6443 env: staging region: cn-east # ... 其余17个集群 template: metadata: name: "apps-{{cluster}}" labels: env: "{{env}}" region: "{{region}}" spec: project: default source: repoURL: https://git.internal/team/deploy.git targetRevision: main path: "overlays/{{cluster}}" destination: server: "{{url}}" namespace: production syncPolicy: automated: # 自动同步:检测到Git变更后自动apply prune: true # 删除Git中已移除的资源 selfHeal: true # 自动修复手动修改的漂移 syncOptions: - CreateNamespace=true - PruneLast=true # 先创建新资源,再删除旧资源 retry: limit: 5 backoff: duration: "5s" factor: 2 maxDuration: "3m"

三、多集群同步的三个工程难题与解法

难题1:20个集群的同步风暴

当一次Git commit修改了Base配置时,20个Application同时触发Sync,对Git服务器和集群API Server造成瞬时压力。解决方案:ArgoCD的sync-waves(同步波)机制。

# 在Application中配置同步波 metadata: annotations: argocd.argoproj.io/sync-wave: "{{syncWave}}" # ApplicationSet generator中增加syncWave字段 elements: - cluster: cluster-a-prod url: https://10.0.1.100:6443 syncWave: "0" # 第一批同步 - cluster: cluster-b-prod url: https://10.0.2.100:6443 syncWave: "1" # 第二批同步

ArgoCD按sync-wave从低到高依次同步。Wave 0的所有集群同步完成后才开始Wave 1。这对于"先更新预发布集群验证,再更新生产集群"的灰度发布流程非常关键。

难题2:Secret的外部管理

GitOps理念不推荐将Secret明文存储在Git仓库中。ArgoCD通过集成External Secrets Operator或Sealed Secrets解决这个问题。

# 使用External Secrets Operator从Vault同步 apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: db-credentials namespace: production spec: refreshInterval: "1h" secretStoreRef: name: vault-backend kind: ClusterSecretStore target: name: db-credentials data: - secretKey: username remoteRef: key: secret/database property: username - secretKey: password remoteRef: key: secret/database property: password

再结合ArgoCD的ignoreDifferences配置,避免Secret被External Secrets Operator更新后ArgoCD判定为OutOfSync:

spec: ignoreDifferences: - group: "" kind: Secret jsonPointers: - /data

难题3:跨集群依赖的发布顺序

Service-A部署在集群A,Service-B部署在集群B,B依赖A的API。如果ArgoCD先更新B后更新A,可能导致短暂的调用失败。解决方案是使用Argo Rollouts作为发布编排层。

# Argo Rollouts:渐进式发布 apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: payment-api spec: replicas: 6 strategy: canary: # 分步发布:10% → 50% → 100% steps: - setWeight: 10 - pause: {duration: 1m} # 观察1分钟 - setWeight: 50 - pause: {duration: 2m} - setWeight: 100

四、GitOps架构的反模式

以下三个实践在生产环境中会造成问题,应避免:

ApplicationSet使用Cluster Generator自动发现集群。虽然方便,但会让所有集群自动部署同一套配置。生产环境中的集群通常有不同的配置需求,显式列出集群的List Generator虽然多写几行YAML,但更可控。

所有环境共用一个ArgoCD实例。如果生产环境的ArgoCD实例被误操作,预发布和开发环境不会受到影响。推荐为生产环境部署独立的ArgoCD实例。

忽视Sync Window。ArgoCD允许配置同步时间窗口(Sync Window)。如果没有在维护窗口期间禁止同步,可能在工作时间触发意外的配置变更。

# 禁止在工作时间自动同步 apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: production spec: syncWindows: - kind: deny schedule: "0 9 * * 1-5" # 工作日9:00起 duration: 10h # 持续10小时(到19:00) applications: - "*-prod" manualSync: true # 允许手动同步

五、总结

ArgoCD + Kustomize + ApplicationSet的组合是管理多集群配置当前最成熟的方案。它的核心价值不是"自动化kubectl apply",而是实现了三个转变:配置从"集群上的状态"变为"Git仓库中的代码",变更从"手动操作"变为"Pull Request + Code Review",审计从"不可追溯"变为"git log告诉你一切"。

从零开始部署时的一个建议:先用Kustomize Base + Overlay把现有配置结构化,再用ApplicationSet对接。不要试图一步到位自动化所有集群——先覆盖预发布集群验证流程,稳定后再扩展到生产集群。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 4:27:58

跨越平台壁垒:BotW存档管理器让你的海拉鲁冒险永不中断

跨越平台壁垒&#xff1a;BotW存档管理器让你的海拉鲁冒险永不中断 【免费下载链接】BotW-Save-Manager BOTW Save Manager for Switch and Wii U 项目地址: https://gitcode.com/gh_mirrors/bo/BotW-Save-Manager 你是否曾为更换游戏主机而苦恼&#xff1f;数百小时的《…

作者头像 李华
网站建设 2026/7/7 4:25:02

把智能客服换成虚拟员工能省多少人力?鲲界科技给出数据

{ "title": "把智能客服换成虚拟员工能省多少人力&#xff1f;鲲界科技给出数据", "content": "# 把智能客服换成虚拟员工能省多少人力&#xff1f;鲲界科技给出数据\n\n在客户服务领域&#xff0c;"智能客服"通常指基于规则或简…

作者头像 李华
网站建设 2026/7/7 4:23:57

Nova视觉小说开发完全指南:程序员的高效Unity游戏框架

Nova视觉小说开发完全指南&#xff1a;程序员的高效Unity游戏框架 【免费下载链接】Nova Programmer-friendly framework for visual novels (VN) / text-based adventure games (AVG) on Unity 项目地址: https://gitcode.com/gh_mirrors/nova1/Nova Nova是一个基于Uni…

作者头像 李华
网站建设 2026/7/7 4:22:22

MAD模型:面向视觉导航的动作导向潜空间建模

1. 项目概述&#xff1a;这不是又一个“世界模型”&#xff0c;而是视觉导航的底层重构“MAD世界模型&#xff1a;面向视觉导航的映射感知潜空间建模”——光看标题&#xff0c;很多人第一反应是&#xff1a;又一个带“世界模型”字样的新概念堆砌&#xff1f;但如果你真在机器…

作者头像 李华
网站建设 2026/7/7 4:19:36

LangChain:Loop Engineering才是未来核心竞争力!

最近AI圈有个说法正在快速成为共识&#xff1a;模型不是护城河&#xff0c;Loop Engineering 才是。 LangChain 官方博客最新发布了一篇题为《The Art of Loop Engineering》的文章&#xff0c;系统拆解了循环工程的完整架构。今天&#xff0c;我们就以这篇 LangChain 的官方文…

作者头像 李华