Helm3模板-内置函数和Values

前面我们学习了Helm3的一些常用操作方法,今天我们来定义一个Chart包,并了解Helm3中模板的一些使用方法。

注:Helm3在Github上有比较详细的文档:点击查看

1、定义Chart

⼀个 Chart 包就是⼀个文件夹的集合,文件夹名称就是 Chart 包的名称,比如创建⼀个 hello-helm 的 Chart 包:

img

Chart 包的目录前面我们就已经学习过了,这里我们再来仔细看看 templates 目录下⾯的文件:

  • NOTES.txt:chart 的 “帮助文本”。这会在用户运行 helm install 时显示给用户;
  • deployment.yaml:创建 Kubernetes deployment 的基本 manifest;
  • service.yaml:为 deployment 创建 service 的基本 manifest;
  • ingress.yaml: 创建 ingress 对象的资源清单文件;
  • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用。

这里我们明⽩每⼀个文件的作用就行,我们可以使用下面的命令把 templates 目录下⾯所有的文件全部删除,这里我们自己来创建模板文件:

rm -rf mychart/templates/*.*

2、创建模板

这里我们来创建⼀个非常简单的模板 ConfigMap,在 templates 目录下面新建⼀个 configmap.yaml 文件,例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

实际上我们现在就有⼀个可安装的 chart 包了,通过 helm install 命令来进行安装:

img

在上面的输出中,我们可以看到 ConfigMap 资源对象已经创建了。然后使用下面的命令可以看到实际的模板被渲染过后的资源文件:

img

现在我们看到上面的 ConfigMap ⽂件就是我们前⾯在模板⽂件中设计的,然后我们删除当前的 release :

img

3、添加模板

我们可以看到上⾯定义的 ConfigMap 名字是固定的,但往往这并不是⼀种很好的做法,我们可以通过插入 release 的名称来生成资源的名称,比如这里 ConfigMap 的名称我们希望是:values-release-configmap,这就需要用到 Chart 的模板定义方法了。Helm Chart 模板使用的是 Go 语⾔模板编写而成,并添加了 Sprig 库中的50多个附件模板函数以及⼀些其他特殊的函数。

注:需要注意的是 kubernetes 资源对象的 labels 和 name 定义被限制 63个字符,所以需要注意名称的定义。

现在我们来重新定义上面的 configmap.yaml 文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

我们将名称替换成了 {{ .Release.Name }}-configmap ,其中包含在 {{ 和 }} 之中的就是模板指令, {{ .Release.Name }} 将 release 的名称注入到模板中来,这样最终生成的 ConfigMap 名称就是以 release 的名称开头的了。这里的 Release 模板对象属于 Helm 内置的⼀种对象,还有其他很多内置的对象,后面我们也会接触到。

现在我们来重新安装 Chart 包,注意观察 ConfigMap 资源对象的名称:

img

可以看到现在⽣成的名称变成了mychart-1585398429-configmap,证明已经生效了,当然我们也可以使用命令 helm get manifest mychart-1585398429 查看最终生成的清单文件的样子。

4、Helm调试

我们用模板来生成资源文件的清单,但是如果我们想要调试就非常不方便了,我们不可能每次都去部署⼀个 release 实例来校验模板是否正确,所幸的是 Helm 为我们提供了 –dry-run –debug 这个可选参数,在执行 helm install 的时候带上这两个参数就可以把对应的 values 值和生成的最终的资源清单文件打印出来,而不会真正的去部署⼀个 release 实例,比如我们来调试上⾯创建的 chart 包:

# 截图太长这里我就不放了、小伙伴们可以自行去查看(注意helm2和helm3的操作命令)
helm install --dry-run --debug ./mychart/ --generate-name

现在我们使用 –dry-run 就可以很容易地测试代码了,不需要每次都去安装⼀个 release 实例了,但是要注意的是这不能确保 Kubernetes 本身就⼀定会接受生成的模板,在调试完成后,还是需要去安装⼀个实际的 release 实例来进行验证的。

5、内置对象

刚刚我们使用 {{.Release.Name}} 将 release 的名称插入到模板中。这里的 Release 就是 Helm 的内置对象,下⾯是⼀些常用的内置对象,在需要的时候直接使用就可以、当然我们也可以去查看官方文档中的详细描述:https://helm.sh/docs/chart_template_guide/builtin_objects/

Release:此对象描述发行版本身。它内部有几个对象:

  • Release.Name:发行名称;
  • Release.Namespace:要释放到的名称空间(如果清单未覆盖);
  • Release.IsUpgrade:true如果当前操作是升级或回滚,则设置为;
  • Release.IsInstall:true如果当前操作是安装,则设置为;
  • Release.Revision:此版本的修订号。在安装时,该值为1,并且每次升级和回滚时都会增加;
  • Release.Service:呈现当前模板的服务。在Helm上,这始终是Helm。

    Values:从values.yaml文件和用户提供的文件传递到模板的值,默认情况下Values为空。

Chart:Chart.yaml文件的内容。输入的任何数据Chart.yaml都可以在此处访问。例如{{ .Chart.Name }}-{{ .Chart.Version }}将打印出mychart-0.1.0。

Files:这提供对图表中所有非特殊文件的访问。虽然您不能使用它来访问模板,但是可以使用它来访问图表中的其他文件:

Files.Get是用于通过名称(.Files.Get config.ini)获取文件的功能;

Files.GetBytes是用于以字节数组而不是字符串形式获取文件内容的函数。这对于诸如图像之类的东西很有用;

Files.Glob 是一个函数,该函数返回名称与给定的Shell Glob模式匹配的文件列表;

Files.Lines是一种逐行读取文件的功能。这对于遍历文件中的每一行很有用;

Files.AsSecrets 是将文件主体作为Base 64编码的字符串返回的函数;

Files.AsConfig 是一个将文件正文作为YAML映射返回的函数。

Capabilities:这提供了有关Kubernetes集群支持哪些功能的信息:

  • Capabilities.APIVersions 是一组版本;
  • Capabilities.APIVersions.Has $version指示版本(例如 batch/v1)或资源(例如apps/v1/Deployment)在群集上是否可用;
  • Capabilities.KubeVersion并且Capabilities.KubeVersion.Version是Kubernetes版本;
  • Capabilities.KubeVersion.Major 是Kubernetes的主要版本;
  • Capabilities.KubeVersion.Minor 是Kubernetes的次要版本。

Template:包含有关正在执行的当前模板的信息:

  • Name:当前模板的命名空间文件路径(例如 mychart/templates/mytemplate.yaml);
  • BasePath:当前图表的模板目录的命名空间路径(例如mychart/templates)。

上⾯这些值可用于任何顶级模板,要注意内置值始终以大写字母开头。这也符合 Go 的命名约定。当你创建自己的名字时,你可以自由地使用适合你的团队的惯例。

6、Values文件

上⾯的内置对象中有⼀个对象就是 Values,该对象提供对传入 chart 的值的访问,Values 对象的值有4个来源:

  • chart 包中的 values.yaml 文件;
  • 父 chart 包的 values.yaml 文件;
  • 通过 helm install 或者 helm upgrade 的 -f 或者 –values 参数传入的自定义的 yaml 文件;
  • 通过–set 参数传⼊的值chart 的 values.yaml 提供的值可以被用户提供的 values ⽂件覆盖,而该文件同样可以被 –set 提供的参数所覆盖;

这里我们来重新编辑 mychart/values.yaml 文件,将默认的值全部清空,添加⼀个新的数据(values.yaml);然后我们在上⾯的 templates/configmap.yaml 模板文件中就可以使用这个值了(configmap.yaml);可以看到最后⼀行我们是通过 {{ .Values.course }} 来获取 course 的值的。我们用 debug 模式来查看模板会被如何渲染:

img

可以看到 ConfigMap 中 course 的值被渲染成了 k8s,这是因为在默认的 values.yaml 文件中该数值为 k8s,同样的我们可以通过 –set 参数来轻松的覆盖 course 的值:

img

由于 –set 比默认 values.yaml 文件具有更⾼的优先级,所以我们的模板生成为 course: python。values 文件也可以包含更多结构化内容,例如,我们在 values.yaml 文件中可以创建 course 部分,然后在其中添加几个键,然后我们把模板稍微修改一下:

img

我们同样可以使用 debug 模式查看渲染结果:

img

可以看到模板中的参数已经被 values.yaml 文件中的值给替换掉了。虽然以这种方式构建数据是可以的,但还是建议保持 value 树浅⼀些,平⼀些,这样维护起来要简单⼀点。

好了,我们已经看到了helm几个内置对象的使用方法,并用它们将信息注入到了模板之中。后面我们来看看模板引擎中的其他用法,比如函数、管道、控制结构等等的用法。

推荐文章