Helm 的 values.yaml 里能使用 .Release.Name 吗?

values.yaml 默认是静态数据,不会自动渲染 .Release.Name;Chart 可显式用 tpl 渲染可信字符串;替代方案:模板里直接引用 .Release.Name、用 required/默认函数组合、或 --set 从命令行注入。本文给出可行做法。

最佳实践
Helm 的 values.yaml 里能使用 .Release.Name 吗?封面

直接答案:默认不会——values.yaml 是纯静态数据文件,Helm 不会对里面的内容做模板渲染,{{ .Release.Name }} 写进去只会被当普通字符串。正确做法是把动态拼接放在模板文件里(那里有 .Release.Name),values.yaml 只提供静态部分。

正确姿势一:模板里直接引用(最推荐)

# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ printf "%s-app" .Release.Name | quote }}
data:
  mode: "example"

.Release.Name 是渲染期内置对象,在带有根上下文的模板中可用;with/range等改变点作用域时需保留根变量。

正确姿势二:values 提供前缀,模板里拼接

# values.yaml
nameSuffix: app
replicaCount: 2
# templates/deployment.yaml
metadata:
  name: {{ printf "%s-%s" .Release.Name .Values.nameSuffix }}

values.yaml 管"可配的静态部分",模板管"动态拼接"——职责分清。

正确姿势三:命名辅助模板(_helpers.tpl)

Helm 脚手架生成的 chart 自带约定:

{{- define "mychart.fullname" -}}
{{ .Release.Name | trunc 63 | trimSuffix "-" }}
{{- end }}

各资源里统一 name: {{ include "mychart.fullname" . }},改名逻辑集中一处。

反面示例

# values.yaml —— ❌ 不会被渲染
appName: "{{ .Release.Name }}-app"

模板里 {{ .Values.appName }} 拿到的就是字面字符串 {{ .Release.Name }}-app,放在受约束的metadata.name中会因非法字符失败;若Chart显式调用tpl,则可再次渲染该字符串。tpl应只处理可信输入,并传入所需上下文。

命令行注入(补充手段)

helm install myrel ./chart --set fullnameOverride=myrel-app

仅在该Chart实现并使用fullnameOverride时有效,不是Helm通用内置命名参数。

常见问题(FAQ)

Q:helm template 命令能预览渲染结果吗?
A:能,helm template myrel ./chart 本地渲染全部清单,排查这类拼接问题最直接。

Q:values.yaml 里能用其他 .Values 变量自引用吗?
A:默认不会自引用;模板可用printf/define组合,或显式使用tpl渲染可信字符串。

Q:子 chart 里 .Release.Name 是什么?
A:Release 对象是全局的,子 chart 模板里也是同一个发布名。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台