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