值文件
在上一节中,我们介绍了 Helm 模板提供的内置对象。其中一个内置对象是 Values
。此对象提供对传递到图表的值的访问。其内容来自多个来源
- 图表中的
values.yaml
文件 - 如果这是一个子图表,则为父图表的
values.yaml
文件 - 值文件使用
-f
标志传递到helm install
或helm upgrade
(helm install -f myvals.yaml ./mychart
) - 单个参数使用
--set
传递(例如helm install --set foo=bar ./mychart
)
上面的列表按特异性排序:values.yaml
是默认值,可以被父图表的 values.yaml
覆盖,而父图表的 values.yaml
可以被用户提供的值文件覆盖,用户提供的值文件又可以被 --set
参数覆盖。
值文件是纯 YAML 文件。让我们编辑 mychart/values.yaml
,然后编辑我们的 ConfigMap 模板。
删除 values.yaml
中的默认值,我们只设置一个参数
favoriteDrink: coffee
现在我们可以在模板中使用它
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favoriteDrink }}
注意,在最后一行,我们访问 Values
的属性 favoriteDrink
:{{ .Values.favoriteDrink }}
。
让我们看看它如何呈现。
$ helm install geared-marsupi ./mychart --dry-run --debug
install.go:158: [debug] Original chart version: ""
install.go:175: [debug] CHART PATH: /home/bagratte/src/playground/mychart
NAME: geared-marsupi
LAST DEPLOYED: Wed Feb 19 23:21:13 2020
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
因为 favoriteDrink
在默认的 values.yaml
文件中设置为 coffee
,所以模板中显示的值就是 coffee
。我们可以通过在调用 helm install
时添加 --set
标志来轻松覆盖它
$ helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm
install.go:158: [debug] Original chart version: ""
install.go:175: [debug] CHART PATH: /home/bagratte/src/playground/mychart
NAME: solid-vulture
LAST DEPLOYED: Wed Feb 19 23:25:54 2020
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
由于 --set
的优先级高于默认的 values.yaml
文件,因此我们的模板会生成 drink: slurm
。
值文件也可以包含更多结构化内容。例如,我们可以在 values.yaml
文件中创建一个 favorite
部分,然后在那里添加几个键
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 }}
虽然可以通过这种方式构建数据,但建议您保持值树的深度较浅,尽量扁平化。当我们介绍将值分配给子图表时,我们将看到如何使用树结构命名值。
删除默认键
如果您需要从默认值中删除键,您可以将该键的值覆盖为 null
,在这种情况下,Helm 会从覆盖的值合并中删除该键。
例如,stable Drupal 图表允许配置存活性探测,以防您配置自定义镜像。以下是默认值
livenessProbe:
httpGet:
path: /user/login
port: http
initialDelaySeconds: 120
如果您尝试使用 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt]
将存活性探测处理程序覆盖为 exec
而不是 httpGet
,Helm 将合并默认键和覆盖键,生成以下 YAML
livenessProbe:
httpGet:
path: /user/login
port: http
exec:
command:
- cat
- docroot/CHANGELOG.txt
initialDelaySeconds: 120
但是,Kubernetes 随后会失败,因为您不能声明多个存活性探测处理程序。为了克服这个问题,您可以通过将其设置为 null 来指示 Helm 删除 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
到目前为止,我们已经看到了几个内置对象,并使用它们将信息注入模板。现在我们将介绍模板引擎的另一个方面:函数和管道。