默认函数介绍
在 Helm 中,default
函数用于为变量提供默认值,以确保模板渲染不会因为变量未定义或为空值而失败。基本语法如下:
{{ default "默认值" .变量 }}
或者:
{{ .Valumes.XX | default "latest" }}
default函数示例
1.使用helm创建 03-zhiyong18-use-default
Chart,删除一些模版和values
helm create 03-zhiyong18-use-default> 03-zhiyong18-use-default/values.yamlrm -rf 03-zhiyong18-use-default/templates/*
2.自定义values
创建values变量模版,自定义了一个字段叫 WZYdefault。如果template 要引用的变量找不到时,就会使用此变量。
所以我特意把{.deploy.xiuxian.tag}
给设置为了空
[root@master23105-helm]# cat 03-zhiyong18-use-default/values.yaml
# 自定义默认字段 WZYdefault
WZYdefault:ImageTag: 100# 定义的是通用的字段
common:xiuxian:name: xiuxianlabels:apps: xiuxian# 定义deployment资源的相关字段
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3# 定义service资源相关字段
service:xiuxian:type: NodePortports:port: 80targetPort: 80nodePort: 3080
3.创建工作负载模版,增加 {{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}
表示此变量为空时,该去哪里引用默认变量
[root@master23105-helm]# cat 03-zhiyong18-use-default/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"
4.自定义帮助信息(可选操作)
[root@master23105-helm]# cat 03-zhiyong18-use-default/templates/NOTES.txt
欢迎使用wzy自定义Chart程序,当前的Chart版本号是: {{.Chart.Name}}:{{.Chart.Version}}
正在使用的 应用 版本号为: {{.Chart.Name}}:{{.Chart.AppVersion}}
当前的release名称: {{.Release.Name}}
名称空间: {{.Release.Namespace}}
修订版本: {{.Release.Revision}}
当前操作是否升级: {{.Release.IsUpgrade}}
当前部署的镜像为: {{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}
访问测试: http://10.0.0.231:{{.Values.service.xiuxian.ports.nodePort}}我的博客地址:https://blog.csdn.net/qq_73797346
5.部署验证可以发现,镜像tag使用了默认值。当然没有这个镜像啊,我凭空捏造的
[root@master23105-helm]# helm install default 03-zhiyong18-use-default/
NAME: default
LAST DEPLOYED: Sun Nov 24 03:41:07 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
欢迎使用wzy自定义Chart程序,当前的Chart版本号是: 01-zhiyong18-no-value:0.1.0
正在使用的 应用 版本号为: 01-zhiyong18-no-value:1.16.0
当前的release名称: default
名称空间: default
修订版本: 1
当前操作是否升级: false
当前部署的镜像为: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100
访问测试: http://10.0.0.231:3080[root@master23105-helm]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/xiuxian-5589856b9b-h6knp 0/1 ImagePullBackOff 0 2m14s
pod/xiuxian-5589856b9b-pfzx4 0/1 ImagePullBackOff 0 2m14s
pod/xiuxian-5589856b9b-xqfx4 0/1 ImagePullBackOff 0 2m14sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.200.0.1 <none> 443/TCP 20d
service/xiuxian NodePort 10.200.54.197 <none> 80:3080/TCP 2m14sNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/xiuxian 0/3 3 0 2m14sNAME DESIRED CURRENT READY AGE
replicaset.apps/xiuxian-5589856b9b 3 3 0 2m14s
toYaml函数
在 Helm 模板中,toYaml
函数用于将变量转换为 YAML 格式的字符串。结合 nindent
函数,可以自动添加缩进,保持模板的可读性和结构的正确性,特别是在嵌套字段较多时大大简化书写
假设有个values.yaml,定义了2个探针
deploy:xiuxian:image: nginxtag: ""replicas: 3livenessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1
在模板文件中的容器字段引用时,就要这样,非常难以书写,大大增加了书写量
containers:
- name: c1image: "{{ .Values.deploy.xiuxian.image }}:{{ .Values.deploy.xiuxian.tag | default "latest" }}"livenessProbe:httpGet:port: {{ .Values.deploy.xiuxian.livenessProbe.httpGet.port }}path: {{ .Values.deploy.xiuxian.livenessProbe.httpGet.path }}failureThreshold: {{ .Values.deploy.xiuxian.livenessProbe.failureThreshold }}initialDelaySeconds: {{ .Values.deploy.xiuxian.livenessProbe.initialDelaySeconds }}periodSeconds: {{ .Values.deploy.xiuxian.livenessProbe.periodSeconds }}successThreshold: {{ .Values.deploy.xiuxian.livenessProbe.successThreshold }}timeoutSeconds: {{ .Values.deploy.xiuxian.livenessProbe.timeoutSeconds }}readinessProbe:httpGet:port: {{ .Values.deploy.xiuxian.readinessProbe.httpGet.port }}path: {{ .Values.deploy.xiuxian.readinessProbe.httpGet.path }}failureThreshold: {{ .Values.deploy.xiuxian.readinessProbe.failureThreshold }}initialDelaySeconds: {{ .Values.deploy.xiuxian.readinessProbe.initialDelaySeconds }}periodSeconds: {{ .Values.deploy.xiuxian.readinessProbe.periodSeconds }}successThreshold: {{ .Values.deploy.xiuxian.readinessProbe.successThreshold }}timeoutSeconds: {{ .Values.deploy.xiuxian.readinessProbe.timeoutSeconds }}
我们可以这样直接引用整个yaml,然偶再缩进。
这个探针缩进取决于当前deploy的缩进。
注意这里有个默认的换行符,如果使用 indent是没有换行的
spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"livenessProbe: {{ toYaml .Values.deploy.xiuxian.livenessProbe | nindent 10 }}
提示可以使用:helm install toyaml 04-to-yaml --dry-run
预执行一遍
或则增加 --debug
进一步判断和调式
with函数
with
语句使模板进入一个指定的上下文,从而简化对嵌套结构的访问。
之前在使用toYaml时,确实简化了不少。有没有一种方法可以再简化一点呢?每次书写 {{ .Values.deploy.xiuxian}}
,可以使用with简化。
1.deployment文件引用 -with
[root@master231templates]# yy deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"{{- with .Values.deploy.xiuxian }}livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}
2.渲染结果如下:
spec:containers:- name: c1image: "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100"livenessProbe: failureThreshold: 3httpGet:path: /index.htmlport: 80initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe: failureThreshold: 3httpGet:path: /index.htmlport: 80initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1
变量的定义
{{ $default_image_tag := .Values.WZYdefault.ImageTag }}
1.在前面的with案例中,可以发现有这样的一个报错。因为使用了 - with
,导致根路径发送改变,所以 image 字段用上了
[root@master23111-with-and-variable]# yy values.yaml
WZYdefault:ImageTag: v100
common:xiuxian:name: xiuxianlabels:apps: xiuxian
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3livenessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 3periodSeconds: 1successThreshold: 1timeoutSeconds: 1readinessProbe:httpGet:port: 80path: /index.htmlfailureThreshold: 3initialDelaySeconds: 0periodSeconds: 1successThreshold: 1timeoutSeconds: 1
service:xiuxian:type: NodePortports:port: 80targetPort: 80nodePort: 3080
2.deployment.yaml 没有引用变量报错
[root@master231templates]# yy deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1{{- with .Values.deploy.xiuxian }}image: "{{.image}}:{{.tag | default .Values.WZYdefault.ImageTag}}"livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}
[root@master23105-helm]# helm install bad 11-with-and-variable/
Error: INSTALLATION FAILED: template: 01-zhiyong18-no-value/templates/deployment.yaml:19:51: executing “01-zhiyong18-no-value/templates/deployment.yaml” at <.Values.WZYdefault.ImageTag>: nil pointer evaluating interface {}.WZYdefault
3.解决方法:使用一个变量来
[root@master231templates]# yy deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1{{ $default_image_tag := .Values.WZYdefault.ImageTag }}{{- with .Values.deploy.xiuxian }}image: "{{.image}}:{{.tag | default $default_image_tag }}"livenessProbe: {{ toYaml .livenessProbe | nindent 10 }}readinessProbe: {{ toYaml .readinessProbe | nindent 10 }}{{- end }}
字符处理相关函数
大小写转变函数
函数示例:
# 全部字母大写| upper# 首字母大写| title# 全部小写| lower
1.values的内容如下,接下来我要做的是传递到容器的环境变量值大小发送改变
deploy:xiuxian:image: nginxtag: "latest"replicas: 3env:name: wenZhiYongsex: manhobby: BLOG
2.模版文件引用values:
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"env:- name: wzy_namevalue: {{ .Values.deploy.xiuxian.env.name | upper }}- name: wzy_sexvalue: {{ .Values.deploy.xiuxian.env.sex | title }}- name: wzy_hobbyvalue: {{ .Values.deploy.xiuxian.env.hobby | lower }}
3.执行一下 helm install change 05-change/ --dry-run --debug
,看看效果。全部转变成功
apiVersion: apps/v1
kind: Deployment
metadata:name: xiuxian
spec:replicas: 3selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v100"env:- name: wzy_namevalue: WENZHIYONG- name: wzy_sexvalue: Man- name: wzy_hobbyvalue: blog
quote函数
作用:把values引用的的特殊值,如布尔值(true,false)、数字(1,2 )…当做普通字符串处理。
values模板定义了env boolean为true。接下来要做的是true当做普通字符传入到容器的环境变量中
1.这是values模版文件部分配置示例:
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3env:boolean: true
2.模版引用该values,不出意外的话就报错了
[root@master231templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{.Values.common.xiuxian.name}}
spec:replicas: {{.Values.deploy.xiuxian.replicas}}selector:matchLabels:apps: xiuxiantemplate:metadata:labels:apps: xiuxianversion: v1spec:containers:- name: c1image: "{{.Values.deploy.xiuxian.image}}:{{.Values.deploy.xiuxian.tag | default .Values.WZYdefault.ImageTag}}"env:- name: wzy_ruokvalue: {{ .Values.deploy.xiuxian.env.boolean }}
3.使用 --dry-run
运行是没有问题的,不过是假象,真正运行就报错了
[root@master23105-helm]# helm install quote 06-quote/
Error: INSTALLATION FAILED: 1 error occurred:* Deployment in version "v1" cannot be handled as a Deployment: json: cannot unmarshal bool into Go
struct field EnvVar.spec.template.spec.containers.env.value of type string
4.解决方法,增加 quote
函数把后面的值转变为普通字符。就像这样:
env:- name: wzy_numbervalue: {{ quote .Values.deploy.xiuxian.repicas }}- name: wzy_ruokvalue: {{ quote .Values.deploy.xiuxian.env.boolean }}
5.使用 helm install quote 06-quote/
安装部署成功。进入容器打印该变量
[root@master23105-helm]# kubectl exec xiuxian-777cf95649-d94r6 -- sh -c 'echo $wzy_ruok'
true
字符替换+截断
1.阅读Chart信息
apiVersion: v2
name: 07-printf
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
2.阅读部分values信息
[root@master23107-printf]# yy values.yaml
WZYdefault:ImageTag: v1
common:xiuxian:name: xiuxianlabels:apps: xiuxian
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3
3.NOTES信息。这里记录了相关字符处理的函数
[root@master231templates]# cat NOTES.txt
--------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas }}
---------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量,把符号 - 替换为 【
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | replace "-" "【" }}
---------------------------------------------------------------------------------------------------------
# trunc 截断输出保留前3个字符
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trunc 3 }}
---------------------------------------------------------------------------------------------------------
# 删除指定字符后缀,这里把 3 删除
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trimSuffix "3" }}
---------------------------------------------------------------------------------------------------------
# 删除指定字符前缀,这里把 07 删除
{{ printf "%s-%s-%.f" .Chart.Name .Chart.Version .Values.deploy.xiuxian.replicas | trimPrefix "07" }}
---------------------------------------------------------------------------------------------------------我的博客地址:https://blog.csdn.net/qq_73797346
4.运行结果的NOTE输出如下:
NOTES:
--------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量
07-printf-0.1.0-3
---------------------------------------------------------------------------------------------------------
# 会输出 chart的名字-chart的版本-pod副本数量,把符号 - 替换为 【
07【printf【0.1.0【3
---------------------------------------------------------------------------------------------------------
# trunc 截断输出保留前3个字符
07-
---------------------------------------------------------------------------------------------------------
# 删除指定字符后缀,这里把 3 删除
07-printf-0.1.0-
---------------------------------------------------------------------------------------------------------
# 删除指定字符前缀,这里把 07 删除
-printf-0.1.0-3
---------------------------------------------------------------------------------------------------------我的博客地址:https://blog.csdn.net/qq_73797346
if-else流程控制
单分支
官方流程控制参考链接
1.values文件部分示例,没有定义nodePort的端口是多少
service:xiuxian:type: NodePortports:port: 80targetPort: 80
2.service模版,如果判断类型为NodePort,就指定端口为 3080。==这里有个 -==取消换行
apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:type: {{ .Values.service.xiuxian.type | default "ClusterIP" }}selector:apps: xiuxianports:- port: 80targetPort: 80{{- if eq .Values.service.xiuxian.type "NodePort" }}nodePort: 3080{{ end }}
3.渲染结果为:
apiVersion: v1
kind: Service
metadata:name: xiuxian
spec:type: NodePortselector:apps: xiuxianports:- port: 80targetPort: 80nodePort: 3080
多分支
使用条件判断来设置 targetPort
的值:
if
语句根据 service.xiuxian.type
的值来设置 targetPort
:
- 如果类型是
ClusterIP
,targetPort
为80
。 - 如果类型是
NodePort
,targetPort
为81
。 - 如果类型是
LoadBalancer
,targetPort
为82
。 - 如果没有匹配的类型,默认将
ClusterIP
的targetPort
设置为83
1.查看values.yaml文件,这会最终影响if判断结果
[root@master23109-more-if]# cat values.yaml
# 自定义默认字段 WZYdefault
WZYdefault:ImageTag: v1# 定义的是通用的字段
common:xiuxian:name: xiuxianlabels:apps: xiuxian# 定义deployment资源的相关字段
deploy:xiuxian:image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/appstag: ""replicas: 3# 定义service资源相关字段
service:xiuxian:#type: ClusterIPtype: NodePort#type: LoadBalancerports:port: 80targetPort: 80nodePort: 30080
2.service模版
[root@master231templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:selector:apps: xiuxiantype: {{ .Values.service.xiuxian.type | default "ClusterIP" }}ports:- port: {{ .Values.service.xiuxian.ports.port | default 80 }}{{- if eq .Values.service.xiuxian.type "ClusterIP" }}targetPort: 80{{- else if eq .Values.service.xiuxian.type "NodePort" }}targetPort: 81nodePort: {{ .Values.service.xiuxian.ports.nodePort }}{{- else if eq .Values.service.xiuxian.type "LoadBalancer" }}targetPort: 82{{- else }}targetPort: 83{{- end }}
80
targetPort: 80
nodePort: 30080
2.service模版```yaml
[root@master231templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ .Values.common.xiuxian.name }}
spec:selector:apps: xiuxiantype: {{ .Values.service.xiuxian.type | default "ClusterIP" }}ports:- port: {{ .Values.service.xiuxian.ports.port | default 80 }}{{- if eq .Values.service.xiuxian.type "ClusterIP" }}targetPort: 80{{- else if eq .Values.service.xiuxian.type "NodePort" }}targetPort: 81nodePort: {{ .Values.service.xiuxian.ports.nodePort }}{{- else if eq .Values.service.xiuxian.type "LoadBalancer" }}targetPort: 82{{- else }}targetPort: 83{{- end }}
with指定作用域