一、chart包介绍

一个chart包就是一个文件夹的集合,文件夹的名称就是chart包的名称,如下:

  1. # 创建一个chart包mychart
  2. helm create mychart

然后我们可以看到一下目录结构:

  1. # helm create mychart
  2. Creating mychart
  3. [root@master helm]# tree mychart/
  4. mychart/
  5. ├── charts
  6. ├── Chart.yaml
  7. ├── templates
  8. ├── deployment.yaml
  9. ├── _helpers.tpl
  10. ├── ingress.yaml
  11. ├── NOTES.txt
  12. ├── service.yaml
  13. └── tests
  14. └── test-connection.yaml
  15. └── values.yaml

其中templates目录下就是存放模板的:

  • deployment.yaml:创建kubernetes deployment的基本manifest;
  • _helpers.tpl:放置模板助手的地方,可在整个chart中重复使用;
  • ingress.yaml:创建kubernetes ingress的基本manifest;
  • NOTES.TXT:chart的帮助文档,在helm install的显示部分;
  • service.yaml:创建kubernetes service的基本manifest;
  • tests:连接线测试模板

二、创建模板

2.1、创建简单的模板

将templates下面的原有模板都删除,下面我们自定义模板(创建一个简单的configMap模板):
configmap.yaml

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: mychart-configmap-test
  5. data:
  6. myvalue: "Hello World"

然后我们就可以通过helm install来安装这个chart包,但是有时候我们并不需要直接安装,而仅仅是调试,就可以接参数—dry-run —debug,如下:

  1. # helm install ../mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '41000'
  3. [debug] SERVER: "127.0.0.1:41000"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: falling-marsupial
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 11:43:36 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: mychart-configmap-test
  16. data:
  17. myvalue: "Hello World"

然后就可以看到我们定义的ConfigMap可以正常生效。

2.2、创建带内置参数的模板

上面创建的是一个 简单的模板,也就是全部参数都写死了,下面创建一个动态生成的模板,如下:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: "Hello World"

上面定义的模板中,name字段会通过插入release名称来动态生成,如下:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '46030'
  3. [debug] SERVER: "127.0.0.1:46030"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: crazy-pig
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 11:48:55 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: crazy-pig-configmap-test
  16. data:
  17. myvalue: "Hello World"

上面是release是随机生成的,当然我们也可以自定义,如下:

  1. # helm install ./mychart/ --dry-run --debug --name joker
  2. [debug] Created tunnel using local port: '45350'
  3. [debug] SERVER: "127.0.0.1:45350"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: joker
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 11:56:48 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: joker-configmap-test
  16. data:
  17. myvalue: "Hello World"

三、内置对象

3.1、Release

这个对象描述release本身,它有以下几个对象:

  • Release.Name:release 名称
  • Release.Time:release 的时间
  • Release.Namespace:release 的 namespace(如果清单未覆盖)
  • Release.Service:release 服务的名称(始终是 Tiller)。
  • Release.Revision:此 release 的修订版本号,从1开始累加。
  • Release.IsUpgrade:如果当前操作是升级或回滚,则将其设置为 true。
  • Release.IsInstall:如果当前操作是安装,则设置为 true。

3.2、values

从values.yaml文件或者用户提供的文件传入模板的值。
它有4个来源:

  • chart 包中的 values.yaml 文件
  • 父 chart 包的 values.yaml 文件
  • 通过 helm install 或者 helm upgrade 的-f或者—values参数传入的自定义的 yaml 文件
  • 通过—set 参数传入的值

其中chart包中values.yaml提供的值可以被用户提供的value文件覆盖,用于提供的value文件可以被—set传入的参数覆盖。

比如,我们在values.yaml里定义一个如下value:

  1. # vim values.yaml
  2. mysql_user_name: joker

然后我们在应用这个value:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: "Hello World"
  7. mysql_user_name: {{ .Values.mysql_user_name }}

然后我们调试查看如下:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '39797'
  3. [debug] SERVER: "127.0.0.1:39797"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: youngling-newt
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 16:18:09 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: youngling-newt-configmap-test
  16. data:
  17. myvalue: "Hello World"
  18. mysql_user_name: joker

然后我们自定义一个value文件:

  1. # cat myvalue.yaml
  2. mysql_user_name: unclejoker

然后调式查看结果:

  1. # helm install ./mychart/ --values myvalue.yaml --dry-run --debug
  2. [debug] Created tunnel using local port: '43201'
  3. [debug] SERVER: "127.0.0.1:43201"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: goodly-bison
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 16:44:44 2019
  9. CHART: mychart-0.1.0
  10. USER-SUPPLIED VALUES:
  11. mysql_user_name: unclejoker
  12. ---
  13. # Source: mychart/templates/configmap.yaml
  14. apiVersion: v1
  15. kind: ConfigMap
  16. metadata:
  17. name: goodly-bison-configmap-test
  18. data:
  19. myvalue: "Hello World"
  20. mysql_user_name: unclejoker

