Helm3模板-其他注意事项

前面我们学习了命名模板的使用,命名模板是 Helm 模板中非常重要的⼀个功能,在实际开发Helm Chart 包的时候非常有用,到这里我们基本上就把 Helm 模板中经常使用到的⼀些知识点介绍完了。但是仍然还是有⼀些在开发中值得我们注意的⼀些知识点,比如 NOTES.txt ⽂件的使用、子 Chart 的使用、全局值的使用,今天我们就来了解一下这些知识点。

1、NOTES.txt 文件

我们在前⾯使用 helm install 命令的时候,Helm 都会为我们打印出⼀大堆介绍信息,这样当别的用户在使用 chart 包的时候就可以根据这些注释信息快速了解 chart 包的使用方法,这些信息就是编写在 NOTES.txt 文件之中的,这个文件是纯文本的,但是它和其他模板⼀样,具有所有可用的普通模板函数和对象。现在我们在前⾯示例的 templates 目录下面创建⼀个 NOTES.txt 文件:

Thank you for installing {{ .Chart.Name }}.

Your release is named {{ .Release.Name }}.

To learn more about the release, try:

  helm status {{ .Release.Name }}helmstatus.Release.Name helm get all {{ .Release.Name }}

img

我们可以看到 NOTES.txt 文件中也使用 Chart 和 Release 对象,我们在 mychart 包根目录下⾯执行安装命令查看是否能够得到上⾯的注释信息:

helm install rude-cardinal ./mychart

img

我们可以看到上面已经成功的安装了。如果我们去执行 debug 命令来调试的话也是没有任何问题的,是可以正常渲染的。这是为什么呢?在Helm2中这样操作是不可以的、在Helm3中、系统自动为我们做了修正。

注:在Helm2中在 debug 调试阶段只是检验模板是否可以正常渲染,并没有去检查对应的 kubernetes 资源对象对 yaml 文件的格式要求,所以说 debug 测试通过,并不代表 chart 就真正的是可用状态,比如这里是⼀个ConfigMap 的资源对象,ConfigMap 对 data 区域的内容是有严格要求的,再比如这里出现了下面这样的内容:

web: true
courselist:
- 0: "K8s"
- 1: "Python"
- 2: "Search"
- 3: "Golang"

这的确是⼀个合法的 yaml 文件格式,但是对 ConfigMap 来说他就不合法了。那是因为在Helm2中我们需要把 true 变成字符串,下⾯的字典数组变成⼀个多行的字符串,这样就是⼀个合法的 ConfigMap了。但是在Helm3中我们不需要这么做、因为系统已经自动为我们做了修正。

注:使用NOTES.txt这种方法是向用户提供有关如何使用其新安装的图表的详细信息的好方法。NOTES.txt 强烈建议创建文件,尽管不是必需的。

2、子 Chart 包

我们到⽬前为止都只用了⼀个 chart,但是 chart 也可以有子 chart 的依赖关系,它们也有自己的值和模板,在学习子 chart 之前,我们需要了解几点关于子 chart 的说明:

  • 子 chart 是独立的,所以子 chart 不能明确依赖于其父 chart
  • 子 chart 无法访问其父 chart 的值
  • 父 chart 可以覆盖子 chart 的值
  • Helm 中有全局值的概念,可以被所有的 chart 访问

创建子 Chart

现在我们就来创建⼀个子 chart,还记得我们在创建 mychart 包的时候,在根目录下面有⼀个空文件夹 charts 目录吗?这就是子 chart 所在的⽬录,在该目录下⾯添加⼀个新的 chart:

img

同样的,我们将子 chart 模板中的文件全部删除了,接下来,我们为子 chart 创建⼀个简单的模板和values 文件了。

img

我们上⾯已经提到过每个子 chart 都是独立的 chart,所以我们可以单独给 mysubchart 进行测试:

img

我们可以看到正常渲染出了结果。

3、值覆盖

现在 mysubchart 这个子 chart 就属于 mychart 这个父 chart 了,由于 mychart 是父级,所以我们可以在 mychart 的 values.yaml 文件中直接配置子 chart 中的值,比如我们可以在 mychart/values.yaml 文件中添加上子 chart 的值:

img

注:最后两行,mysubchart 部分内的任何指令都会传递到 mysubchart 这个子 chart 中去的,现在我们在 mychart 根目录中执行调试命令,可以查看到子 chart 也被⼀起渲染了:

img

可以看到子 chart 中的值已经被顶层的值给覆盖了。但是在某些场景下⾯我们还是希望某些值在所有模板中都可以使用,这就需要用到全局 chart 值了。

4、全局值

全局值可以从任何 chart 或者子 chart 中进行访问使用,values 对象中有⼀个保留的属性是 Values.global ,就可以被用来设置全局值,比如我们在父 chart 的 values.yaml 文件中添加⼀个全局值:

img

我们在 values.yaml 文件中添加了⼀个 global 的属性,这样的话无论在父 chart 中还是在子 chart 中都可以通过 {{ .Values.global.allin }} 来访问这个全局值了。比如我们在mychart/templates/configmap.yaml 和 mychart/charts/mysubchart/templates/configmap.yaml 文件的data 区域下⾯都添加上如下内容:

data:
  allin: {{ .Values.global.allin }}

现在我们在 mychart 根目录下⾯执行 debug 调试模式:

img

img

我们可以看到两个模板中都输出了 allin: helm 这样的值,全局变量对于传递这样的信息非常有用,不过也要注意我们不能滥用全局值。另外值得注意的是我们在学习命名模板的时候就提到过父 chart 和子 chart 可以共享模板。任何 chart中的任何定义块都可用于其他 chart,所以我们在给命名模板定义名称的时候添加了 chart 名称这样的前缀,避免冲突。

推荐文章