Chart模板:流程控制 if/else
- 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:
[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 <值> }}
# 限制范围
{{ 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
[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模板:变量
[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的用法