我有一个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 -}}
呼叫者:
{{ range $index, $e := until .Values.mongod_count }}
{{include "mytest" .}}
{{ end}}
我得到:未定义的变量“$ index”
我也试过过块,就像在我的(调用者)模板中一样:
{{ $foo := "somevalue" }}
{{ define "my_extra_labels" }} bla {{ .Values.test }}_{{$foo}}{{end}}
{{ template "mytest" . }}
这是我的_helpers.tpl
{{/* Test stuff */}}
{{- define "mytest" -}}
hello: world_how_are_{{ block "my_extra_labels" . }}{{ end }}
{{- end -}}
变量$ foo未在“define”主体中定义。
这个模板范围感觉非常严格,此时我无法看到如何使用它来解决我当前的情况。
是否有某种方法可以将变量推送到“。”命名空间?如果是这样(交叉我的手指)有没有办法以某种方式合并名称空间,以便我仍然可以访问.Values和.Chart变量?
答案 0 :(得分:14)
helm中的模板无法访问变量。但是,传递给模板的上下文是字典。可以从Go模板中访问sprig库,可以用来操作字典。
采用这个简化的模板:
{{- define "mytest" -}}
- name: mongod-{{ .index }}
{{- end -}}
您现在可以将此模板称为示例:
{{ range $index := until 5 }}
{{- $p := dict "index" $index }}
{{include "mytest" $p}}
{{- end -}}
这将输出:
- name: mongod-0
- name: mongod-1
- name: mongod-2
- name: mongod-3
- name: mongod-4
您还可以将项目添加到现有或当前范围字典:
{{- $_ := set . "index" "none" }}
{{include "mytest" .}}
$ _用于抑制不需要的输出,因为“set”返回新字典。以上回报:
- name: mongod-none
添加到词典中的任何值都将超出通话范围。如果您想避免污染现有字典,可以使用以下命令强制执行深层复制:
{{- $d := merge (dict) . -}}
添加到“$ d”的任何内容都不会出现在“。”。
中答案 1 :(得分:1)
我会在这里留下这个,因为有些人可能会尝试将静态值设置为Helm中的变量,以便在模板中重复使用它们,他们可能会通过标题找到这个SO问题。所以,这是一个技巧:
<强>更新强>
有更好的方法:
{{- $_ := set . "appName" "app_name_one"-}}
---
apiVersion: v1
kind: Deployment
apiVersion: apps/v1beta2
metadata:
name: {{ .appName }}
旧的建议(不要使用它)
结合@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