问题描述
我正在尝试定义一些变量以使我的舵图不可重复
{{ $config := .Values.service }}
{{- range .Values.services }}
{{ $config.$serviceName }}
{{- define "{{ $serviceName }}.selectorLabels" -}}
app.kubernetes.io/name: {{ .name }}
app.kubernetes.io/instance: {{ .instance }}
{{- end -}}
{{- end -}}
values.yaml:
services:
- service1
- service2
- service3
service:
- service1:
name: service1
- service2:
name: service2
- service3:
name: service3
但是一直提示错误字符 U+0024 ‘$’
你知道如何通过其他变量定义一个变量吗?
解决方法
Go text/template language、the Sprig extensions 和 Helm 的本地扩展都无法定义具有动态名称的模板。 define
调用中的名称必须是固定字符串。文本/模板文档说明(在“嵌套模板定义”下):
模板定义必须出现在模板的顶层......定义操作通过提供字符串常量来命名正在创建的模板。
但是,模板采用(单个)参数。与其尝试为每个动态指定的值定义一个单独的模板,不如定义一个生成此内容的模板,然后使用动态设置调用它。
{{- define "selectorLabels" -}}{{/* <-- fixed name */-}}
{{/* .name is relative to the template parameter . */-}}
app.kubernetes.io/name: {{ .name }}
app.kubernetes.io/instance: {{ .instance }}
{{- end -}}
{{- range .Values.services }}
{{-/* . is one item from the services list */}}
{{ include "selectorLabels" . }}
{{- end -}}
您可能会发现更简单的 Helm 值结构也更易于使用。如果分解.Values.service
,它是一个列表,其中每个列表都是一个单项字典,其中的键来自一个单独的列表。您可以将其构建为设置字典的单个平面列表,将项目名称作为 name:
值嵌入到结构中(例如 pod 规范中的 containers:
列表)。
services:
- name: service1
instance: foo
- name: service2
instance: bar
- name: service3
instance: baz