【GitOps·ArgoCD篇】与 Helm 集成:Helm Chart 的 GitOps 管理

📅 2026/8/19 14:13:14
【GitOps·ArgoCD篇】与 Helm 集成:Helm Chart 的 GitOps 管理
前言Helm 是 K8s 的包管理器ArgoCD 原生支持 Helm Chart。但用 Helm ArgoCD 有两种方式——Helm Chart 仓库模式和 Git 仓库模式本篇讲清楚两种方式的区别和最佳实践。一、两种 Helm 集成方式方式一Helm Chart 仓库 ArgoCD → Helm Chart 仓库如 Harbor、ChartMuseum→ 渲染 → 部署 适合使用第三方公共 Chart如 Bitnami、Grafana 方式二Git 仓库中的 Helm Chart ArgoCD → Git 仓库中的 Chart 目录 → 渲染 → 部署 适合自己开发的 Chart或需要版本控制 Chart 的场景维度Chart 仓库Git 仓库中的 Chart版本管理Chart 版本号Git commit hash审批无PR Review适用第三方 Chart自研 Chart更新频率随 Chart 发布随 Git push推荐公共组件业务应用二、方式一Helm Chart 仓库配置 Chart 仓库# 添加 Helm Chart 仓库到 ArgoCD argocd repo add https://charts.bitnami.com/bitnami \ --type helm \ --name bitnami argocd repo add https://charts.helm.sh/stable \ --type helm \ --name stable # 查看已添加的仓库 argocd repo list # URL TYPE NAME # https://charts.bitnami.com/ helm bitnami # https://charts.helm.sh/stable helm stable创建 ApplicationapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: redis namespace: argocd spec: source: repoURL: https://charts.bitnami.com/bitnami # Chart 仓库 URL chart: redis # Chart 名称 targetRevision: 18.x.x # Chart 版本 helm: # 直接在 Application 中设置 values values: | architecture: replication master: persistence: size: 8Gi replica: replicaCount: 2 auth: password: your-redis-password destination: server: https://kubernetes.default.svc namespace: redis syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespacetrue用外部 values 文件spec: source: repoURL: https://charts.bitnami.com/bitnami chart: redis targetRevision: 18.x.x helm: # 从 Git 仓库中的 values 文件读取 valueFiles: - values.yaml # 也可以指定多个 values 文件后者覆盖前者 # valueFiles: # - values.yaml # - values-prod.yaml # 跳过 CRD 安装 skipCrds: false # 传递参数等价于 helm install --set parameters: - name: architecture value: replication - name: replica.replicaCount value: 3 - name: auth.password stringSecret: name: redis-auth-secret key: password踩坑提示valueFiles中的文件路径是相对于repoURL的。如果 Chart 在 Helm 仓库中但 values 文件在 Git 仓库中需要确保repoURL指向 Git 仓库。三、方式二Git 仓库中的 Helm Chart仓库结构deploy-repo/ ├── charts/ │ └── myapp/ # Helm Chart 目录 │ ├── Chart.yaml │ ├── values.yaml # 默认 values │ └── templates/ │ ├── deployment.yaml │ ├── service.yaml │ └── _helpers.tpl └── environments/ # 环境特定 values ├── dev/ │ └── values.yaml ├── staging/ │ └── values.yaml └── prod/ └── values.yamlChart.yamlapiVersion: v2 name: myapp description: My application Helm chart type: application version: 0.1.0 # Chart 版本 appVersion: 2.0.0 # 应用版本 dependencies: - name: postgresql version: 13.x.x repository: https://charts.bitnami.com/bitnami condition: postgresql.enabledApplication 配置apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: myapp-prod namespace: argocd spec: source: repoURL: https://github.com/myorg/deploy-repo.git targetRevision: main path: charts/myapp # Chart 目录路径 helm: # 使用环境特定的 values 文件 valueFiles: - ../../environments/prod/values.yaml # 也可以直接在 Application 中覆盖值 parameters: - name: image.tag value: v2.0.0 - name: replicaCount value: 4 destination: server: https://kubernetes.default.svc namespace: myapp-prod syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespacetrue环境 values 文件# environments/prod/values.yaml replicaCount: 4 image: repository: registry.mycompany.com/myapp tag: v2.0.0 pullPolicy: IfNotPresent resources: limits: cpu: 1000m memory: 1Gi requests: cpu: 500m memory: 512Mi ingress: enabled: true className: nginx hosts: - host: myapp.com paths: - path: / pathType: Prefix postgresql: enabled: true primary: persistence: size: 20Gi四、Helm 依赖管理依赖更新# ArgoCD 不会自动运行 helm dependency update # 需要在 Chart 目录中打包依赖 # 方式一手动打包 cd charts/myapp helm dependency build # 会在 charts/ 目录下生成 *.tgz 依赖包 git add charts/ git commit -m update chart dependencies # 方式二用 ArgoCD 的 Source 插件 spec: source: plugin: name: helm-dependency-updateSource Plugin 配置# argocd-cm ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: argocd-cm namespace: argocd data: # 定义 Helm 依赖更新插件 configManagementPlugins: | - name: helm-dependency-update init: command: [sh, -c] args: [helm dependency build] generate: command: [sh, -c] args: [helm template . --include-crds]培训要点ArgoCD 默认不运行helm dependency build需要手动打包依赖或用插件。最简单的方法是 commit 依赖的 tgz 文件到 Git 仓库。五、Helm vs Kustomize 在 ArgoCD 中的选择维度HelmKustomize复杂度中有模板语法低只有覆盖灵活性高条件渲染、循环中基于覆盖多环境values 文件overlay 目录依赖管理支持Chart 依赖不支持调试helm templatekustomize build适合复杂应用、第三方Chart简单覆盖、自研应用推荐策略: 第三方应用Redis/Grafana/Nginx→ Helm Chart 自研应用 → Kustomize 自研应用但需要模板化 → 自研 Helm Chart六、Helm Release 管理ArgoCD 不使用 Helm Release传统 Helm: helm install myapp ./chart → 创建 Helm Release helm list → 查看 Release helm uninstall myapp → 删除 Release ArgoCD Helm: ArgoCD 用 helm template 渲染 → kubectl apply 不创建 Helm Release helm list → 看不到 ArgoCD 部署的应用 删除应用 → 在 Git 中删除 Application 或清单踩坑提示如果你习惯了helm list来查看部署的应用切换到 ArgoCD 后会找不到。ArgoCD 用自己的 CRDApplication管理应用不用 Helm Release。用argocd app list替代helm list。迁移已有的 Helm Release 到 ArgoCD# 1. 导出当前 Helm values helm get values myapp -n myapp-prod -o yaml current-values.yaml # 2. 在 Git 仓库中创建 Application # 用导出的 values 配置 Application # 3. 先卸载 Helm Release会有短暂停机 helm uninstall myapp -n myapp-prod # 4. 让 ArgoCD 接管 argocd app sync myapp-prod # 如果想避免停机可以 # - 在 Git 中配置 Application先手动同步 # - ArgoCD 检测到资源已存在会接管管理 # - 但可能有标签和注解差异需要处理七、本篇要点回顾两种 Helm 集成方式Chart 仓库第三方vs Git 仓库中的 Chart自研helm.values内联配置helm.valueFiles外部文件helm.parameters命令行参数ArgoCD 不会自动helm dependency build需手动打包或用插件ArgoCD 不创建 Helm Release用helm templatekubectl apply第三方应用用 Helm自研应用用 Kustomize复杂自研应用用自研 Helm Chart下一篇预告《与 Kustomize 集成多环境配置管理》——学习用 Kustomize 在 ArgoCD 中管理多环境部署差异。