从这里开始吧

    接下来,让我们简单看一下Helm chart。

    Charts 指南所述, Helm chart的结构如下:

    templates/ 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes。

    values.yaml 文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm installhelm upgrade时被覆盖。

    Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。charts/目录 可以 包含其他的chart(称之为 子chart)。 指南稍后我们会看到当涉及模板渲染时这些是如何工作的。

    在本指南中我们会创建一个名为mychart的chart,然后会在chart中创建一些模板。

    1. $ helm create mychart
    2. Creating mychart

    如果你看看 mychart/templates/ 目录,会注意到一些文件已经存在了:

    • NOTES.txt: chart的”帮助文本”。这会在你的用户执行helm install时展示给他们。
    • deployment.yaml: 创建Kubernetes 的基本清单
    • service.yaml: 为你的工作负载创建一个 service终端基本清单。
    • _helpers.tpl: 放置可以通过chart复用的模板辅助对象

    然后我们要做的是… 把它们全部删掉! 这样我们就可以从头开始学习我们的教程。我们在开始时会创造自己的NOTES.txt_helpers.tpl

    1. $ rm -rf mychart/templates/*

    编制生产环境级别的chart时,有这些chart的基础版本会很有用。因此在日常编写中,你可能不想删除它们。

    第一个创建的模板是ConfigMap。Kubernetes中,配置映射只是用于存储配置数据的对象。其他组件,比如pod,可以访问配置映射中的数据。

    让我们以创建一个名为 mychart/templates/configmap.yaml的文件开始:

    提示: 模板名称不遵循严格的命名模式。但是建议以.yaml作为YAML文件的后缀,以.tpl作为helper文件的后缀。

    上述YAML文件是一个简单的配置映射,构成了最小的必需字段。因为文件在 mychart/templates/目录中,它会通过模板引擎传递。

    像这样将一个普通YAML文件放在mychart/templates/目录中是没问题的。当Helm读取这个模板时会按照原样传递给Kubernetes。

    有了这个简单的模板,现在有一个可安装的chart了。现在安装如下:

    1. $ helm install full-coral ./mychart
    2. NAME: full-coral
    3. LAST DEPLOYED: Tue Nov 1 17:36:01 2016
    4. NAMESPACE: default
    5. STATUS: DEPLOYED
    6. REVISION: 1
    7. TEST SUITE: None

    我们可以使用Helm检索版本并查看实际加载的模板。

    1. $ helm get manifest full-coral
    2. ---
    3. # Source: mychart/templates/configmap.yaml
    4. apiVersion: v1
    5. kind: ConfigMap
    6. metadata:
    7. name: mychart-configmap

    helm get manifest 命令后跟一个发布名称(full-coral)然后打印出了所有已经上传到server的Kubernetes资源。 每个文件以---开头表示YAML文件的开头,然后是自动生成的注释行,表示哪个模板文件生成了这个YAML文档。

    从这个地方开始,我们看到的YAML数据确实是configmap.yaml文件中的内容。

    现在卸载发布: helm uninstall full-coral

    添加一个简单的模板调用

    name:硬编码到一个资源中不是很好的方式。名称应该是唯一的。因此我们可能希望通过插入发布名称来生成名称字段。

    对应改变一下configmap.yaml

    大的变化是name:字段的值,现在是{{ .Release.Name }}-configmap

    模板命令 {{ .Release.Name }} 将发布名称注入了模板。值作为一个 命名空间对象 传给了模板,用点(.)分隔每个命名空间的元素。

    Release前面的点表示从作用域最顶层的命名空间开始(稍后会谈作用域)。这样.Release.Name就可解读为“通顶层命名空间开始查找 Release对象,然后在其中找Name对象”。

    Release是一个Helm的内置对象。稍后会更深入地讨论。但现在足够说明它可以显示从库中赋值的发布名称。

    现在安装资源,可以立即看到模板命令的结果:

    1. $ helm install clunky-serval ./mychart
    2. NAME: clunky-serval
    3. LAST DEPLOYED: Tue Nov 1 17:45:37 2016
    4. NAMESPACE: default
    5. STATUS: DEPLOYED
    6. REVISION: 1
    7. TEST SUITE: None

    可以运行helm get manifest clunky-serval查看生成的完整的YAML。

    注意在kubernetes内的配置映射名称是 clunky-serval-configmap,而不是之前的 mychart-configmap

    由此我们已经看到了最基本的模板:YAML文件有嵌入在{{}}之间的模板命令。下一部分,会深入了解模板, 但在这之前,有个快捷的技巧可以加快模板的构建速度:当你想测试模板渲染的内容但又不想安装任何实际应用时,可以使用helm install --debug --dry-run goodly-guppy ./mychart。这样不会安装应用(chart)到你的kubenetes集群中,只会渲染模板内容到控制台(用于测试)。渲染后的模板如下:

    1. $ helm install --debug --dry-run goodly-guppy ./mychart
    2. install.go:149: [debug] Original chart version: ""
    3. install.go:166: [debug] CHART PATH: /Users/ninja/mychart
    4. NAME: goodly-guppy
    5. LAST DEPLOYED: Thu Dec 26 17:24:13 2019
    6. NAMESPACE: default
    7. STATUS: pending-install
    8. REVISION: 1
    9. TEST SUITE: None
    10. {}
    11. COMPUTED VALUES:
    12. affinity: {}
    13. fullnameOverride: ""
    14. image:
    15. pullPolicy: IfNotPresent
    16. repository: nginx
    17. imagePullSecrets: []
    18. ingress:
    19. enabled: false
    20. hosts:
    21. - host: chart-example.local
    22. paths: []
    23. tls: []
    24. nameOverride: ""
    25. nodeSelector: {}
    26. podSecurityContext: {}
    27. replicaCount: 1
    28. resources: {}
    29. securityContext: {}
    30. service:
    31. port: 80
    32. type: ClusterIP
    33. serviceAccount:
    34. create: true
    35. name: null
    36. tolerations: []
    37. HOOKS:
    38. MANIFEST:
    39. ---
    40. # Source: mychart/templates/configmap.yaml
    41. apiVersion: v1
    42. kind: ConfigMap
    43. metadata:
    44. name: goodly-guppy-configmap
    45. data:

    Chart模板指南中,我们以这里定义的chart基本模板为例详细讨论Helm模板语言。 然后开始讨论内置对象。