• subchats和全局values
    • 创建subcharts
    • 将value和模板添加到subcharts
    • 从父chart中覆盖value
    • 全局chart values
    • 与subcharts共享模板
    • 避免使用block

    subchats和全局values

    到目前为止,我们只用一个chart工作。 但是chart可以有称为subcharts的依赖关系,它们也有自己的values和模板。 在本节中,我们将创建一个subcharts并查看我们可以从模板中访问值的不同方式。

    在我们深入了解代码之前,需要了解一些有关subcharts的重要细节。

    1. Subcharts被认为是“独立的”,这意味着subcharts不能明确依赖于其父图。
    2. 因此,subcharts无法访问其父项的values。
    3. 父charts可以覆盖subcharts的values。
    4. helm有全局values的概念,可以被所有charts访问。

    当我们在本节中通过示例时,其中许多概念将变得更加清晰。

    创建subcharts

    对于这些练习,我们将从本指南开始时创建的mychart/chart开始,并在其中添加一个新的charts。

    1. $ cd mychart/charts
    2. $ helm create mysubchart
    3. Creating mysubchart
    4. $ rm -rf mysubchart/templates/*.*

    注意,和以前一样,我们删除了所有的基本模板,以便我们可以从头开始。 在本指南中,我们专注于模板如何工作,而不是管理依赖关系。 但chart指南有更多关于subcharts工作的信息。

    将value和模板添加到subcharts

    接下来,我们为mysubchart图表创建一个简单的模板和values文件。 在mychart/charts/mysubchart中应该已经有了一个values.yaml。 我们将这样设置:

    1. dessert: cake

    接下来,我们将在mychart/charts/mysubchart/templates/configmap.yaml目录中创建一个新的ConfigMap模板:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-cfgmap2
    5. data:
    6. dessert: {{ .Values.dessert }}

    由于每个subcharts都是独立的chart,因此我们可以自行测试mysubchart:

    1. $ helm install --dry-run --debug mychart/charts/mysubchart
    2. SERVER: "localhost:44134"
    3. CHART PATH: /Users/mattbutcher/Code/Go/src/k8s.io/helm/_scratch/mychart/charts/mysubchart
    4. NAME: newbie-elk
    5. TARGET NAMESPACE: default
    6. CHART: mysubchart 0.1.0
    7. MANIFEST:
    8. ---
    9. # Source: mysubchart/templates/configmap.yaml
    10. apiVersion: v1
    11. kind: ConfigMap
    12. metadata:
    13. name: newbie-elk-cfgmap2
    14. data:
    15. dessert: cake

    从父chart中覆盖value

    我们原来的chart mychart现在是mysubchart的父chart[。 这种关系完全基于mysubchart在mychart/charts中的事实。

    由于mychart是父级,我们可以在mychart中指定配置,并将该配置推入mysubchart。 例如,我们可以像这样修改mychart/values.yaml:

    1. favorite:
    2. drink: coffee
    3. food: pizza
    4. pizzaToppings:
    5. - mushrooms
    6. - cheese
    7. - peppers
    8. - onions
    9. mysubchart:
    10. dessert: ice cream

    请注意最后两行。 mysubchart部分内的任何指令都将被发送到mysubchart chart。 因此,如果我们运行helm install —dry-run —debug mychart,我们将看到的其中一个是mysubchart ConfigMap:

    1. # Source: mychart/charts/mysubchart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: unhinged-bee-cfgmap2
    6. data:
    7. dessert: ice cream

    顶层的value现在已经覆盖了subchart的价值。

    这里有一个重要的细节需要注意。 我们没有将mychart/charts/mysubchart/templates/configmap.yaml的模板更改为指向.Values.mysubchart.dessert。 从该模板的角度来看,该值仍位于.Values.dessert。 随着模板引擎一起传递值,它会设置范围。 因此,对于mysubchart模板,只有专门用于mysubchart的值将在.Values中可用。

    但有时候,您确实希望某些值可用于所有模板。 这是使用全局chart value完成的。

    全局chart values

    全局values是可以从任何chart或subchart以完全相同的名称访问的values。 全局需要明确声明。 您不能像现有全局一样使用非全局。

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

    1. favorite:
    2. drink: coffee
    3. food: pizza
    4. pizzaToppings:
    5. - mushrooms
    6. - cheese
    7. - peppers
    8. - onions
    9. mysubchart:
    10. dessert: ice cream
    11. global:
    12. salad: caesar

    由于全局变量的工作方式,mychart/templates/configmap.yaml和mysubchart/templates/configmap.yaml应该能够以{{.Values.global.salad}}的形式访问该值。

    mychart/templates/configmap.yaml:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. data:
    6. salad: {{ .Values.global.salad }}

    mysubchart/templates/configmap.yaml:

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-cfgmap2
    5. data:
    6. dessert: {{ .Values.dessert }}
    7. salad: {{ .Values.global.salad }}

    现在,如果我们运行dry run install,我们会在两个输出中看到相同的值:

    1. # Source: mychart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: silly-snake-configmap
    6. data:
    7. salad: caesar
    8. ---
    9. # Source: mychart/charts/mysubchart/templates/configmap.yaml
    10. apiVersion: v1
    11. kind: ConfigMap
    12. metadata:
    13. name: silly-snake-cfgmap2
    14. data:
    15. dessert: ice cream
    16. salad: caesar

    全局变量对于传递这样的信息非常有用,但它确实需要一些计划来确保将正确的模板配置为使用全局变量。

    与subcharts共享模板

    父chart和subcharts可以共享模板。 任何chart中的任何定义块都可用于其他chart。

    例如,我们可以像这样定义一个简单的模板:

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

    回想一下模板上的标签是如何全局共享的。 因此,可以从任何其他chart中包含标签chart。

    虽然chart开发人员可以在包含和模板之间进行选择,但使用include的一个优点是可以动态引用模板:

    1. {{ include $mytemplate }}

    以上将取消引用$mytemplate。 相比之下,模板函数只接受字符串文字。

    避免使用block

    Go模板语言提供了一个block关键字,它允许开发人员提供一个默认的实现,这个实现稍后会被覆盖。 在Helm Chart中,块不是重写的最佳工具,因为如果提供了同一个块的多个实现,那么所选的那个是不可预知的。

    建议是改为使用include。