云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

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" . }}"