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
我们只保留了 command
、containerPorts
和 replicaCount
的输出,便于后续对比。
如果仅想查看用户设置的 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 readme
或 yq
查看 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 应用的配置。