Kubernetes Helm Chart模板:流程控制

网友投稿 601 2022-09-07

Kubernetes Helm Chart模板:流程控制

Chart模板:流程控制 if/else

Helm模板语言提供以下流程控制语句:

if/else:条件判断range:循环with:指定变量作用域

Ingress并不是所有的应用都需要启用,微服务里面比如gateway和portal这种微服务暴露在集群之外,用户可以访问到。商品服务和订单服务属于业务处理逻辑不需要让外部访问,只需要让gateway这个接口转发给后面的服务就行了,这个通信是在集群内部通信的。所以商品服务和订单服务是不需要启动ingress的

这里使用if else相对于加了开关

[root@k8s-master ~]# vim mychart/values.yamlingress: enabled: true

[root@k8s-master ~]# cat mychart/templates/ingress.yaml {{ if .Values.ingress.enabled }}apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: web1spec: rules: - host: web1.ctnrs.com 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.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: web1spec: rules: - host: web1.ctnrs.com 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: v1kind: ConfigMapmetadata: name: {{ .Release.Name }}data: test: | {{- range .Values.test }} {{ . }} {{- end }} [root@k8s-master ~]# helm install web mychart/ --dry-run# Source: mychart/templates/configmap.ymlapiVersion: v1kind: ConfigMapmetadata: name: webdata: test: | 1 2 3---

这个对象是循环里面遍历出来的,使用.去引用

Chart模板:流程控制之with

with:指定变量作用域

语法:

{{ with <值> }}

# 限制范围

{{ end }}

[root@k8s-master ~]# vim mychart/templates/deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: 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.yamlapiVersion: apps/v1kind: Deploymentmetadata: 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/v1kind: Deploymentmetadata: name: {{ template "fullname" . }} namespace: default

[root@k8s-master ~]# helm install web mychart --dry-run# Source: mychart/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: 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/v1kind: Deploymentmetadata: name: {{ template "fullname" . }} namespace: default labels:{{- include "labels" . | indent 4 }}

[root@k8s-master ~]# helm install web mychart --dry-run# Source: mychart/templates/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: web-mychart namespace: default labels: project: ms app: gateway test: web

要使用缩进就要使用include的用法

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Kubernetes Kubeadm Kubelet 证书自动续签
下一篇:广告情报局:OPPO同学录,好好说再见!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~