1. 简介

在 Kubernetes 中,我们可以通过 helm upgrade 命令来升级 Helm Chart 并更新配置参数(即 values)。除了安装更新后的 Chart,该命令还支持禁用 Hook、创建命名空间等操作。

本文将介绍如何使用 helm upgrade 来更新 Helm 的 values,并演示多种方式来实现这一目标。


2. 安装一个 Helm Release 用于演示

我们以部署 Apache Web 服务器为例:

$ helm install apache oci://registry-1.docker.io/bitnamicharts/apache

然后通过 helm get values -a 查看当前配置:

$ helm get values -a apache
COMPUTED VALUES:
...truncated...
command: []
containerPorts:
  http: 8080
  https: 8443
replicaCount: 1

我们只保留了 commandcontainerPortsreplicaCount 的输出,便于后续对比。

如果仅想查看用户设置的 values,应使用 helm get values

$ helm get values apache
USER-SUPPLIED VALUES:
null

因为安装时未指定任何 values,所以返回 null。但一旦我们通过 helm upgrade 更新 values,这个值就不再是 null


3. 使用 --set 更新 Values

使用 --set 可以在命令行中直接设置 values:

$ helm upgrade apache oci://... --set replicaCount=2

✅ 可以一次设置多个值,用逗号分隔:

$ helm upgrade apache oci://... --set key1=value1,key2=value2

我们把 replicaCount 从 1 改为 2 后验证:

$ helm get values -a apache | grep replicaCount
replicaCount: 2

此时 USER-SUPPLIED VALUES 也不再是 null

$ helm get values apache
USER-SUPPLIED VALUES:
replicaCount: 2

3.1. 设置复杂参数的子项

对于嵌套结构,使用点号(dot notation)表示子项。例如:

$ helm upgrade apache oci://... --set containerPorts.http=1234

可以通过 helm show readmeyq 查看 dot notation:

$ helm get values -a apache | yq -o props
COMPUTED VALUES =
...
containerPorts.http = 8080
containerPorts.https = 8443

⚠️ 注意:--set 在处理嵌套结构或复杂数据(如列表)时可能不够灵活,此时建议使用 --set-json


4. 使用 --values-f

当需要设置多个 values 时,推荐使用 YAML 文件,通过 --values-f 指定:

$ helm upgrade apache oci://... --values values.yml

示例 values.yml 内容如下:

containerPorts:
  http: 5555
  https: 4321
replicaCount: 3

执行升级后验证:

$ helm get values -a apache | yq -o props | grep 'containerPorts.http\|replicaCount'
containerPorts.http = 5555
containerPorts.https = 4321
replicaCount = 3

✅ 注意:--set--values 会互相覆盖。使用其中一个更新后,另一个的值将被重置为默认值。


5. 使用 --set-file

当 values 内容过长或动态生成时,可以使用 --set-file 指定文件路径:

$ helm upgrade apache oci://... --set-file command=default_cmd

其中 default_cmd 文件内容如下:

["/bin/bash", "-c", "echo 'Welcome' $HOME"]

验证结果:

$ helm get values -a apache | yq -o props | grep command
command = ["/bin/bash", "-c", "echo 'Welcome' $HOME"]

6. 使用 --set-json

适用于传递 JSON 格式的 values:

$ helm upgrade apache oci://... --set-json containerPorts='{"http":9100, "https":9200}'

验证:

$ helm get values -a apache | yq -o props | grep containerPorts.http
containerPorts.http = 9100
containerPorts.https = 9200

7. 使用 --set-string

强制将值作为字符串处理。若目标字段不接受字符串,会报错:

$ helm upgrade apache oci://... --set-string replicaCount=3

会报错:

Error: UPGRADE FAILED: values don't meet the specifications of the schema(s) in the following chart(s):
apache:
- replicaCount: Invalid type. Expected: integer, given: string

8. 使用 --set-literal

用于传递包含反斜杠等特殊字符的字符串:

$ helm upgrade apache oci://... --set-literal secret=b@el\\!dung

验证结果:

$ helm get values -a apache | grep secret
secret: b@el\!dung

如果使用 --set--set-string,则反斜杠会被忽略:

$ helm upgrade apache oci://... --set-string secret=b@el\\!dung
$ helm get values -a apache | grep secret
secret: b@el!dung

9. 总结

本文介绍了使用 helm upgrade 更新 Helm values 的多种方式:

参数 用途 特点
--set 设置简单键值对 支持嵌套结构(dot notation)
--values / -f 从 YAML 文件加载 values 适合批量设置
--set-file 从文件读取值 适合大段内容或动态生成
--set-json 设置 JSON 值 适合复杂结构
--set-string 强制字符串类型 若字段不支持字符串会报错
--set-literal 保留特殊字符 适用于含反斜杠的值

✅ 建议根据实际场景选择合适的方式,例如:

  • 快速修改一个值用 --set
  • 多个值或结构复杂用 --values--set-json
  • 包含特殊字符用 --set-literal
  • 动态生成或内容较长用 --set-file

掌握这些方式,可以让你更灵活地管理 Helm 应用的配置。


原始标题:Updating Helm Values in Kubernetes