2.1.4 template和values
Helm Chart template是以Go Template模板语言写成的,所有的template文件都存放在templates/目录下。当Helm渲染Chart的时候,它会将该文件夹下面的每个文件使用Go引擎运行一遍。
template的values分别从两个方面获取:
·Chart开发者会提供一个叫作values.yaml的文件,这个文件包含的所有默认值都可被template获取;
·Chart使用者可能也会提供一个含有参数的文件,这个参数文件可以在helm install时使用,这里的参数会覆盖template的默认值。
1.template文件
template文件遵循Go Template模板语言规范,简例如下。
apiVersion: v1 kind: ReplicationController metadata: name: deis-database namespace: deis labels: app.Kubernetes.io/managed-by: deis spec: replicas: 1 selector: app.Kubernetes.io/name: deis-database template: metadata: labels: app.Kubernetes.io/name: deis-database spec: serviceAccount: deis-database containers: - name: deis-database image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}} imagePullPolicy: {{.Values.pullPolicy}} ports: - containerPort: 5432 env: - name: DATABASE_STORAGE value: {{default "minio" .Values.storage}}
上例就是一个简单的ReplicationController资源文件,它使用了4个template value。
·imageRegistry:Docker镜像仓库地址。
·dockerTag:镜像tag。
·pullPolicy:Kubernetes拉取镜像策略。
·storage:存储后端,默认使用minio。
这些参数都存放在value.yaml中,默认值一般由开发者定义,用户在使用时也可以自定义一些参数。
2.预定义参数
value通过values.yaml或helm install--set进行指定。但在template中有一些Helm预先定义的参数可以直接使用。
如下参数都是Helm预先定义的,每个template都可以使用,而且不能被覆盖,这些value都是大小写敏感的。
·Release.Name:安装后的Release的名字。
·Release.Time:Chart Release最后的更新时间。
·Release.NameSpace:安装后的Release命名空间。
·Release.Service:管理Release的服务名称,目前默认是Tiller。
·Release.IsUpgrade:当执行动作为Upgrade或Rollback时,值为true。
·Release.IsInstall:当执行Install动作时,值为true。
·Release.Revision:版本号码,从1开始,每次执行helm upgrade加1。
·Chart:Chart.yaml的文本内容,Chart版本号可以从Chart.Version获取,管理者信息可以从Chart.Maintainers获取。
·Files:一个Map对象,含有当前Chart部分文件,这个对象不会提供template文件夹的内容,但是可以提供当前Chart目录下的其他文件。用户可以通过使用index.Files“f ile.name”、.Files.Get name、.Files.GetString name或.Files.GetBytes指令获取文件的内容。
·Capabilities:一个Map对象,可通过.Capabilities.KubeVersion指令查询此对象含有的Kubernetes集群的信息;可通过.Capabilities.TillerVersion指令查询Tiller版本号;可通过.Capabilities.APIVersions.Has“batch/v1”指令查询是否支持某个APIGroup。
3.values文件
values.yaml提供了文件必需的一些默认参数,一般的文件默认参数如下:
imageRegistry: "quay.io/deis" dockerTag: "latest" pullPolicy: "Always" storage: "s3"
values文件默认是yaml格式,Helm命令行提供一种可以让使用者覆盖默认参数的方式:
helm install --values=myvals.yaml wordpress
当使用如上方式传递参数的时候,就会覆盖默认的参数。例如我们有一个myvals.yaml文件,含有参数:storage:“gcs”,当使用如上方式提交后,新的values.yaml会变为:
imageRegistry: "quay.io/deis" dockerTag: "latest" pullPolicy: "Always" storage: "gcs"
注意:
·在Chart中默认值的文件必须叫values.yaml,但是通过命令行提交的文件可以取任意名字。
·如果使用helm install--set命令传递参数,它们最终会被转换成yaml并传递到后端。
在template中,用户可以使用如下方式很方便地获取values.yaml中定义的参数。
apiVersion: v1 kind: ReplicationController metadata: name: deis-database namespace: deis labels: app.Kubernetes.io/managed-by: deis spec: replicas: 1 selector: app.Kubernetes.io/name: deis-database template: metadata: labels: app.Kubernetes.io/name: deis-database spec: serviceAccount: deis-database containers: - name: deis-database image: {{.Values.imageRegistry}}/postgres:{{.Values.dockerTag}} imagePullPolicy: {{.Values.pullPolicy}} ports: - containerPort: 5432 env: - name: DATABASE_STORAGE value: {{default "minio" .Values.storage}}
4.values与依赖Chart的关系
values文件能够为最高层级的Chart声明变量参数,也能为被包含在Charts/目录下的Chart声明参数。例如,Wordpress Chart有mysql和apache两个依赖项,values文件能够同时为它们赋值。
title: "My WordPress Site" # Sent to the WordPress template mysql: max_connections: 100 # Sent to mysql password: "secret" apache: port: 8080 # Passed to Apache
最高层级的Chart能够获取它所有依赖项的value值。因此Wordpress能够通过.Values.mysql.password命令获取mysql的密码。但是低层级的Chart不能获取高层级Chart的value值,因此mysql就无法获取title,同样它也获取不到apache.port。
values是具有命名空间的。因此对于Wordpress来说,它能够通过.Values.mysql.password命令获取mysql的密码,但是mysql就不用这样,mysql可以直接通过.Values.password命令获取Wordpress的密码。
5.全局变量
Helm提供了一种特殊的全局变量,举例如下。
title: "My WordPress Site" # Sent to the WordPress template global: app: MyWordPress mysql: max_connections: 100 # Sent to mysql password: "secret" apache: port: 8080 # Passed to Apache
上例代码中添加了一个global字段,所有的Chart都能通过.Values.global.app命令获取该值。比如mysql能够通过.Values.global.app命令获取global的值,这种方式非常适合需要在多个Chart之间共享元数据信息的场景。
如果一个子Chart声明了一个global变量,那么这个全局变量就会向下传递,且不会向上传递。因此子Chart永远不会影响父Chart的参数定义。当然,如果父Chart和子Chart同时定义了同名全局变量,父Chart的全局变量也会覆盖子Chart的变量。