kubernetes-helm模板可以使用变量吗?

rid*_*tch 8 kubernetes-helm

我有一个k8s资源的通用模板,我想扩展n次(如果你很好奇,我可以创建mongo集群的n个成员,他们正在使用statefulset资源,这样每个成员都有一个稳定的网络名称).

显然,每次循环我都需要不同的值.我正在循环Sprig"until"函数生成的一系列索引.但是循环的$ index没有在"."中设置.命名空间.所以我无法在我的_helpers.tpl文件中引用我定义的模板中的当前迭代.

这里是一个示例模板w /完整的k8s资源yaml(我缩写大部分):

{{- define "mytest" -}} 
---
apiVersion: apps/v1beta1
kind: StatefulSet
  abbreviated...
  containers:
  - name: mongod-$index
  abbreviated...
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

呼叫者:

{{ range $index, $e := until .Values.mongod_count }}
    {{include "mytest" .}}
{{ end}}
Run Code Online (Sandbox Code Playgroud)

我得到:未定义的变量"$ index"

我也试过过块,就像在我的(调用者)模板中一样:

{{ $foo := "somevalue" }}
{{ define "my_extra_labels" }} bla {{ .Values.test }}_{{$foo}}{{end}}
{{ template "mytest" . }}
Run Code Online (Sandbox Code Playgroud)

这在我的_helpers.tpl中

{{/* Test stuff */}} 
{{- define "mytest" -}}
hello: world_how_are_{{ block "my_extra_labels" . }}{{ end }}
{{- end -}} 
Run Code Online (Sandbox Code Playgroud)

变量$ foo未在"define"主体中定义.

这个模板范围感觉非常严格,此时我无法看到如何使用它来解决我当前的场景.

有没有办法将变量推入"." 命名空间?如果是这样(穿过我的手指)有没有办法以某种方式合并名称空间,以便我仍然可以访问.Values和.Chart变量?

ksc*_*der 15

helm中的模板无法访问变量.但是,传递给模板的上下文是字典.可以从Go模板中访问sprig库,可以使用它来操作字典.

拿这个简化的模板:

{{- define "mytest" -}} 
  - name: mongod-{{ .index }}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

您现在可以将此模板称为示例:

{{ range $index := until 5 }}
  {{- $p := dict "index" $index }}
  {{include "mytest" $p}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

这将输出:

- name: mongod-0
- name: mongod-1
- name: mongod-2
- name: mongod-3
- name: mongod-4
Run Code Online (Sandbox Code Playgroud)

您还可以将项目添加到现有或当前范围的字典:

{{- $_ := set . "index" "none" }}
{{include "mytest" .}}
Run Code Online (Sandbox Code Playgroud)

$ _用于抑制不需要的输出,因为"set"返回新字典.以上回报:

- name: mongod-none
Run Code Online (Sandbox Code Playgroud)

添加到字典中的任何值都将超出调用范围.如果您想避免污染现有字典,可以强制执行深层复制:

{{-  $d := merge (dict) . -}}
Run Code Online (Sandbox Code Playgroud)

添加到"$ d"的任何内容都不会出现在"."中.


kiv*_*ant 7

我将把它留在这里是因为有些人可能试图在 Helm 中为变量设置一个静态值以在模板中重新使用它,他们可能会通过标题找到这个 SO 问题。所以,这里有一个技巧:

更新:

有一个更好的方法来做到这一点:

{{- $_ := set . "appName" "app_name_one"-}}

---
apiVersion: v1
kind: Deployment
apiVersion: apps/v1beta2
metadata:
  name: {{ .appName }}

Run Code Online (Sandbox Code Playgroud)

旧的建议(不要使用它)

结合@kscoder 建议的上述答案中的语法

    ---
    # values.yml

    static_vars:
      app_name_one: app_name_one
      text_to_reuse: text_to_reuse

    ---    
    # templates/deployment.yml

    # now you don't need to copy-n-paste values, just set them here once
    {{- $text_to_reuse := index .Values "static_vars" "text_to_reuse" -}}
    {{- $app_name := index .Values "static_vars" "app_name_one" -}}
    {{- $_ := set . "app_name" $app_name -}}

    apiVersion: v1
    kind: Deployment
    apiVersion: apps/v1beta2
    metadata:
      name: {{ .app_name }}
    spec:
      selector:
        # https://github.com/kubernetes/kubernetes/issues/26202
        matchLabels:
          name: {{ .app_name }}
      template:
        metadata:
          labels:
            name: {{ .app_name }}
            name_alt: {{ $app_name }}
            other_label: {{ $text_to_reuse }}
    # and so on
Run Code Online (Sandbox Code Playgroud)