Helm-Chart模版

发布于 2021-09-29  444 次阅读


先创建一个名为mychart的chart,然后会在chart中创建一些模板。

$ helm create mychart
Creating mychart

如果你看看 mychart/templates/ 目录,会注意到一些文件已经存在了:

  • NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。
  • deployment.yaml: 创建Kubernetes 工作负载的基本清单
  • service.yaml: 为你的工作负载创建一个 service终端基本清单。
  • _helpers.tpl: 放置可以通过chart复用的模板辅助对象

然后我们要做的是... 把它们全部删掉! 这样我们就可以从头开始学习我们的教程。我们在开始时会创造自己的NOTES.txt_helpers.tpl

$ rm -rf mychart/templates/*

编制生产环境级别的chart时,有这些chart的基础版本会很有用。因此在日常编写中,你可能不想删除它们。

添加一个简单的模版调用

configmap.yaml

模板命令要括在 {{ 和 }} 之间。

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

模板命令 {{ .Release.Name }} 将发布名称注入了模板。值作为一个 命名空间对象 传给了模板,用点(.)分隔每个命名空间的元素。

Release前面的点表示从作用域最顶层的命名空间开始(稍后会谈作用域)。这样.Release.Name就可解读为“通顶层命名空间开始查找 Release对象,然后在其中找Name对象”。

Release是一个Helm的内置对象。

$ helm install clunky-serval ./test_chart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov  1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None

可以运行helm get manifest clunky-serval查看生成的完整的YAML。

注意在kubernetes内的配置映射名称是 clunky-serval-configmap,而不是之前的 mychart-configmap

内置对象

对象从模板引擎传递到模板中。 你的代码也可以传递对象。(我们在使用withrange语句时,会看到示例)。甚至于有几种方式可以在你的模板中创建新对象,比如说我们后面会看到的tuple功能。

对象可以是简单的且仅有一个值。或者可以包含其他对象或方法。比如,Release对象包含一些对象(比如:Release.Name)和Files对象有一组方法。

Release: 该对象描述了版本发布本身。包含了以下对象:

Release.Name: release名称
Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
Release.IsUpgrade: 如果当前操作是升级或回滚的话,需要将该值设置为true
Release.IsInstall: 如果当前操作是安装的话,需要将该值设置为true
Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
Release.Service: 该service用来渲染当前模板。Helm里一般是Helm

Values: Values是从values.yaml文件和用户提供的文件传进模板的。Values默认为空

Chart: Chart.yaml文件内容。 Chart.yaml里的任意数据在这里都可以可访问的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0
Chart 指南 中列出了可用字段

Files: 在chart中提供访问所有的非特殊文件。当你不能使用它访问模板时,你可以访问其他文件。 请查看这个 文件访问部分了解更多信息
Files.Get 通过文件名获取文件的方法。 (.Files.Getconfig.ini)
Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
Files.AsConfig 使用YAML格式返回文件体的方法

Capabilities: 提供关于Kubernetes集群支持功能的信息
Capabilities.APIVersions 是一个版本集合
Capabilities.APIVersions.Has $version 说明集群中的版本 (e.g., batch/v1) 或是资源 (e.g., apps/v1/Deployment) 是否可用
Capabilities.KubeVersion 和 Capabilities.KubeVersion.Version 是Kubernetes的版本号
Capabilities.KubeVersion.Major Kubernetes的主版本
Capabilities.KubeVersion.Minor Kubernetes的次版本
Capabilities.HelmVersion 包含Helm版本详细信息的对象,和 helm version 的输出一致
Capabilities.HelmVersion.Version 是当前Helm版本的语义格式
Capabilities.HelmVersion.GitCommit Helm的git sha1值
Capabilities.HelmVersion.GitTreeState 是Helm git树的状态
Capabilities.HelmVersion.GoVersion 是使用的Go编译器版本

Template: 包含了已经被执行的当前模板信息
Template.Name: 当前模板的命名空间文件路径 (e.g. mychart/templates/mytemplate.yaml)
Template.BasePath: 当前chart模板目录的路径 (e.g. mychart/templates)

内置的值都是以大写字母开始。 这是符合Go的命名惯例。当你创建自己的名称时,可以按照团队约定自由设置。 就像很多你在 Artifact Hub 中看到的chart,其团队选择使用首字母小写将本地名称与内置对象区分开,本指南中我们遵循该惯例。

Values 文件

参考文件:Values文件

在上一部分我们了解了Helm模板提供的内置对象。其中一个是Values。该对象提供了对传递到chart的值的访问方法, 其内容源包括了多个位置:

  • chart中的values.yaml文件
  • 如果是子chart,就是父chart中的values.yaml文件
  • 使用-f参数(helm install -f myvals.yaml ./mychart)传递到 helm install 或 helm upgrade的values文件
  • 使用--set (比如helm install --set foo=bar ./mychart)传递的单个参数

以上列表有明确顺序:默认使用values.yaml,可以被父chart的values.yaml覆盖,继而被用户提供values文件覆盖, 最后会被--set参数覆盖。

values文件是普通的YAML文件。现在编辑mychart/values.yaml然后编辑配置映射ConfigMap模板。