大家好!在使用 Kubernetes 包管理器 Helm 时,您可能曾有过这样的疑问:“我设置的值为什么没有生效?”或者“在 Argo CD 中使用外部 Chart 时,如何配置私有仓库?”
今天,我们将为您整理一份详细的 10 分钟指南,涵盖 Helm 值注入的所有方法、它们之间的优先级,以及 Argo CD 运维高手们使用的 InitContainer 技巧。🛠️

1. 📂 指定 Helm Values 的所有方法
Helm 为了灵活性,支持通过多种方式注入值。我们总结了每种方法的特点和用途。
① values.yaml 文件(默认值)
这是 Chart 内部包含的默认配置文件。
- 用途: 定义 Chart 开发者提供的默认规范。
- 特点: 具有最低优先级。
② –values 或 -f (外部文件)
指定用户自行编写的独立 YAML 文件。
- 用途: 分离不同环境(Dev, Staging, Prod)的配置。
- 命令: helm install my-app ./my-chart -f values-prod.yaml
③ –set (内联标志)
直接在终端输入键值对。
- 用途: 在 CI/CD 流水线中动态更改标签,或修改非常简单的值。
- 命令: helm install my-app ./my-chart –set image.tag=v2.0.0
④ –set-file (将文件内容作为值注入)
将文件的全部内容(例如:脚本、配置文件)作为特定键的值注入。
- 用途: 注入 ConfigMap 中所需的大型配置文件。
⑤ –set-string
强制将所有值识别为字符串。(防止数字 0 被识别为布尔值)
2. 🏆 Values 应用优先级 (Precedence)
如果配置方法重叠,Helm 会选择哪个值?请记住:“后定义或更具体的会胜出”。
| 优先级 | 配置方法 | 备注 |
|---|---|---|
| 1 (最高) | –set (内联) | 最后覆盖的终极武器 |
| 2 | –values (-f) | 文件列表中最右侧的文件优先 |
| 3 | 父 Chart 的 values.yaml | 当父 Chart 覆盖子 Chart 的值时 |
| 4 (最低) | Chart 内部的 values.yaml | 默认值 |
—
3. 🏗️ Argo CD 的高级技巧:使用 InitContainer 添加 Helm 仓库
在运营 Argo CD 时,您可能会遇到这样的情况:
“我们有一个内部私有 Helm 仓库,Argo CD 每次都需要从这里获取 Chart。但是,每次声明式地管理认证信息或仓库注册都非常麻烦。”
此时,使用的就是在 Argo CD Repo Server 中添加 InitContainer 来预先注册 Helm 仓库的方法。
❓ 这是什么?
它是在 Argo CD 的组件之一,即与 Git 或 Helm 仓库通信的 argocd-repo-server 启动之前,启动一个临时容器 (InitContainer),并执行 `helm repo add` 命令。
💻 如何配置? (基于 Kustomize/Helm)
您需要修改 Argo CD 的安装清单 (Deployment)。
YAML
# 修改 argocd-repo-server Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-repo-server
spec:
template:
spec:
# 1. 定义用于存储 Helm 配置的共享卷 📂
volumes:
- name: helm-working-dir
emptyDir: {}
# 2. 配置在主容器之前运行的 InitContainer 🚀
initContainers:
- name: helm-repo-adder
image: alpine/helm:latest
command: ["/bin/sh", "-c"]
args:
- |
# 添加内部私有仓库
helm repo add my-private-repo https://charts.mycompany.com --username $REPO_USER --password $REPO_PASS
# 更新仓库
helm repo update
env:
- name: REPO_USER
valueFrom:
secretKeyRef:
name: repo-credentials
key: username
# 重要:将添加的仓库信息存储路径挂载为共享卷
volumeMounts:
- name: helm-working-dir
mountPath: /root/.config/helm
# 3. 在主容器中也挂载相同的卷 🔗
containers:
- name: argocd-repo-server
volumeMounts:
- name: helm-working-dir
mountPath: /app/config/helm # Argo CD 查找 Helm 配置的路径
✨ 使用这种方式的原因
- 动态管理: 无需在 Argo CD UI 中手动注册仓库,服务器启动时通过代码自动注册。
- 安全性: 通过 Secret 注入凭证,因此是安全的。
- 依赖解决: 在解决 Chart.yaml 中声明的第三方 Chart 依赖时,本地 Helm 缓存已预先构建,速度更快。
4. 💡 实际应用技巧
- 避免内联 (–set): 使用 Argo CD 时,尽量使用 `values.yaml` 或存储在 Git 中的文件。内联配置在后期难以追踪。
- 结构化分离: 将通用配置放在 `values.yaml` 中,将环境差异(如 `values-dev.yaml`、`values-prod.yaml`)分开管理,这是 GitOps 的标准做法。
- Argo CD Helm Application: 在 Argo CD Application 资源中,也可以通过 `helm.parameters` 实现与 `–set` 相同的效果。
YAML
spec:
source:
chart: my-app
helm:
# 与内联配置相同的效果 ⚡
parameters:
- name: "replicaCount"
value: "3"
# 指定外部文件的效果 📄
valueFiles:
- values-prod.yaml
📝 总结
- Helm Values 的优先级从高到低依次是:内联 (`–set`)、外部文件 (`-f`)、默认文件。
- Argo CD InitContainer 在 Repo Server 启动前自动注册私有 Helm 仓库,提高了运维便利性。
- 所有配置都应通过代码 (Git) 进行管理,以确保可追溯性。
希望今天的内容能帮助您稳定地运营集群!🎯
发表回复