目录
对象可以通过模板引擎传递到模板中,当然你的代码也可以传递对象。在《Helm3入门教程-5:Helm Chart 的编写》 中编写第一个 chart 的时候,我们引用了一个 Helm 的内置对象
.Relases.Name
,这个内置对象可以获取到安装 chart 时的 release 的名称并且注入到模板中进行替换。
.Relases.Name
最前面的点代表全局作用域。- 其实 Helm 中提供的内置对象非常容易理解,对象可以是一个简单的值,也可以包含其他的对象或者方法。例如前面提到的
.Relases.Name
中的 Name 就是 Release 对象下面的一个对象。而 Release 对象则是可以在模板中访问的高级对象之一。- Helm 内置的对象都是以大写字母开头, 这是符合Go的命名惯例。
- 当你创建自己的名称时,可以按照团队约定自由设置。 就像你在 Artifact Hub 中看到的很多chart,其团队选择使用首字母小写将本地名称与内置对象区分开,本教程中我们也遵循该惯例。
1、Helm3内置对象
1.1 Release 对象
在上一部分中,我们用{{ .Release.Name }}在模板中插入版本名称。Release是你可以在模板中访问的顶层对象之一。该对象是 helm 在全局作用域中最重要的全局对象之一,描述了版本发布自身的一些信息,它包含了以下对象:
对象名称 | 对象描述 |
---|---|
Release.Name | release名称 |
Release.Namespace | release 的命名空间(如果manifest没有覆盖的话) |
Release.IsUpgrade | 如果当前操作是升级或回滚的话,该值将被设置为true |
Release.IsInstall | 如果当前操作是安装的话,该值将被设置为true |
Release.Revision | 获取此次修订的版本号。安装时是1,每次升级或回滚时都会递增 |
Release.Service | 获取渲染当前模板的服务名称,Helm里的值始终是Helm |
1.2 Values 对象
Values对象是从values.yaml文件和用户提供的文件传进模板的,默认为空,是 helm 在全局作用域中最重要的全局对象之一,。使用 Value 对象可以获取到 value.yaml 文件中已定义的任何数值。Values 对象的值有4个来源:
- chart 包中的 values.yaml 文件;
- 父 chart 包的 values.yaml 文件;
- 通过 helm install 或者 helm upgrade 的 -f 或者 –values 参数传入的自定义的 yaml 文件(e.g. helm install -f myvals.yaml ./mychart);
- 通过
--set
传递的单个参数(e.g. helm install --set foo=bar ./mychart);
注意:以上列表有明确顺序:默认使用values.yaml,可以被父chart的values.yaml覆盖,继而被用户提供的values文件覆盖, 最后会被–set参数覆盖,优先级为values.yaml最低,–set参数最高。
Value 键值对 | 获取方式 |
---|---|
name: aaron | .Values.name |
info: name | aaron .Values.info.name |
1.3 Chart 对象
Chart 对象用于获取 chart.yaml 文件中的内容。 Chart.yaml里的所有数据都可以通过该对象访问。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0。在 Chart 指南 中列出了可获得属性。
对象名称 | 描述 |
---|---|
.Chart.Name | 获取 Chart 的名称 |
.Chart.Version | 获取 Chart 的版本 |
.Chart.apiVersion | 获取 Chart 的 API 版本 |
.Chart.description | 获取 Chart 的描述 |
.Chart.type | 获取 Chart 的类型 |
.Chart.keywords | 获取 Chart 的一组关键字 |
1.4 Capabilities 对象
Capabilities 对象提供了关于 Kubernetes 集群相关的信息。该对象有如下方法:
对象名称 | 描述 |
---|---|
Capabilities.APIVersions | 返回 Kubernetes 集群 API 版本信息列表 |
Capabilities.APIVersions.Has $version | 用于检测指定的版本或资源在 Kubernetes 集群中是否可用,例如 batch/v1 或 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编译器版本 |
1.5 Template 对象
Template 对象用于获取当前被执行的模板的信息,它包含如下两个对象:
对象名称 | 描述 |
---|---|
Template.Name | 用于获取当前模板的名称和路径 (e.g. mychart/templates/mytemplate.yaml) |
Template.BasePath | 用于获取当前模板的路径 (e.g. mychart/templates) |
1.6 Files 对象
Files 对象在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。
对象名称 | 描述 |
---|---|
Files.Get | 通过文件名获取文件的方法。 (.Files.Getconfig.ini) |
Files.GetBytes | 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用 |
Files.Glob | 用给定的shell glob模式匹配文件名返回文件列表的方法 |
Files.Lines | 逐行读取文件内容的方法。迭代文件中每一行时很有用 |
Files.AsSecrets | 使用Base 64编码字符串返回文件体的方法 |
Files.AsConfig | 使用YAML格式返回文件体的方法 |
2、Values对象详解
2.1 Values 对象使用方式
1)使用 values.yaml 中的值
values文件是普通的YAML文件。现在编辑mychart/values.yaml。通过 cat /dev/null > mychart/values.yaml
命令删除values.yaml中的默认内容,然后设置一个参数:
root@xnzysq20210118001:~# cat /dev/null > mychart/values.yaml
root@xnzysq20210118001:~# vim mychart/values.yaml
root@xnzysq20210118001:~# cat mychart/values.yaml
favoriteDrink: coffee
现在可以在模板中使用它,favoriteDrink是Values的一个属性,使用方式 {{ .Values.favoriteDrink }}
:
root@xnzysq20210118001:~# vim mychart/templates/configmap.yaml
root@xnzysq20210118001:~# cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name}}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favoriteDrink }}
让我们看一下是如何渲染的,命令 helm install geared-marsupi ./mychart --dry-run --debug
:
root@xnzysq20210118001:~# helm install geared-marsupi ./mychart --dry-run --debug
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart
NAME: geared-marsupi
LAST DEPLOYED: Sat Apr 16 18:54:55 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
favoriteDrink: coffee
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: geared-marsupi-configmap
data:
myvalue: "Hello World"
drink: coffee
可以看到最后一行,drink的值已被替换了。
2)使用 --set
覆盖默认值
由于默认的values.yaml文件中设置了favoriteDrink的值为coffee,则这个值显示在了模板中。可以在调用 helm install
时设置 --set
,很容易就能覆盖这个值。
- 由于–set比默认的values.yaml文件优先级更高,模板就生成了drink: slurm。
root@xnzysq20210118001:~# helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart
NAME: solid-vulture
LAST DEPLOYED: Sat Apr 16 18:58:31 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favoriteDrink: slurm
COMPUTED VALUES:
favoriteDrink: slurm
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: solid-vulture-configmap
data:
myvalue: "Hello World"
drink: slurm
3)values文件结构化的内容
values文件也可以包含更多结构化的内容。比如我们可以在values.yaml文件中创建一个favorite项,然后添加一些key:
favorite:
drink: coffee
food: pizza
现在需要稍微修改一些模板:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink }}
food: {{ .Values.favorite.food }}
虽然可以这样构造数据,但还是建议构建更加平坦的浅层树。以后想要给子chart赋值时,会看到如何使用树结构给value命名。
4)删除默认的key
如果需要从默认的value中删除key,可以将key设置为null,Helm将在覆盖的value合并时删除这个key。
- 比如,稳定的Drupal允许在配置自定义镜像时配置活动探针。默认值为httpget:
livenessProbe:
httpGet:
path: /user/login
port: http
initialDelaySeconds: 120
如果你想替换掉httpGet用exec重写活动探针,使用 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt]
, Helm会把默认的key和重写的key合并在一起,从而生成以下YAML:
livenessProbe:
httpGet:
path: /user/login
port: http
exec:
command:
- cat
- docroot/CHANGELOG.txt
initialDelaySeconds: 120
因为Kubernetes中不能声明多个活动探针句柄,从而会使应用发布会失败。为了解决这个问题,Helm可以指定通过设定null来删除 livenessProbe.httpGet
:
helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null
2.2 Values.yaml中的父子引用
1)父子引用1:使用export格式
若子chart在其values.yaml的root下有个叫做exports的key,则父chart就可以直接在requirements里通过指定需要import的key来将值import到自身的values.yaml里面。
# 父文件中import-values导入了data
# parent's requirements.yaml file
...
import-values:
- data
# 子文件中exports中设置了data
# child's values.yaml file
...
exports:
data:
myint: 99
helm会发现用户指定了要 import data 这个key,所以就去child的values.yaml里面寻找,发现了这个key有被export,于是就import了它的内容。
# 此时parent的values如下 (parent's values file)
...
myint: 99
需注意在parent的values中data这个key不会被import进来,只会import data的内容,如果希望把这个key也一起import进来可使用下面的方法。
2)父子引用2:使用child/parent格式
若想要获得不在名为"exports"这个key下面的值,就必须指定在child中要import的路径,以及在parent中的对应路径。
# parent's requirements.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
根据如上的这个requirements文件,helm将在child的chart中寻找default.data的值并导入到parent中的 myimports 这个路径下。假设parent和child初始的values如下:
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
那么导入之后,真正渲染出来的parent的values的值为:
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
可看出parent中的values把myint和mybool从subchart1里面import了进来。
3)父chart中修改子chart的values.yaml
假设子chart名字是hello, 要修改hello的values.yaml文件的root下的image的值,那么可以在父chart中通过一下方式进行修改。
父values.yaml内容:
# in parent's values.yaml
...
hello:
image: 'xxxx/test:hello'
这样hello(子chart)的values.yaml文件的image值就会被覆盖修改
3)利用global关键字
若父chart下所有子chart都有共同的变量A,要通过以上方式修改其值显示比较麻烦,这时可用关键字global。
子values.yaml内容:
# subchart1's values.yaml file
global:
affinityValue: "test"
父values.yaml内容:
# in parent's values.yaml
global:
affinityValue: "debug"
这样所有子chart的 global.affinityValue 都将被父values.yaml中的内容覆盖修改。
评论区