3、helm的Chart模板
Helm最核⼼的就是模板,即模板化的K8S manifests⽂件。
它本质上就是⼀个Go的template模板。Helm在Go template模板的基础上,还会增加很多东西。如⼀些⾃定义的元数据信息、扩展的库以及⼀些类似于编程形式的⼯作流,例如条件语句、管道等等。这些东西都会使得我们的模板变得更加丰富。
创建chart中的⾃定义⽂件
我们⾃定义yaml⽂件
cd templates/
rm -rf *
kubectl create deployment --image=nginx nginx01 --dry-run -o yaml >deployment.yaml
kubectl expose deployment nginx01 --port=80 --target-port=80 --dry-run -o yaml >service.yaml
查看⽣成的yaml⽂件
cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx01
name: nginx01
spec:
replicas: 1
selector:
matchLabels:
app: nginx01
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx01
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
查看⽣成的service.yaml
cat service.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: nginx01
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
status:
loadBalancer: {}
实际上,这已经是⼀个可安装的Chart包了,通过 helm install命令来进⾏安装:
helm install web01 mychart
这样部署,其实与直接apply没什么两样。
然后使⽤如下命令可以看到实际的模板被渲染过后的资源⽂件:
helm get manifest web01
定义模板
可以看到,这与刚开始写的内容是⼀样的,包括名字、镜像等,我们希望能在⼀个地⽅统⼀定义这些会经常变换的字段,这就需要⽤到Chart的模板了,这样变的更通⽤
我们将其会变化的部分定义为变量:
编辑deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
chart: {{ .Chart.Name }}
app: {{ .Release.Name }}
name: {{ .Release.Name }}
spec:
replicas: {{ .plicas}}
selector:
matchLabels:
app: {{ .Values.label }}
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }}
name: {{ .Release.Name }}
resources: {}
status: {}
编辑service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
chart: {{ .Chart.Name }}
name: {{ .Release.Name }}
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: {{ .Values.label }}
编辑传⼊变量的values.yaml
[root@master templates]# cat ../values.yaml
replicas: 3
image: nginx
imageTag: 1.17
label: nginx
调试
我们编辑完成后可以⽤dry-run试运⾏下,看看有⽆错误:
helm install web --dry-run ../../mychart
内置对象
上⾯我们⽤了很多变量,其中Release.Name、Chart.Name都为内置变量,下⾯是⼀些常⽤的内置对象:
Release.Name release 名称
Release.Time release 的时间
Release.Namespace release 的 namespace(如果清单未覆盖)Release.Service release 服务的名称
Release.Revision 此 release 的修订版本号,从1开始累加
Release.IsUpgrade 如果当前操作是升级或回滚,则将其设置为 true。Release.IsInstall 如果当前操作是安装,则设置为 true。
此时我们已经可以执⾏安装动作了
nodeselector
helm install web  ../../mychart
检测:
[root@master templates]# kubectl get pod
NAME                                      READY  STATUS            RESTARTS  AGE
web-785d8679f8-fncjd                      1/1    Running            0          4s
web-785d8679f8-lc28h                      1/1    Running            0          4s
web-785d8679f8-vkkq5                      1/1    Running            0          4s
更新
此时我们如果想更换配置就⽐较⽅⾯了,⽐如我们将nginx的版本换成1.16
[root@master demo]# cat mychart/values.yaml
replicas: 3
image: nginx
imageTag: 1.16
label: nginx
更新:
helm upgrade web01 mychart
此时我们就可以curl 看到nginx版本已经变化了
kubectl get pod -o wide
curl 172.17.9.3 -I
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 04 Feb 2020 12:45:56 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
Values
Values对象是为Chart模板提供值,这个对象的值有4个来源:
chart 包中的 values.yaml ⽂件
⽗ chart 包的 values.yaml ⽂件
通过 helm install 或者 helm upgrade 的 -f或者 --values参数传⼊的⾃定义的 yaml ⽂件
通过 --set 参数传⼊的值
chart 的 values.yaml 提供的值可以被⽤户提供的 values ⽂件覆盖,⽽该⽂件同样可以被 --set提供的参数所覆盖。
例如我们要新建⼀个应⽤,副本数只要1个:
helm install web02 --set replicas=1 mychart
Chart的管道与函数
模块实就是将值传给模板引擎进⾏渲染,模板引擎还⽀持对拿到数据进⾏⼆次处理。
例如从.Values中读取的值变成字符串(就是给值加个双引号“”),可以使⽤quote函数实现:
例如我们给标签(labels)加个双引号:
我们修改deployment.yaml⽂件
[root@master mychart]# cat templates/deployment.yaml
template:
metadata:
creationTimestamp: null
labels:
app: {{ quote .Values.label }}
试运⾏查看结果
helm install web03 --dry-run ../mychart
template:
metadata:
creationTimestamp: null
labels:
app: "nginx"
这⾥可以发现标签 app: “nginx” 加上了⼀个双引号“”
default函数:
另外还会经常使⽤⼀个default函数,该函数允许在模板中指定默认值,以防⽌该值被忽略掉。
例如我们新加⼀个值:test: demotest
我们修改deployment.yaml⽂件
cat templates/deployment.yaml
template:
metadata:
creationTimestamp: null
labels:
app: {{ quote .Values.label }}
test: {{ default "demotest" .st }}
试运⾏查看结果:
helm install web03 --dry-run ../mychart
template:
metadata:
creationTimestamp: null
labels:
app: "nginx"
test: demotest
这⾥可以看到,我们定义的test: demotest已经⽣效。
我们不在values.yaml中定义test的值,默认就会是demotest,如果定义就会按定义的值来例如我们把值定义为123456:
[root@master mychart]# cat values.yaml
replicas: 3
image: nginx
imageTag: 1.16
label: nginx
test: 123456
试运⾏查看结果:
helm install web03 --dry-run ../mychart
template:
metadata:
creationTimestamp: null
labels:
app: "nginx"
test: 123456
其他函数:
缩进:{{ .sources | indent 12 }} 这⾥表⽰改⾏缩进12个空格
⼤写:{{ upper .sources }}
⾸字母⼤写:{{ title .sources }}
模板函数调⽤语法为:functionName arg1 arg2…
流程控制
流程控制是为模板提供了⼀种能⼒,满⾜更复杂的数据逻辑处理。
Helm模板语⾔提供以下流程控制语句:
if/else 条件块
with 指定范围
range 循环块
if
if/else块是⽤于在模板中有条件地包含⽂本块的⽅法,条件块的基本结构如下:
{{if PIPELINE }}
# Do something
{{else if OTHER PIPELINE }}
# Do something else
{{else}}
# Default case
{{ end }}
条件判断就是判断条件是否为真,如果值为以下⼏种情况则为false:
⼀个布尔类型的 假
⼀个数字 零
⼀个 空的字符串
⼀个 nil(空或 null)
⼀个空的集合( map、 slice、 tuple、 dict、 array)
除了上⾯的这些情况外,其他所有条件都为 真。
例如我们判断test的值来赋予⼀个新的值,修改deployment.yaml;:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。