Helm最核心的就是模板,即模板化的Kubernetes清单文件,模板经过渲染后会被提交到Kubernetes中,本质上就是Go语言的template模板,模板文件位于template/目录中。
将Kubernetes清单文件中可能经常变动的字段,通过指定一个变量,在安装的过程中该变量将被值value动态替换掉,这个过程就是模板的渲染。
变量的值定义在values.yaml文件中,该文件中定义了变量的缺省值,但可以在helm install命令中配置新的值来覆盖缺省值。
对象从模板引擎传递到模板中。如使用{ {.Release.Name}}将Release的名称插入到模板中。Release是可以在模板中访问的顶级对象之一。
对象可以很简单,只有一个值。或者他们可以包含其他对象或函数。例如,Release对象包含多个对象(如Release.Name),并且Files对象具有一些函数。
Helm内置了多个顶级对象:
- Release:这个对象描述了Release本身,它里面有几个对象:
- Release.Name:Release名称。
- Release.Namespace:Release的Namespace。
- Release.IsUpgrade:如果当前操作是升级或回滚,则将其设置为true。
- Release.IsInstall:如果当前操作是安装,则设置为true。
- Release.Revision:此Release 的修订版本号。
- Release.Service:渲染此模板的服务,Helm中总是“Helm”。
- Values:从values.yaml文件和用户提供的文件传入模板的值。默认情况下,Values是空的。
- Chart:Chart.yaml文件的内容。
- Files:提供对Chart中所有非特殊文件的访问。虽然您不能使用它来访问模板,但是可以使用它来访问Chart图表中的其他文件。
- Files.Get是用于按名称获取文件。
- 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是Kubernetes版本。
- Capabilities.KubeVersion.Version是Kubernetes版本。
- Capabilities.KubeVersion.Major是Kubernetes的主要版本。
- Capabilities.KubeVersion.Minor是Kubernetes的次要版本。
- Template:包含有关正在执行的当前模板的信息。
- Name:当前模板的命名空间文件路径(例如mychart/templates/mytemplate.yaml)
- BasePath:当前Chart的模板目录的命名空间路径(例如mychart/templates)。
这些值可用于任何顶级模板。内置值始终以大写字母开头,这符合Go的命名约定。
四个内置对象之一的Values,该对象提供对传入Chart的值的访问。其内容来自四个来源:
- Chart中的values.yaml文件。
- 如果这是一个子Chart,来自父Chart的values.yaml文件。
- values文件通过helm install或helm upgrade的-f标志传入文件(helm install -f myvals.yaml ./mychart)。
- 通过–set(helm install --set foo=bar ./mychart)。
上面的列表按照特定的顺序排列:values.yaml是默认级别,父级Chart的可以覆盖该默认级别,而该values.yaml又可以被用户提供的values文件覆盖,而该文件又可以被–set参数覆盖。
我们先创建一个Chart。
helm create mychart
Creating mychart
我们将默认的values.yaml文件内容删除,并设置一个参数:
vi mychart/values.yaml
favoriteDrink: coffee
为了简单起见,删除templates/目录中所有文件,并创建configmap.yaml模板文件。
模板指令放在{ {和}}块之间,模板指令{ { .Release.Name }}表示将Release名称注入模板。可以将传递到模板中的值视为命名空间对象,其中句号".“用来分割每个命名空间元素,前导”."表示当前的作用域,此处表示顶级命名空间。{ { .Release.Name }}表示从顶级命名空间开始,找到Release对象,然后在其中查找名为Name的对象。{ { .Values.favoriteDrink }}表示从顶级命名空间开始,找到Values对象,然后在其中查找名为favoriteDrink的对象。
rm -rf mychart/templates/*
vi mychart/templates/configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {
{ .Values.favoriteDrink }}
我们看看渲染的效果。
helm template myrelease mychart
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myrelease-configmap
data:
myvalue: "Hello World"
drink: coffee
参数favoriteDrink在默认values.yaml文件中设置为coffee,但可以在helm template命令中通过加一个–set添标志来覆盖,因为–set的优先级更高。
helm template myrelease mychart --set favoriteDrink=tea
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myrelease-configmap
data:
myvalue: "Hello World"
drink: tea
values文件也可以包含更多结构化内容。在values.yaml文件中可以创