Chart模板:流程控制 if/else
Helm模板语言提供以下流程控制语句:
- if/else:条件判断
- range:循环
- with:指定变量作用域
Ingress并不是所有的应用都需要启用,微服务里面比如gateway和portal这种微服务暴露在集群之外,用户可以访问到。商品服务和订单服务属于业务处理逻辑不需要让外部访问,只需要让gateway这个接口转发给后面的服务就行了,这个通信是在集群内部通信的。所以商品服务和订单服务是不需要启动ingress的
这里使用if else相对于加了开关
[root@k8s-master ~]# vim mychart/values.yaml
ingress:
enabled: true
[root@k8s-master ~]# cat mychart/templates/ingress.yaml
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web1
spec:
rules:
- host: web1.ctnrs.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web1
port:
number: 80
{{ end }}
[root@k8s-master ~]# helm install web mychart/ --dry-run
---
# Source: mychart/templates/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web1
spec:
rules:
- host: web1.ctnrs.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web1
port:
number: 80
这里就可以通过开关形式将一块资源通过这个判断要去启用他
如果值为以下几种情况则为false:
• 一个布尔类型 false
• 一个数字 0
• 一个空的字符串
• 一个 nil(空或 null)
• 一个空的集合( map、 slice、 tuple、 dict、 array)
条件表达式也支持操作符:
• eq 等于
• ne 不等于
• lt 小于
• gt 大于
• and 逻辑与
• or 逻辑或
示例:如果是一个空的集合则不启用资源配额
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
containers:
- name: web
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
{{ if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
{{ end }}
[root@k8s-master ~]# vim mychart/values.yaml
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
[root@k8s-master ~]# helm install web mychart/ --dry-run
spec:
containers:
- name: web
image: "nginx:1.16"
---
验证渲染结果:
[root@k8s-master ~]# vim mychart/values.yaml
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
[root@k8s-master ~]# helm install web mychart/ --dry-run
spec:
containers:
- name: web
image: "nginx:1.16"
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
#渲染结果会发现有多余的空行,这是因为模板渲染时会指令删除,所以原有的位置就空白了。可以使用横杠“-”消除空行。
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
containers:
- name: web
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
{{- if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
{{- end }}
[root@k8s-master ~]# helm install web mychart/ --dry-run
containers:
- name: web
image: "nginx:1.16"
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
Chart模板:流程控制之range
[root@k8s-master ~]# vim mychart/values.yaml
test:
- 1
- 2
- 3
[root@k8s-master ~]# cat mychart/templates/configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
test: |
{{- range .Values.test }}
{{ . }}
{{- end }}
[root@k8s-master ~]# helm install web mychart/ --dry-run
# Source: mychart/templates/configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: web
data:
test: |
1
2
3
---
这个对象是循环里面遍历出来的,使用.去引用
Chart模板:流程控制之with
with:指定变量作用域
语法:
{{ with <值> }}
# 限制范围
{{ end }}
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
namespace: default
labels:
{{- with .Values.labels }}
project: {{ .project }}
app: {{ .app }}
{{- end }}
[root@k8s-master ~]# vim mychart/values.yaml
labels:
project: "ms"
app: "gateway"
with通过这种方式将引用的范围缩小到某个特点的对象下面,在这里直接使用.就可以引用,如果project下面还有对象就可以使用project.去引用
with就不能使用下面的对象了
Chart模板:流程控制之with
with块限制了变量作用域,也就是无法直接引用模板对象,例 如.Values、.Release,如果还想使用,可以定义变量来解决该问题。
使用$定义变量名 :=赋予一个值,这个值是来自引用的
:=变量赋值,这个是go模板语言变量赋值的方法
[root@k8s-master ~]# helm install web mychart --dry-run
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
labels:
project: ms
app: gateway
test: web
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
labels:
{{- $releaseName := .Release.Name -}}
{{- with .Values.labels }}
project: {{ .project }}
app: {{ .app }}
test: {{ $releaseName }}
{{- end }}
Chart模板:变量
变量是实际应用中不多,但有时候结合with、range能更好处理数据。
[root@k8s-master ~]# vim mychart/values.yaml
env:
NAME: "gateway"
JAVA_OPTS: "-Xmx1G"
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
env:
{{- range $k,$v := .Values.env }}
- name: {{$k}}
value: {{ quote $v }}
{{- end}}
[root@k8s-master ~]# helm install web mychart --dry-run
env:
- name: JAVA_OPTS
value: "-Xmx1G"
- name: NAME
value: "gateway"
借用了循环加变量赋值的方式,有多少个都会去遍历,以某种格式填充到某个位置,Rang部分都会循环
Chart模板:命名模板
命名模板类似于开发语言中的函数。指一段可以直接被另一段程序或代码引用的程序或代码。
在编写chart时,可以将一些重复使用的内容写在命名模板文件中供公共使用,这样可减少重复编写程序段和简化代码结构。
命名模块使用define定义,template或include引入,在templates目录中默认下划线开头的文件为公共模板(helpers.tpl)。
将重复使用的内容放进去
[root@k8s-master ~]# vim mychart/templates/_helpers.tpl
{{- define "fullname" }}
{{- .Release.Name }}-{{ .Chart.Name }}
{{- end }}
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "fullname" . }}
namespace: default
[root@k8s-master ~]# helm install web mychart --dry-run
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-mychart
Template不能使用管道符,比如缩进就需要管道符,但是template是不支持的。这样就可以使用include解决这个问题
[root@k8s-master ~]# vim mychart/templates/_helpers.tpl
{{- define "fullname" }}
{{- .Release.Name }}-{{ .Chart.Name }}
{{- end }}
{{- define "labels" }}
app: "gateway"
project: "ms"
{{- end }}
[root@k8s-master ~]# vim mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "fullname" . }}
namespace: default
labels:
{{- include "labels" . | indent 4 }}
[root@k8s-master ~]# helm install web mychart --dry-run
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-mychart
namespace: default
labels:
project: ms
app: gateway
test: web
要使用缩进就要使用include的用法