Pipeline 与 Function
概述
参考:
将 .Values 对象中的字符串注入模板时,应引用这些字符串。我们可以通过在 **Template Directive(模板指令)**中调用 quota 函数来实现,比如下面这个示例,会将引入的指转换为字符串类型:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name}}-configmap
data:
myvalue: "Hello World"
drink: {{quote .Values.favorite.drink}}
food: {{quote .Values.favorite.food}}
模板函数遵循语法 functionName arg1 arg2...
。在上面的代码片段中,quote .Values.favorite.drink
调用 quote 函数并将一个参数传递给它。
Helm 拥有超过 60 种可用函数。其中一些是由 Go template language(Go 模板语言) 本身定义的。其他大多数都是 Sprig template library(Sprig 模板库) 的一部分。随着示例的进行,我们将看到其中的许多例子。
注意:虽然我们将 Helm template language(Helm 模板语言) 视为 Helm 特有的,但它实际上是 Go 模板语言,一些额外函数和各种包装器的组合,以将某些对象暴露给模板。Go 模板上的许多资源在了解模板时可能会有所帮助。
Pipeline 管道
在 Helm 的 Template 中,**Pipeline(管道)**的概念与 Go Template 中 Pipeline 的概念不同,并不是指产生数据的操作。
Pipeline(管道) 与 Linux 中管道的概念类似,用于连接多个 Template Directives(模板指令)。换句话说,**Pipeline(管道)**是一种按顺序完成多项任务的有效方式。
本篇文章开头的示例,如果使用 Pipeline 重写,则是这样的:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | quote }}
在此示例中,我们没有调用 quote ARGUMENT
,而是颠倒了顺序。使用 Pipeline 符号 |
将参数“发送”到函数:.Values.favorite.drink | quote
。使用 Pipeline,我们可以将多个功能链接在一起,比如:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | upper | quote }}
Function 函数
参考:
Helm Template Function(Helm 模板函数) 可以用来丰富模板功能,通过函数,可以对传入模板的数据进行更多操作,以便让这些数据更符合我们的预期。
简单示例:
这是一个模板文件
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name}}-configmap
data:
drink: {{.Values.favorite.drink}}
food: {{quote .Values.favorite.food}}
这是值文件
favorite:
drink: tee
food: bread
渲染模板结果:
~]# helm template test .
---
# Source: test/templates/test.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
data:
drink: tee # 未使用 quote 函数
food: "bread" # 使用了 quote 函数
在模板中,使用了一个名为 quote 的函数,这个函数的功能是,可以将引用的对象的值都机上双引号。Helm 里所有可用的函数列表:https://helm.sh/docs/chart_template_guide/function_list/
default 函数
模板中经常使用函数是 default,语法为:
default DEFAULT_VALUE GIVEN_VALUE
参数:
- DEFAULT_VALUE # 指定默认值
- GIVEN_VALUE # 默认值将会传给 GIVEN_VALUE
default 函数用来为模板内部的指令指定默认值
上面的示例修改一下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name}}-configmap
data:
drink: {{.Values.favorite.drink}}
food: {{quote .Values.favorite.food}}
food_default: {{default "bread" .Values.favorite.food}}
此时,如果我们将 value.yaml 中 food: bread 注释掉,会得到如下结果:
[root@master-1 test]# helm template test .
---
# Source: test/templates/function_pipeline.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
data:
drink: tee
food:
food_default: bread
lookup 函数
lookup 函数可以用于查找 kubernetes 集群中的资源,语法:
lookup APIVERSION KIND NAMESPACE NAME
比如:
(lookup "v1" "Namespace" "" "default").metadata.annotations
上述指令将会获取 default 名称空间的 metadata.annotaions 字段的信息。类似于 kubectl get ns default –template={{.metadata.annotations}} 命令,与该命令获取的值一致。
注意:当使用 helm template 命令或者使用 –dry-run 标志时,并不会与 Kubernetes 的 API Server 建立联系,所以 lookup 在上述两种情景下,无法获取具体的值,只会返回一个空的 map 。
Operators 函数
Operators 运算符,在 helm 模板里也当作函数来看。eq、ne、lt、gt、and、or 等等,均视为函数
与正常情况不同,运算符作为函数时,需要将这个关键字放在语法开头,后面跟参数。比如:
eq # 比较两个 Pipeline 是否相等
# 比较 ARG1 与 ARG2 是否相等
# 也可以指定多个参数,所有参数都是与 ARG1 进行比较
eq ARG1 ARG2
and # 与运算,当两个 Pipeline 都为真时,结果为真
# 如果 .Values.fooString 值存在,并且 .Values.fooString 的值为 foo,则执行后面的指令
{{if and .Values.fooString (eq .Values.fooString "foo") }}
{{...}}
{{end}}
字典类型数据处理函数
mergeOverwrite, mustMergeOverwrite
将两个或多个字典合并为一个,右侧的优先级最高
Syntax(语法)
$NewDict := mergeOverwrite $DEST $SOURCE1 $SOURCE2
简单示例:
dst:
default: default
overwrite: me
key: true
src:
overwrite: overwritten
key: false
通过 mergeOverwrite .Values.dst .Values.src
语句我们可以得到如下结果:
newdict:
default: default
overwrite: overwritten
key: false
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.