入门

在本指南部分中,我们将创建一个图表,然后添加第一个模板。我们在本指南中创建的图表将在本指南的其余部分中使用。

为了开始,让我们简要地看一下舵手图表。

图表

图表指南 所述,舵手图表结构如下

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...

templates/ 目录用于模板文件。当舵手评估图表时,它将通过模板渲染引擎发送 templates/ 目录中的所有文件。然后,它会收集这些模板的结果并将其发送到 Kubernetes。

values.yaml 文件对于模板也很重要。此文件包含图表的默认值。这些值可以在 helm installhelm upgrade 期间被用户覆盖。

Chart.yaml 文件包含图表描述。你可以在模板内部访问它。

charts/ 目录可能包含其他图表(我们称之为子图表)。在本指南的后面,我们将看到在模板渲染方面它们是如何工作的。

入门图表

在本指南中,我们将创建一个名为 mychart 的简单图表,然后在图表中创建一些模板。

$ helm create mychart
Creating mychart

快速了解 mychart/templates/

如果你看一下 mychart/templates/ 目录,你会注意到那里已经存在几个文件。

  • NOTES.txt:你的图表的“帮助文本”。当用户运行 helm install 时,它将显示给他们。
  • deployment.yaml:用于创建 Kubernetes 部署 的基本清单
  • service.yaml:用于为你的部署创建 服务端点 的基本清单
  • _helpers.tpl:一个放置可以在整个图表中重复使用模板帮助程序的地方

我们将要做的就是...全部删除它们! 这样我们就可以从头开始学习我们的教程。我们实际上将在学习过程中创建自己的 NOTES.txt_helpers.tpl

$ rm -rf mychart/templates/*

当你编写生产级图表时,拥有这些图表的 基本版本非常有用。因此,在日常图表编写中,你可能不想删除它们。

第一个模板

我们将创建的第一个模板将是 ConfigMap。在 Kubernetes 中,ConfigMap 只是一个用于存储配置数据的对象。其他东西,比如 Pod,可以访问 ConfigMap 中的数据。

由于 ConfigMap 是基本资源,因此它们是我们开始的绝佳起点。

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

提示:模板名称不遵循严格的命名模式。但是,我们建议对 YAML 文件使用扩展名 .yaml,对帮助程序使用 .tpl

上面的 YAML 文件是一个非常基础的 ConfigMap,具有最少的必要字段。由于此文件位于 mychart/templates/ 目录中,因此它将通过模板引擎发送。

将这样的纯 YAML 文件放在 mychart/templates/ 目录中是可以的。当舵手读取此模板时,它将简单地按原样将其发送到 Kubernetes。

有了这个简单的模板,我们现在有一个可安装的图表。我们可以像这样安装它

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

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

$ helm get manifest full-coral

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

helm get manifest 命令接受一个版本名称 (full-coral) 并打印出上传到服务器的所有 Kubernetes 资源。每个文件以 --- 开头,表示一个 YAML 文档的开始,然后跟随一个自动生成的注释行,告诉我们哪个模板文件生成了此 YAML 文档。

从那里开始,我们可以看到 YAML 数据完全是我们放在 configmap.yaml 文件中的数据。

现在我们可以卸载我们的版本:helm uninstall full-coral

添加一个简单的模板调用

name: 硬编码到资源中通常被认为是不好的做法。名称应该对版本唯一。因此,我们可能希望通过插入版本名称来生成一个 name 字段。

提示:name: 字段限制为 63 个字符,因为 DNS 系统存在限制。因此,版本名称限制为 53 个字符。Kubernetes 1.3 及更早版本限制为 24 个字符(因此名称为 14 个字符)。

让我们相应地修改 configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

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

模板指令包含在 {{}} 块中。

模板指令 {{ .Release.Name }} 将版本名称注入模板。传递到模板的值可以被认为是命名空间对象,其中点 (.) 分隔每个命名空间元素。

Release 之前的引导点表示我们从此范围的顶级命名空间开始(我们将在稍后讨论范围)。因此,我们可以将 .Release.Name 解释为“从顶级命名空间开始,找到 Release 对象,然后在其内部查找名为 Name 的对象”。

Release 对象是舵手的内置对象之一,我们将在后面详细介绍。但现在,可以说这将显示库分配给我们的版本的版本名称。

现在,当我们安装资源时,我们将立即看到使用此模板指令的结果

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

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

请注意,Kubernetes 中的 ConfigMap 名称是 clunky-serval-configmap 而不是之前的 mychart-configmap

此时,我们已经看到了最基本的模板:嵌入 {{}} 中的模板指令的 YAML 文件。在下一部分中,我们将深入研究模板。但在继续之前,还有一个可以使构建模板更快的快速技巧:当你想要测试模板渲染,但不想实际安装任何东西时,可以使用 helm install --debug --dry-run goodly-guppy ./mychart。这将渲染模板。但它不会安装图表,而是将渲染的模板返回给你,以便你可以查看输出

$ helm install --debug --dry-run goodly-guppy ./mychart
install.go:149: [debug] Original chart version: ""
install.go:166: [debug] CHART PATH: /Users/ninja/mychart

NAME: goodly-guppy
LAST DEPLOYED: Thu Dec 26 17:24:13 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: nginx
imagePullSecrets: []
ingress:
  annotations: {}
  enabled: false
  hosts:
  - host: chart-example.local
    paths: []
  tls: []
nameOverride: ""
nodeSelector: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  create: true
  name: null
tolerations: []

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: goodly-guppy-configmap
data:
  myvalue: "Hello World"

使用 --dry-run 将使测试代码更容易,但它不会确保 Kubernetes 本身将接受你生成的模板。最好不要假设你的图表仅仅因为 --dry-run 正常工作就会安装。

图表模板指南 中,我们将采用此处定义的基本图表并详细探索舵手模板语言。我们将从内置对象开始。