一、chart包介绍
一个chart包就是一个文件夹的集合,文件夹的名称就是chart包的名称,如下:
# 创建一个chart包mychart
helm create mychart
然后我们可以看到一下目录结构:
# helm create mychart
Creating mychart
[root@master helm]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── 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
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap-test
data:
myvalue: "Hello World"
然后我们就可以通过helm install来安装这个chart包,但是有时候我们并不需要直接安装,而仅仅是调试,就可以接参数—dry-run —debug,如下:
# helm install ../mychart/ --dry-run --debug
[debug] Created tunnel using local port: '41000'
[debug] SERVER: "127.0.0.1:41000"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: falling-marsupial
REVISION: 1
RELEASED: Thu Nov 14 11:43:36 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap-test
data:
myvalue: "Hello World"
然后就可以看到我们定义的ConfigMap可以正常生效。
2.2、创建带内置参数的模板
上面创建的是一个 简单的模板,也就是全部参数都写死了,下面创建一个动态生成的模板,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: "Hello World"
上面定义的模板中,name字段会通过插入release名称来动态生成,如下:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '46030'
[debug] SERVER: "127.0.0.1:46030"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: crazy-pig
REVISION: 1
RELEASED: Thu Nov 14 11:48:55 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: crazy-pig-configmap-test
data:
myvalue: "Hello World"
上面是release是随机生成的,当然我们也可以自定义,如下:
# helm install ./mychart/ --dry-run --debug --name joker
[debug] Created tunnel using local port: '45350'
[debug] SERVER: "127.0.0.1:45350"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: joker
REVISION: 1
RELEASED: Thu Nov 14 11:56:48 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: joker-configmap-test
data:
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:
# vim values.yaml
mysql_user_name: joker
然后我们在应用这个value:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: {{ .Values.mysql_user_name }}
然后我们调试查看如下:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '39797'
[debug] SERVER: "127.0.0.1:39797"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: youngling-newt
REVISION: 1
RELEASED: Thu Nov 14 16:18:09 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: youngling-newt-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: joker
然后我们自定义一个value文件:
# cat myvalue.yaml
mysql_user_name: unclejoker
然后调式查看结果:
# helm install ./mychart/ --values myvalue.yaml --dry-run --debug
[debug] Created tunnel using local port: '43201'
[debug] SERVER: "127.0.0.1:43201"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: goodly-bison
REVISION: 1
RELEASED: Thu Nov 14 16:44:44 2019
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
mysql_user_name: unclejoker
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-bison-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: unclejoker
可以看到chart中得value被我们传入的value文件中定义的给覆盖了。
最后我们通过—set来给定变量:
# helm install ./mychart/ --values myvalue.yaml --set mysql_user_name=joker1234 --dry-run --debug
[debug] Created tunnel using local port: '35112'
[debug] SERVER: "127.0.0.1:35112"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: elder-pike
REVISION: 1
RELEASED: Thu Nov 14 16:46:23 2019
CHART: mychart-0.1.0
USER-SUPPLIED VALUES:
mysql_user_name: joker1234
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: elder-pike-configmap-test
data:
myvalue: "Hello World"
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的模板中可以使用函数,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: {{ quote .Values.mysql_user_name }}
上面在模板中使用了quote函数,该函数的作用是为value添加””。
我们调试运行如下:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '43807'
[debug] SERVER: "127.0.0.1:43807"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: cold-swan
REVISION: 1
RELEASED: Thu Nov 14 17:07:05 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cold-swan-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: "joker"
更多内置函数可以查看:
https://godoc.org/text/template
https://godoc.org/github.com/Masterminds/sprig
五、管道
模板中不止可以使用函数,还可以使用管道,比如:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: {{ .Values.mysql_user_name | quote }}
然后我们查看调试结果:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '43807'
[debug] SERVER: "127.0.0.1:43807"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: cold-swan
REVISION: 1
RELEASED: Thu Nov 14 17:07:05 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cold-swan-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: "joker"
还可以支持多级管道,如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: {{ .Values.mysql_user_name | upper | quote }}
查看结果:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '44513'
[debug] SERVER: "127.0.0.1:44513"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: goodly-woodpecker
REVISION: 1
RELEASED: Thu Nov 14 17:16:29 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-woodpecker-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: "JOKER"
You have new mail in /var/spool/mail/root
注意:如果使用管道,则管道前的结果是管道后的参数,一定要清楚先后顺序。
六、default函数
default 函数允许我们在模板内部指定默认值,以防止该值被忽略掉。如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap-test
data:
myvalue: {{ .Values.hello | default "Hello World" | quote }}
mysql_user_name: {{ .Values.mysql_user_name | upper | quote }}
调试结果:
# helm install ./mychart/ --dry-run --debug
[debug] Created tunnel using local port: '33349'
[debug] SERVER: "127.0.0.1:33349"
[debug] Original chart version: ""
[debug] CHART PATH: /root/k8s/helm/mychart
NAME: measly-nightingale
REVISION: 1
RELEASED: Thu Nov 14 17:24:36 2019
CHART: mychart-0.1.0
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: measly-nightingale-configmap-test
data:
myvalue: "Hello World"
mysql_user_name: "JOKER"
我们并没有特别定义一个叫hello的value,使用了default函数,就会给其一个默认值。