Chart

本人将介绍如何一步一步地创建一个chart。

假设我们现在要自定义一个chart,用来发布一个tomcat应用,资源对象包括DeploymentService

首先为chart手动创建如下的目录结构:

mytomcat/
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

Chart.yaml

该文件包含了这个chart的元数据,以下是几个比较重要的字段:

  • apiVersion:必填,取值一直为"v1"

  • name:必填,chart的名字,必须与文件夹的名字一致

  • version:必填,chart的版本,遵循SemVer语法

  • appVersion:可选,app的版本,比如如果我们这个chart是发布一个tomcat服务,使用的镜像是tomcat:7.0,那么该字段值我们可以填7

以下便是我们的Chart.yaml文件的内容

apiVersion: v1
name: mytomcat
version: 1.0.0
appappVersion: 7

templates/

该目录下是一个个模板文件,文件其实就是kubernetes中的资源的yaml文件,只不过抽象了一些参数出来。

Deployment.yaml

在这里,我们把名字、镜像、版本号、资源规格等内容抽象出来,于是该文件的内容如下:

解释一下上述的值的来源:{{ .Release.Name }}表示Release的名字,因为我们可以通过这个chart在集群上进行多次发布,每一次发布就是一次Release{{ .Values.deploy.replicas }}表示Values.yaml中的deploy.replicas字段的值;{{ toYaml .Values.deploy.resources | indent 12 }}表示Values.yamlresources字段的值,但该值不是一个string类型,而是一个yaml类型,注意该行内容前不能有空格,因为里面的indent 12已经把值替代进来时要缩进12个空格

Service.yaml

我们把Service的端口号等抽象出来,模板文件如下

values.yaml

最后我们给出values.yaml文件的内容,如下:

发布chart

接下来,我们来发布这个chart,执行以下的命令:

然后便会在k8s集群中创建一个DeploymentService。这一次发布(Release)没有指定名字,所以是随机生成的,我们来list一下Release

我们来查看一下本次Release的状态,发现其生成了一个DeploymentService,名字与Release的名字相同。Pod不是由于此次Release直接生成的,已标注为related

接下来,我们再发布一次,指定Release的名字

然后查看Release的情况:

查看release2的状态:

指定参数发布

在上面中,我们使用了values.yaml中的默认值。我们也可以使用自定义值来覆盖values.yaml中的值,如下:

查看Deployment的yaml文件发现覆盖生效(已验证)。

当然,我们也可以使用自定义文件中的值来覆盖,新建myvalues.yaml,内容如下:

然后,我们再进行发布:

备注: 关于自定义值,在helm install命令中有多个flag可以使用,分别为--set--set-file--set-string--values,关于它们的区别,请参考《Helm命令》一节或官方文档

删除Release

在上面,我们使用一个chart进行了多次发布,我们可以使用下面的命令删除指定的Release,比如删除release2

删除后,release2对应的DeploymentService会被删除,但元数据并没有被删掉,如下可以看到:

此时,如果再发布一次,名字叫release2便会报错。要想彻底删掉一个Release,添加选项--purge:

打包Chart

使用如下的命令为打包我们的chart

然后会在当前目录下生成一个压缩包mytomcat-1.0.0.tgz,其中1.0.0表示这个chart的版本号,来源于mytomcat/Chart.yaml中的version字段的值。

Reference

Last updated

Was this helpful?