值文件

在上一节中,我们介绍了 Helm 模板提供的内置对象。其中一个内置对象是 Values。此对象提供对传递到图表的值的访问。其内容来自多个来源

  • 图表中的 values.yaml 文件
  • 如果这是一个子图表,则为父图表的 values.yaml 文件
  • 值文件使用 -f 标志传递到 helm installhelm upgradehelm 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

到目前为止,我们已经看到了几个内置对象,并使用它们将信息注入模板。现在我们将介绍模板引擎的另一个方面:函数和管道。