动态舵图配置值的层次结构

Hierarchy of values for dynamic helm chart configuration

我想做什么

我想在values.yaml中有一些默认设置和选项,然后是不同实例的哈希映射,这些实例将转换为服务和部署,其个别设置覆盖默认值。

values.yaml

someSetting: TheDefault
deployments:
  one:
    role: XYZ
  two:
    role: ABC
    someSetting: Overridden

在上述情况下,将有两个部署和服务,onetwoonesomeSetting 的值将是 TheDefaulttwo 的值将是 Overridden.

actual template yaml

我正在尝试这个 - 构建一个字典,$p,其中包含根作用域 ChartRelease 对象,然后合并根作用域值in,则将当前的部署值合并进来。

{{- range $deploymentKey, $deploymentVal := .Values.deployments }}
{{- $p := dict "deploymentKey" $deploymentKey }}
{{- $_ := set $p "Chart" $.Chart }}
{{- $_ := set $p "Release" $.Release }}
{{- $_ := merge $p $.Values }}
{{- $_ := merge $p . }}
...
{{- end }}

包含 ChartRelease 的原因是,尽管文档怎么说,$.Chart 并不总是可用 - 当我将范围传递到模板时它实际上是空的并且该模板尝试使用 $. 来引用根范围。

所以我正在做这样的事情:

name: {{ template "my-app.fullname" $p }}

image: {{ $p.image.name }}

错误

问题是,虽然 helm lint returns 没有错误,但 helm template .(或干式 运行)产生:

Error: rendering template failed: runtime error: invalid memory address or nil pointer dereference

我试过的

我的问题..

如何修复此崩溃?

或者,我怎样才能实现我想要的目标?

您可以改为使用默认值和原始服务和部署创建一个通用基本图表,然后创建一个包含基本图表两次的伞形图表,别名 'one' 和 'two'。然后伞图的值文件是您覆盖默认值的地方,您不需要任何字典。

这里的示例是基本图表 - https://github.com/ryandawsonuk/configmaps-transformers/tree/master/helm/transformers/charts/transformer and the umbrella chart includes it multiple times under different aliases - https://github.com/ryandawsonuk/configmaps-transformers/blob/master/helm/transformers/requirements.yaml. The umbrella chart's values file plugs in different values for each instance of the base chart that is included. In the umbrella values each instance is referenced by its alias - https://github.com/ryandawsonuk/configmaps-transformers/blob/master/helm/transformers/values.yaml#L14

试试这个:

deployment.yaml:

{{- range $deploymentKey, $deploymentVal := .Values.deployments }}
{{- $p := dict "deploymentKey" $deploymentKey }}
{{- $_ := set $p "Chart" $.Chart }}
{{- $_ := set $p "Release" $.Release }}
{{- $_ := merge $p . }}
{{- $_ := merge $p $.Values }}
...
{{ end }}

_helpers.tpl:

{{- define "repro.fullname" -}}
{{- printf "%s" .Chart.Name }}
{{- end -}}