跳转至

Subcharts 和 Global Values

到现在为止,我们从单一模板,到多个模板文件,但是都仅仅是处理的一个 chart 包,但是 charts 可能具有一些依赖项,我们称为 subcharts(子 chart),接下来我们将创建一个子 chart。

同样在深入了解之前,我们需要了解下子 chart 相关的一些信息。

  • 子 chart 是独立的,这意味着子 chart 不能显示依赖其父 chart
  • 所以子 chart 无法访问其父级的值
  • 父 chart 可以覆盖子 chart 的值
  • Helm 中有可以被所有 charts 访问的全局值的概念

创建子chart

同样还是在之前操作的 mychart/ 这个 chart 包中,我们来尝试添加一些新的子 chart:

$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*.*

和前面一样,我们删除了所有的基本模板,这样我们可以从头开始。

添加 values 和 模板

接下来我们为 mysubchart 这个子 chart 创建一个简单的模板和 values 值文件,mychart/charts/mysubchart 中已经有一个 values.yaml 文件了,在文件中添加下面的 values:

dessert: cake

下面我们再创建一个新的 ConfigMap 模板 mychart/charts/mysubchart/templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfgmap2
data:
  dessert: {{ .Values.dessert }}

因为每个子 chart 都是独立的 chart,所以我们可以单独测试 mysubchart

helm install --generate-name --dry-run --debug mychart/charts/mysubchart
install.go:148: [debug] Original chart version: ""
install.go:165: [debug] CHART PATH: /Users/ych/devs/workspace/yidianzhishi/course/k8strain/content/helm/manifests/mychart/charts/mysubchart

NAME: mysubchart-1576050755
LAST DEPLOYED: Wed Dec 11 15:52:36 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
dessert: cake

HOOKS:
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysubchart-1576050755-cfgmap2
data:
  dessert: cake

从父 chart 覆盖 values

我们原来的 chart - mychart 现在是 mysubchart 的父级 chart 了。由于 mychart 是父级,所以我们可以在 mychart 中指定配置,并将该配置发送到 mysubchart 中去,比如,我们可以这样修改 mychart/values.yaml

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

mysubchart:
  dessert: ice cream

最后两行,mysubchart 部分中的所有指令都回被发送到 mysubchart 子 chart 中,所以,如果我们现在渲染模板,我们可以看到 mysubchart 的 ConfigMap 会被渲染成如下的内容:

# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-1576051914-cfgmap2
data:
  dessert: ice cream

我们可以看到顶层的 values 值覆盖了子 chart 中的值。这里有一个细节需要注意,我们没有将 mychart/charts/mysubchart/templates/configmap.yaml 模板更改为指向 .Values.mysubchart.dessert,因为从该模板的绝度来看,该值仍然位于 .Values.dessert,当模板引擎传递 values 值的时候,它会设置这个作用域,所以,对于 mysubchart 模板,.Values 中仅仅提供用于该子 chart 的值。

但是有时候如果我们确实希望某些值可以用于所有模板,这个时候就可以使用全局 chart values 值来完成了。

全局值

全局值是可以从任何 chart 或子 chart 中都可以访问的值,全局值需要显示的声明,不能将现有的非全局对象当作全局对象使用。

Values 数据类型具有一个名为 Values.global 的保留部分,可以在其中设置全局值,我们在 mychart/values.yaml 文件中添加一个全局值:

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

mysubchart:
  dessert: ice cream

global:
  salad: caesar

由于全局值的原因,在 mychart/templates/configmap.yamlmysubchart/templates/configmap.yaml 下面都应该可以以 {{ .Values.global.salad }} 的形式来访问这个值。

mychart/templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  salad: {{ .Values.global.salad }}

mysubchart/templates/configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfgmap2
data:
  dessert: {{ .Values.dessert }}
  salad: {{ .Values.global.salad }}

然后我们渲染这个模板,可以得到如下所示的内容:

---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-1576053485-cfgmap2
data:
  dessert: ice cream
  salad: caesar
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-1576053485-configmap
data:
  salad: caesar

全局值对于传递这样的数据比较有用。

共享模板

父级 chart 和子 chart 可以共享模板,任何 chart 中已定义的块都可以用于其他 chart。比如,我们可以定义一个简单的模板,如下所示:

{{- define "labels" }}from: mychart{{ end }}

前面我们提到过可以使用在模板中使用 includetemplate,但是使用 include 的一个优点是可以动态引入模板的内容:

{{ include $mytemplate }}