新手入门
在这部分的教程中,我们将创建一个chart,并添加一个模板。我们在这里创建的chart将会贯穿整个教程的其余部分。
在开始之前,让我们先简单地看一下Helm Chart。
Charts
如在Charts教程里所描述的,Helm charts的结构如下所示:
mychart/
Chart.yaml
values.yaml
charts/
templates/
...
- templates目录用来存放template文件的地方。当Helm在计算一个chart的时候,template目录下的所有文件都将通过模板渲染引擎(template rendering engine),发送给Helm进行计算。最终Helm将收集这些模板的结果,并将他们发送给Kubernetes。
- values.yaml文件对于模板文件是非常重要的。这个文件中包含了一个chart中的默认值。用户在执行helm instal或者helm upgrade命令是可以重置这些默认值。
- Chart.yaml文件包含了对当前chart的描述信息。我们也可以在模板中访问这些信息。
- charts目录允许包含其它的charts(我们称之为子charts)。在本指南的后面部分,我们将看到在模板渲染时这些是如何工作的。
第一个chart
在本指南中,我们将创建一个名叫mychart的简单的chart,紧接着我们将在这个chart中创建一些模板。
$ helm create mychart
Creating mychart
从现在开始,我们后续的操作都将位于mychart目录下。
快速浏览mychart/templates/目录
如果你查看一下mychart下的templates目录,你会发现这个目录下已经有一些文件了。
- NOTES.txt:是你的chart的帮助文档。当用户执行helm install命令是,这个文档的内容将会展示给用户。
- deployment.yaml:一个用来创建Kubernetes deployment资源的基本清单文件。
- service.yaml:一个为deployment创建service端点的基本清单文件。
- _helpers.tpl:放置模板帮助程序的地方,我们可以在整个chart中重复使用这些模板帮助程序
接下来我们要做的是,删除所有的文件!这样我们就可以从头开始学习教程。随着教程的深入,我们将创建自己的NOTES.txt和_helpers文件。
$ rm -rf mychart/templates/*
当然了,当你在编写生产级的chart时候,自动生成的这些基本模板文件是非常有用的。所以在日常编写chart的工作中,你有可能不会删除它们。
第一个模板文件
我们要创建的第一个模板是ConfigMap。在Kubernetes中,ConfigMap只是用来存储配置数据的容器。其他东西,比如pods,可以访问ConfigMap中的数据。因为ConfigMaps是基本的资源,所以它们对我们来说是一个很好的起点。
我么接下来要创建的第一个模板是一个ConfigMap。在Kubernetes中,Configmap是用来存储皮遏制数据的容器。而其它的一些资源对象,比如pods,可以访问ConfigMap中的数据。由于ConfigMap是最基本资源之一而且其定义比较简单,所以对于我们来说它是一个很好的起点。
让我们开始在mychart/templates/目录下创建一个名叫configmap.yaml的模板文件,文件内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
TIPs:模板文件的命名没有严格的命名规则。然而,我们建议为YAML文件使用.yaml后缀,为帮助程序(helpers)使用.tpl后缀。
上面的YAML文件是一个简单的ConfigMap,只有最少的必要字段。由于该文件位于templates/目录中,因此它将通过模板引擎发送。
将这样一个普通的YAML文件放到templates/目录中就可以了。当Helm读取该模板时,它将简单地按原样将其发送给Kubernetes。
有了这个简单的模板,我们现在就有了一个可安装的chart。我们可以使用如下的命令来安装它:
$ 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,我们可以检索已发布的release,并查看实际加载的模板。
$ 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命令后边跟着一个release名字,这样就可以打印出所有上传到服务器上的Kubernetes资源。每一个文件都是以—作为开头,来表明一个YAML文档的起始,紧接着第二行是自动生成的注释,用来告诉我们这个YAML文档是根据哪一个模板文件生成的。
从上边命令的输出,我们可以看到返回的YAML数据正是我们放在configmap.yaml文件中的内容。
现在我们可以通过以下命令删除上边我们按照的release:
$ helm uninstall full-coral
添加一个简单的模板调用
给一个资源硬编码一个名字,被认为是不好的实践经验。对于release来说名字是必须唯一的。所以我们可能希望通过插入release名称来生成名称字段。
TIP:由于DNS域名系统的原因,name字段的长度被限制为63个字符。由于这个原因,release名字被限制为53个字符。Kubernetes 1.3及之前的版本限制为24个字符。
让我们将configmap.yaml文件的内容更改成以下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
最大的改变是name字段被改成了 {{ .Release.Name }}-configmap
模板指令被包含在{{ 和 }}块之间。
模板指令{{ .Release.Name }}将release的名字注入到模板中。传递给模板的值可以看作是有名称空间的对象,其中点(.)用来分隔每个名称空间的元素。
Release前边的点(.)表示我们从这个作用域的最顶层的名称空间开始(我们将稍微讨论一下作用域)。我们可以将 .Release.Name 读作“从最顶部的名称空间开始,找到Release对象,然后在其中查找一个名为Name的对象”。
Release是Helm的内置对象之一,后边我们会更深入的介绍它。但是现在,只要说明通过调用 {{ .Release.Name }} 将会显示库给我们的release分配的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
注意,现在kubernetes中configmap的名字是clunky-serval-configmap,而不是之前的mychart-configmap。
你可以通过运行 helm get manifest clunky-serval 命令来查看整个生成的YAML文件。
至此,我们已经看到了模板最基本的部分:在{{和}}中嵌入了模板指令的YAML文件。在下一部分中,我们将更深入地研究模板。
但在继续之前,有一个快速技巧可以使构建模板更快: 当您想要测试模板渲染,但实际上没有安装任何东西时,您可以使用helm install --debug --dry-run good-guppy ./mychart命令。这条命令会渲染模板,但并会不实际安装chart,它会将渲染后的模板返回给你,所以你可以看到如下的输出:
$ 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可以正常工作,就想当然地认为你的chart会正确安装。
在Chart模板教程里,我们采用我们在这里定义的基本chart,并详细研究Helm的模板语言。接下来我们将从helm模板语言里的内置对象开始。
本文为个人在学习Helm chart过程中的学习记录,文章内容翻译自Helm官方文档,如有翻译不当之处,还请不吝赐教。