可以看到chart中得value被我们传入的value文件中定义的给覆盖了。

最后我们通过—set来给定变量:

  1. # helm install ./mychart/ --values myvalue.yaml --set mysql_user_name=joker1234 --dry-run --debug
  2. [debug] Created tunnel using local port: '35112'
  3. [debug] SERVER: "127.0.0.1:35112"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: elder-pike
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 16:46:23 2019
  9. CHART: mychart-0.1.0
  10. USER-SUPPLIED VALUES:
  11. mysql_user_name: joker1234
  12. ---
  13. # Source: mychart/templates/configmap.yaml
  14. apiVersion: v1
  15. kind: ConfigMap
  16. metadata:
  17. name: elder-pike-configmap-test
  18. data:
  19. myvalue: "Hello World"
  20. mysql_user_name: joker1234

可以看到都被—set给定的value给覆盖了。

3.3、Chart

Chart.yaml文件中的内容,所有的chart对象都将从该文件中获取。

3.4、Files

这提供对 chart 中所有非特殊文件的访问。虽然无法使用它来访问模板,但可以使用它来访问 chart 中的其他文件。

  • Files.Get 是一个按名称获取文件的函数(.Files.Get config.ini)
  • Files.GetBytes 是将文件内容作为字节数组而不是字符串获取的函数。这对于像图片这样的东西很有用。

3.5、Capabilities

提供关于kubernetes集群支持的功能信息。

  • Capabilities.APIVersions 是一组版本信息。
  • Capabilities.APIVersions.Has $version 指示是否在群集上启用版本(batch/v1)。
  • Capabilities.KubeVersion 提供了查找 Kubernetes 版本的方法。它具有以下值:Major,Minor,GitVersion,GitCommit,GitTreeState,BuildDate,GoVersion,Compiler,和 Platform。
  • Capabilities.TillerVersion 提供了查找 Tiller 版本的方法。它具有以下值:SemVer,GitCommit,和 GitTreeState。

3.6、Template

包含有关正在执行的当前模板的信息。

3.7、Name

到当前模板的文件路径,比如:/root/k8s/helm/mychart/templates/configmap.yaml

3.8、BasePath

当前chart模板目录的路径,比如:/root/k8s/helm/mychart/templates/

四、模板函数

chart的模板中可以使用函数,如下:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: "Hello World"
  7. mysql_user_name: {{ quote .Values.mysql_user_name }}

上面在模板中使用了quote函数,该函数的作用是为value添加””。
我们调试运行如下:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '43807'
  3. [debug] SERVER: "127.0.0.1:43807"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: cold-swan
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 17:07:05 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: cold-swan-configmap-test
  16. data:
  17. myvalue: "Hello World"
  18. mysql_user_name: "joker"

更多内置函数可以查看:
https://godoc.org/text/template
https://godoc.org/github.com/Masterminds/sprig

五、管道

模板中不止可以使用函数,还可以使用管道,比如:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: "Hello World"
  7. mysql_user_name: {{ .Values.mysql_user_name | quote }}

然后我们查看调试结果:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '43807'
  3. [debug] SERVER: "127.0.0.1:43807"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: cold-swan
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 17:07:05 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: cold-swan-configmap-test
  16. data:
  17. myvalue: "Hello World"
  18. mysql_user_name: "joker"

还可以支持多级管道,如下:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: "Hello World"
  7. mysql_user_name: {{ .Values.mysql_user_name | upper | quote }}

查看结果:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '44513'
  3. [debug] SERVER: "127.0.0.1:44513"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: goodly-woodpecker
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 17:16:29 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: goodly-woodpecker-configmap-test
  16. data:
  17. myvalue: "Hello World"
  18. mysql_user_name: "JOKER"
  19. You have new mail in /var/spool/mail/root

注意:如果使用管道,则管道前的结果是管道后的参数,一定要清楚先后顺序。

六、default函数

default 函数允许我们在模板内部指定默认值,以防止该值被忽略掉。如下:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap-test
  5. data:
  6. myvalue: {{ .Values.hello | default "Hello World" | quote }}
  7. mysql_user_name: {{ .Values.mysql_user_name | upper | quote }}

调试结果:

  1. # helm install ./mychart/ --dry-run --debug
  2. [debug] Created tunnel using local port: '33349'
  3. [debug] SERVER: "127.0.0.1:33349"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /root/k8s/helm/mychart
  6. NAME: measly-nightingale
  7. REVISION: 1
  8. RELEASED: Thu Nov 14 17:24:36 2019
  9. CHART: mychart-0.1.0
  10. ---
  11. # Source: mychart/templates/configmap.yaml
  12. apiVersion: v1
  13. kind: ConfigMap
  14. metadata:
  15. name: measly-nightingale-configmap-test
  16. data:
  17. myvalue: "Hello World"
  18. mysql_user_name: "JOKER"

我们并没有特别定义一个叫hello的value,使用了default函数,就会给其一个默认值。