侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 297 篇文章
  • 累计创建 134 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Helm3入门教程-20:Helm3 变量的定义和使用

孔子说JAVA
2022-04-30 / 0 评论 / 0 点赞 / 178 阅读 / 3,125 字 / 正在检测是否收录...

Helm3入门教程全系列,26小时轻松掌握Helm

在编程语言中还有一个很重要的概念“变量”,在 Helm 模板中也有变量,只是使用变量的场合不是特别多,但是在合适的时候使用变量可以很好的解决我们的问题。如变量搭配 withrange 使用,可以有效的简化代码。

  • 在 Helm 模板中,变量是对另一个对象的命名引用。

1、变量的定义和使用

变量的格式定义:$name := value,其中 := 被称为赋值运算符,$name为变量,value为值。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

在该例{{- $relname := .Release.Name -}}中,定义了一个变量 $relname ,在 release: {{ $relname }}中使用了这个变量。

2、使用变量解决对象作用域问题

在前面的例子中,我们看到这段代码会失败:

  {{- with .Values.favorite}}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ .Release.Name }}
  {{- end }}

Release.Name 不在该 with 块中限制的范围内。解决作用域范围问题的一种方法是将对象分配给可以在不考虑当前范围的情况下访问的变量。我们可以使用变量重写上面的 Release.Name

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

我们可以看到在开始 with 块之前增加了一句 $relname :=.Release.Name,其中releaseName就是后面的对象的一个引用变量。现在在with块内部,releaseName就是后面的对象的一个引用变量。现在在 **with** 块内部,`relname 变量仍然指向的是.Release.Name`。执行模板结果如下:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: viable-badger-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  release: viable-badger

可以看到已经正常了。

3、变量与range的结合

变量在 range 循环中特别有用。它们可以用于类似列表的对象以同时捕获 索引

  toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
      {{ $index }}: {{ $topping }}
    {{- end }}

我们在range循环中使用 $index$course 两个变量来接收后面 列表 循环的索引和对应的值,这将分配整数索引(从零开始)给 $index,值给 $topping。最终可以得到如下结果:

  toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions

对于同时具有键和值的数据结构,我们可以使用 range 来循环获得二者的值。例如,我们可以对 .Values.favorite 像这样循环:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite}}
  {{ $key }}: {{ $val | quote }}
  {{- end }}

使用变量$key$val来接收字段 .Values.favorite 的键和值。在第一次迭代中,$key 是 drink,$val 是 coffee,第二次,$key 是 food,$val 是 pizza。运行上面的代码结果如下:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eager-rabbit-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"

4、全局变量$

变量通常不是 “全局” 的。它们的范围是它们所在的块。之前,我们在模板的顶层赋值 $relname。该变量将在整个模板的范围内起作用。但在我们的最后一个例子中,$key$val 只会在该 {{ range... }}{{ end }} 块的范围内起作用。

但有个变量一直是全局的 $, 这个变量一直是指向根的上下文。当在一个范围内循环时会很有用,同时你要知道chart的版本名称。

举例说明如下:

{{- range .Values.tlsSecrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  labels:
    # Many helm templates would use `.` below, but that will not work,
    # however `$` will work here
    app.kubernetes.io/name: {{ template "fullname" $ }}
    # I cannot reference .Chart.Name, but I can do $.Chart.Name
    helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
    app.kubernetes.io/instance: "{{ $.Release.Name }}"
    # Value from appVersion in Chart.yaml
    app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
    app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
  tls.crt: {{ .certificate }}
  tls.key: {{ .key }}
---
{{- end }}
0

评论区