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

3.5.3 其他文件

其余除了几个特殊的文件,剩下的都是Wordpress需要的资源文件,这里不一一介绍,挑选一个比较重要的deployment.yaml来了解。


[root@iZ8vb0qditk1qw27yu4k5nZ templates]# ll
total 44
-rw-r--r-- 1 root root 7765 Aug 22 19:30 deployment.yaml
-rw-r--r-- 1 root root  437 Aug 22 19:30 externaldb-secrets.yaml
-rw-r--r-- 1 root root 3968 Aug 22 19:30 _helpers.tpl
-rw-r--r-- 1 root root  911 Aug 22 19:30 ingress.yaml
-rw-r--r-- 1 root root 2442 Aug 22 19:30 NOTES.txt
-rw-r--r-- 1 root root  752 Aug 22 19:30 pvc.yaml
-rw-r--r-- 1 root root  611 Aug 22 19:30 secrets.yaml
-rw-r--r-- 1 root root 1464 Aug 22 19:30 svc.yaml
drwxr-xr-x 2 root root 4096 Aug 22 19:30 tests
-rw-r--r-- 1 root root  438 Aug 22 19:30 tls-secrets.yaml

Wordpress的主程序如下所示。


apiVersion: apps/v1
kind: Deployment
metadata:
  name:{{template "wordpress.fullname".}}
  labels:
    app:"{{template "wordpress.fullname".}}"
    Chart:"{{template "wordpress.Chart".}}"
    release:{{.Release.Name | quote}}
    heritage:{{.Release.Service | quote}}

首先是通用的Deployment开头字段,这里使用了3.5.1节介绍的wordpress.fullname函数,将生成的名字作为Wordpress的名称,接下来几个是标准的标签,都是使用上面在_helpers.tpl文件内定义好的函数。


spec:
  selector:
    matchLabels:
      app: "{{ template "wordpress.fullname" . }}"
      release: {{ .Release.Name | quote }}
  {{- if .Values.updateStrategy }}
  strategy: {{ toYaml .Values.updateStrategy | nindent 4 }}
  {{- end }}

然后是spec字段,这里同样需要使用和上面一致的标签。然后判断是否需要设置更新策略,这里的更新策略比较复杂,首先更新策略是一段yaml文本,如下所示。


strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

由于values.yaml文件内设置的值必须是文本格式,所以再嵌入Deployment文件中时,使用了toYaml函数,这个函数可以将文本变更为yaml格式,然后使用nindent函数恢复原来的空行和空格,并将这些yaml信息完整匹配到Deployment信息中。


containers:
  - name: wordpress
    image: {{ template "wordpress.image" . }}
    imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
    env:
    - name: ALLOW_EMPTY_PASSWORD
      value: {{ ternary "yes" "no" .Values.allowEmptyPassword | quote }}
    - name: MARIADB_HOST
    {{- if .Values.mariadb.enabled }}
      value: {{ template "mariadb.fullname" . }}
    {{- else }}
      value: {{ .Values.externalDatabase.host | quote }}
    {{- end }}

下面的信息是关于容器的字段,template"wordpress.image"调用定义的函数拼接出对应的全量镜像地址。环境变量字段使用了函数ternary,这个函数的格式为ternary"foo""bar"true。根据最后的判断条件返回结果,如果最后的判断条件是true,则返回第一个结果;如果最后的判断条件是false,则返回第二个结果。

在这个例子中,如果.Values.allowEmptyPassword设置为true,则这个字段会被yes填充;如果.Values.allowEmptyPassword设置为false,则这个字段会被no填充。后面的环境变量就是使用其他的预定义函数来生成对应的标签名。下面的部分基本使用了我们介绍的这些功能,这里不再赘述。