3.5.1 helper文件
首先来看helper文件。这个文件主要用来存放一些公用的自动化脚本,在2.10.6节已经介绍过这个文件,下面就来详细分析该文件中的每个函数,并针对一些函数列出具体的使用样例。
1.wordpress.name
{{/* Expand the name of the Chart. */}} {{- define "wordpress.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}}
该函数名为wordpress.name,可以看到它使用了default函数。default函数使用的格式是default DEFAULT_VALUE GIVEN_VALUE,也就是默认这个函数前面的名字是.Chart.Name。但是如果用户在Values.nameOverride中设置了值,就会用这个值覆盖前值。trunc函数的功能是用来截断字符串,即只截取前面的63个字符串,也就是限制了字符串的最大个数为63个。trimSuffix函数用来删除末尾的字符串,如果这个字符串以-结尾,那么它就会被这个函数删除。
2.wordpress.fullname
wordpress.fullname是一个自动生成名称的函数,在很多自动生成名字的场景下,这个函数非常有意义。先来看一下这个函数的使用方式。
{{/* Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). */}} {{- define "wordpress.fullname" -}} {{- $name := default .Chart.Name .Values.nameOverride -}} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} {{- end -}}
wordpress.fullname函数的描述很清楚地表明其作用是产生默认的App名字,也就是给templates/文件夹中资源的App字段提供默认的产生方式。同样由于Kubernetes DNS限制,App名字大小必须在63个字符串内。
wordpress.fullname的使用方式和上面wordpress.name类似,首先使用default函数确定如果用户设置了需要覆盖的名字,那么就使用用户设置的名字,否则默认使用Chart名字。不同点在于这里声明了一个变量name,将获取的Chart名字或者用户设置的名字赋值给name这个变量。下面使用了printf函数,这个函数可以用替代符的形式输出特定格式的字符串,比如这里的输出格式就会是xxxxx(releaseName)-(ChartName)。后面的trunc函数用来限制最大字符串长度为63,trimSuffix函数截取了最末尾的-字符串。
下面我们看一下templates/文件中某些资源使用wordpress.fullname函数的方法,我们以./templates/pvc.yaml为例。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: {{ template "wordpress.fullname" . }} labels: app: "{{ template "wordpress.fullname" . }}"
可以看到,在创建这个pvc时,就是使用wordpress.fullname函数给它的资源命名的,同样labels.app也用到了wordpress.fullname函数,这样就实现了这个Chart所有部署的资源都是同样格式的命名规范。
3.wordpress.image
{{/* Return the proper WordPress image name */}} {{- define "wordpress.image" -}} {{- $registryName := .Values.image.registry -}} {{- $repositoryName := .Values.image.repository -}} {{- $tag := .Values.image.tag | toString -}} {{/* Helm 2.11 supports the assignment of a value to a variable defined in a different scope, but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic. Also, we can't use a single if because lazy evaluation is not an option */}} {{- if .Values.global }} {{- if .Values.global.imageRegistry }} {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}} {{- else -}} {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} {{- end -}} {{- else -}} {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} {{- end -}} {{- end -}}
wordpress.image函数用来给Wordpress生成对应的镜像全地址。在values文件中,我们在不同的标签下指定了镜像仓库的名称、镜像名和tag,但是并没有连接起来,因此这里使用了一个函数将这些镜像地址合并起来。首先分别将镜像地址、镜像名、镜像tag赋值给3个变量,第3个变量使用toString函数将数字转换成字符串。Helm 2.11以上版本提供了在其他的范围声明全局变量的功能,因此这里增加了判断逻辑,如果全局变量生效,那么就从全局变量中获取对应的字符,如果不生效就还是从原来的位置取值,最终通过printf"%s/%s:%s方法生成地址,这样就实现了将全镜像地址拼接出来。
./templates/deployment.yaml: image: {{ template "wordpress.image" . }}
在Wordpress的deployment资源中,直接使用template关键字调用了这个函数实现全地址镜像的注入。
4.wordpress.Chart
{{/* Create Chart name and version as used by the Chart label. */}} {{- define "wordpress.Chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}}
该函数比较简单,就是将Chart名称和版本合并,然后将字符串“+”替换为“_”,最后限制字符串长度为63,删除最后的“-”字符串,使用方法也比较简单。
/templates/deployment.yaml: Chart: "{{ template "wordpress.Chart" . }}"