【问题标题】:Hierarchy of values for dynamic helm chart configuration动态舵图配置的值层次结构
【发布时间】:2019-01-04 08:52:00
【问题描述】:

我想要做什么

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

values.yaml

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

在上述情况下,将有两个部署和服务,onetwosomeSetting 的值对于 one 将是 TheDefault,对于 two 将是 Overridden

actual template yaml

我正在尝试这个 - 构建一个字典 $p,其中包含根范围 ChartRelease 对象,然后合并根范围值,然后合并当前部署值在。

{{- 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 并不总是可用 - 当我将范围传递给模板并且该模板尝试使用 @987654339 时,它实际上是空的@ 引用根范围。

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

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

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

错误

问题在于,虽然helm lint 没有返回错误,但helm template .(或试运行)会产生:

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

我尝试过的

  • 删除每个 merge 以尝试缩小崩溃范围 - 它们似乎不会导致崩溃
  • $ 合并到字典中
  • 哭泣
  • 在 Helm Slack 上提问
  • 就 GitHub 问题提问

我的问题..

我该如何解决这个崩溃?

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

【问题讨论】:

    标签: kubernetes-helm


    【解决方案1】:

    试试这个:

    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 -}}
    

    【讨论】:

    • 谢谢,是的,交换两条合并行是其中的一个重要部分 :) 我遇到的崩溃错误与 merge 语句有关 - 当我的 Values.yaml 有一个空白键时(在我的情况,env: 没有子键/值) - 将引发 GH 问题。
    【解决方案2】:

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

    例如,这里是一个基本图表 - https://github.com/ryandawsonuk/configmaps-transformers/tree/master/helm/transformers/charts/transformer,而伞形图表以不同的别名多次包含它 - https://github.com/ryandawsonuk/configmaps-transformers/blob/master/helm/transformers/requirements.yaml。伞形图的值文件为包含的每个基本图实例插入不同的值。在伞形值中,每个实例都由其别名引用 - https://github.com/ryandawsonuk/configmaps-transformers/blob/master/helm/transformers/values.yaml#L14

    【讨论】:

    • 谢谢,这会动态工作吗?我希望 values.yaml(即最终图表的用户)指定有多少服务/部署?
    • 我现在看到,像这样动态的图表会非常有趣。我会首先尽可能具体地处理它,所以首先没有字典。最初,我会尝试使用 range 函数遍历部署(一个、两个等)。可能会使它成为更容易但希望映射的列表。所以会有一个 deployments.yaml 被包裹在一个循环函数中,比如 range ,并且在生成的部署之间有分隔符,每个都有来自键的唯一名称。然后尝试在其工作时添加默认值。可以使用默认函数,注意从循环中确定范围。
    • 很高兴能聊聊这个 - chat.stackoverflow.com/rooms/186257/…
    • 我有范围工作,只需要默认值,但想使用字典而不是检查/默认每个值。将范围内的$.Values. 合并到字典中会导致 helm 进程崩溃
    • 是的,我想'default'或'if exists else'会有很多重复
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多