Chapter 04

Helm 集成实战

掌握 ArgoCD 与 Helm 的深度集成:从 source.helm 配置、多环境 values 覆盖,到 OCI Registry 支持和 Vault 注入 Secret,构建安全的 Helm GitOps 流程。

ArgoCD 如何处理 Helm

ArgoCD 并非简单执行 helm install,而是使用 Helm 的模板引擎将 Chart 渲染成普通的 Kubernetes 清单文件,然后通过 kubectl apply 应用。这意味着:ArgoCD 管理的是渲染后的 K8s 资源,而非 Helm Release——你在 helm list 中看不到 ArgoCD 部署的应用(除非开启 helmRelease 兼容模式)。

ArgoCD Helm 的优势

ArgoCD 渲染 Helm 后以标准 K8s 资源管理,能精确展示每个资源(Pod、Service 等)的状态和差异,而不是 Helm Release 级别的粗粒度状态。同时避免了 Helm tiller(v2)时代的权限问题。

source.helm 基础配置

从 Helm Chart 仓库部署

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: prometheus-stack
  namespace: argocd
spec:
  source:
    repoURL: https://prometheus-community.github.io/helm-charts
    chart: kube-prometheus-stack     # Chart 名称
    targetRevision: 58.x.x          # Chart 版本(推荐固定版本)
    helm:
      releaseName: prometheus       # Helm Release 名称(可选)
      values: |                      # 内联 values(适合少量配置)
        grafana:
          enabled: true
          adminPassword: changeme
        prometheus:
          prometheusSpec:
            retention: 30d
  destination:
    server: https://kubernetes.default.svc
    namespace: monitoring
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true          # Prometheus Stack 推荐使用 SSA

从 Git 仓库中的 Chart 部署

source:
  repoURL: https://github.com/my-org/my-charts
  targetRevision: main
  path: charts/my-app              # Git 仓库内 Chart 目录
  helm:
    valueFiles:                    # 引用 Git 仓库内的 values 文件
    - values.yaml                  # 相对于 Chart 目录
    - values-production.yaml

多 values 文件覆盖策略

ArgoCD Helm 支持多种 values 覆盖方式,按优先级从低到高依次叠加:

values 优先级(高优先级覆盖低优先级)

┌─────────────────────────────────────────────────────────────────┐
  最低  Chart 默认 values.yaml                                     
├─────────────────────────────────────────────────────────────────┤
        Application.spec.source.helm.valueFiles[0]               
├─────────────────────────────────────────────────────────────────┤
        Application.spec.source.helm.valueFiles[1]               
├─────────────────────────────────────────────────────────────────┤
        Application.spec.source.helm.values (内联)               
├─────────────────────────────────────────────────────────────────┤
  最高  Application.spec.source.helm.parameters (--set 参数)     
└─────────────────────────────────────────────────────────────────┘
helm:
  valueFiles:
  - values.yaml                    # 基础配置
  - values-production.yaml         # 生产环境覆盖
  values: |                        # 内联覆盖(最终调优)
    image:
      tag: v1.5.2
  parameters:                      # 等价于 --set(最高优先级)
  - name: replicaCount
    value: "3"
  - name: resources.requests.cpu
    value: "100m"

Helm OCI Registry 支持

ArgoCD 2.x 支持从 OCI Registry(如 GitHub Container Registry、AWS ECR、Harbor)拉取 Helm Chart:

source:
  repoURL: oci://ghcr.io/my-org/helm-charts   # OCI 前缀
  chart: my-app
  targetRevision: 1.2.3
  helm:
    values: |
      env: production
# 添加 OCI Registry 仓库凭证
argocd repo add oci://ghcr.io/my-org/helm-charts \
  --type helm \
  --enable-oci \
  --username $GITHUB_USER \
  --password $GITHUB_TOKEN

argocd-vault-plugin:安全注入 Secret

将 Secret(数据库密码、API Key)直接写入 Git 仓库是不安全的。argocd-vault-plugin(AVP)是一个配置管理插件,在 ArgoCD 渲染清单时将占位符替换为 Vault/AWS SSM/Azure KeyVault 中的实际 Secret 值。

# Secret 占位符写法(存储在 Git 中,安全)
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
  annotations:
    avp.kubernetes.io/path: secret/data/my-app  # Vault 路径
type: Opaque
stringData:
  database-url: <database-url>     # 占位符,AVP 会替换为 Vault 中的值
  api-key: <api-key>
# Application 使用 AVP 插件
source:
  repoURL: https://github.com/my-org/config
  path: apps/my-app
  plugin:
    name: argocd-vault-plugin
    env:
    - name: AVP_TYPE
      value: vault
    - name: VAULT_ADDR
      value: http://vault:8200

实战:用 ArgoCD 部署完整 Helm Chart 应用

以部署 Redis 为例,展示完整流程:

# 1. 添加 Bitnami Helm 仓库到 ArgoCD
argocd repo add https://charts.bitnami.com/bitnami \
  --type helm \
  --name bitnami

# 2. 通过 CLI 创建 Application
argocd app create redis \
  --repo https://charts.bitnami.com/bitnami \
  --helm-chart redis \
  --revision 19.x.x \
  --dest-namespace redis \
  --dest-server https://kubernetes.default.svc \
  --helm-set architecture=standalone \
  --helm-set auth.enabled=false \
  --sync-option CreateNamespace=true

# 3. 触发首次同步
argocd app sync redis

# 4. 查看 Helm 渲染后的资源差异
argocd app diff redis
helmDefaults 全局配置

在 ArgoCD 的 argocd-cm ConfigMap 中可以配置全局 Helm 默认值,如全局 values、skipCrds 等,对所有 Helm Application 生效,避免在每个 Application 中重复配置。

本章小结

ArgoCD 将 Helm 渲染为标准 K8s 资源后管理,支持 Helm Repo、Git 内 Chart 和 OCI Registry 三种来源。通过 valueFiles(文件)、values(内联)、parameters(--set)三级覆盖实现多环境配置。argocd-vault-plugin 通过占位符机制安全注入 Secret,避免敏感信息进入 Git。下一章介绍 Kustomize 集成与多环境管理。