☸️ Helm Values 完整指南:从配置方法到 Argo CD InitContainer 秘诀

大家好!在使用 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 配置的路径

✨ 使用这种方式的原因

  1. 动态管理: 无需在 Argo CD UI 中手动注册仓库,服务器启动时通过代码自动注册。
  2. 安全性: 通过 Secret 注入凭证,因此是安全的。
  3. 依赖解决: 在解决 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

📝 总结

  1. Helm Values 的优先级从高到低依次是:内联 (`–set`)、外部文件 (`-f`)、默认文件。
  2. Argo CD InitContainer 在 Repo Server 启动前自动注册私有 Helm 仓库,提高了运维便利性。
  3. 所有配置都应通过代码 (Git) 进行管理,以确保可追溯性。

希望今天的内容能帮助您稳定地运营集群!🎯



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注