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

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的变量。