0
点赞
收藏
分享

微信扫一扫

Kubernetes Helm Chart模板:流程控制


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的用法

举报

相关推荐

0 条评论