0.13.2版Terraform Helm Provider下,Helm子图表如何取父图表值?
子图表读取父图表配置的实现方法
你用的Terraform Helm Provider 0.13.2版本完全对齐原生Helm的模板渲染和取值作用域规则,没有自定义的渲染逻辑,按照Helm的通用规范配置即可。
先明确固定的作用域规则
Helm 默认对图表取值做了隔离设计,避免子图表被父侧的私有配置意外影响:
- 子图表的模板上下文里,默认只能读到两类值:子图表自身
values.yaml的默认值、父图表在子图表专属配置块下传入的自定义值 - 子图表没法直接访问父图表根作用域下的非全局配置值,跨作用域读值只有两种合规的实现路径:用全局值作用域、父侧显式把配置透传到子图表的专属配置块
两种可直接落地的配置方案
方案1:用Helm全局值作用域(适合多组件共享公共配置的场景)
.Values.global 下的配置没有父子图表的访问权限限制,不管是父还是子的模板都能直接读取,是最便捷的共享配置实现方式:
- 在父图表根目录的
values.yaml里,把需要共享给postgres子图表的环境配置放到global块下,示例结构:# 父根values.yaml global: environment: APP_ENV: production LOG_LEVEL: info # 父图表自身的业务配置,和全局块完全隔离 service: port: 8080 - 修改postgres子图表下对应的ConfigMap代码,把取值路径从子图表自身作用域改为全局作用域,修改后的内容如下:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-postgres-env namespace: {{ .Release.Namespace }} data: {{- range $key, $val := .Values.global.environment }} {{ $key }}: {{ $val | quote }} {{- end }}
方案2:父侧显式透传配置到子图表专属块(更符合子图表可复用的设计原则)
这种方式完全不需要改动子图表原有模板的取值路径,只需要父侧把需要的配置显式传入postgres子图表的专属配置块就行。因为你是用Terraform管理Helm发布的,直接在helm_release资源里写参数覆盖逻辑就可以,示例配置:
resource "helm_release" "my_service" { name = "my-app" chart = "./path/to/your/chart" namespace = "default" # 把业务侧的配置值,透传到postgres子图表的environment配置块下 set { name = "postgres.environment.APP_ENV" value = var.app_env } set { name = "postgres.environment.LOG_LEVEL" value = var.log_level } }
配置完成后,子图表原有的ConfigMap代码(也就是读取.Values.environment的逻辑)不需要任何修改,就能正常拿到父侧传入的配置值。
避坑提示
- 不要在子图表里尝试直接写路径读父图表根作用域的非全局值,这类写法渲染时会拿到空值,本质是绕过了Helm的作用域隔离设计,后续会破坏子图表的独立可复用性
- 取值合并优先级遵循原生Helm规则:Terraform侧的
set参数优先级最高,其次是父图表values中对子图表的配置覆盖,最后是子图表自身的默认values值
内容的提问来源于stack exchange,提问作者hmar
相关产品推荐
相关产品推荐

