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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值