问题1:获取数组键值

在 range 循环中使用 $k 和 $v 两个变量来接收后面列表循环的键和值

values.yaml

env:
  NAME: "gateway"
  JAVA_OPTS: "-Xmx1G"

deployment.yaml

...
env:
  {{- range $k, $v := .Values.env }}
    - name: {{ $k }}
      value: {{ $v | quote }}
   {{- end }}

结果如下

env:
  - name: JAVA_OPTS
    value: "-Xmx1G"
  - name: NAME
    value: "gateway"

问题2:with 中不能使用内置对象

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
spec:
  replicas: {{ .Values.replicas }}
  template:
metadata:
  labels:
    project: {{ .Values.label.project }}
    app: {{ quote .Values.label.app }}
   {{- with .Values.label }}
     project: {{ .project }}
     app: {{ .app }}
     release: {{ .Release.Name }}
    {{- end }}

with 语句块内不能带 .Release.Name 对象,否则发生如上报错。我们可以将该对象赋值给一个变量可以来解决这个问题:

{{- $releaseName := .Release.Name -}}
{{- with .Values.label }}
  project: {{ .project }}
  app: {{ .app }}
  release: {{ $releaseName }}

重新整理

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
spec:
  replicas: {{ .Values.replicas }}
  template:
metadata:
  labels:
    project: {{ .Values.label.project }}
    app: {{ quote .Values.label.app }}
   {{- $releaseName := .Release.Name -}}
   {{- with .Values.label }}
     project: {{ .project }}
     app: {{ .app }}
     release: {{ $releaseName }}
    {{- end }}0

可以看到在with 语句上面增加了一句 {{- $releaseName:=.Release.Name- }},其中$releaseName 就是后面的对象的一个引用变量,它的形式就是 $name,赋值操作使用:=,这样with 语句块内部的$releaseName 变量仍然指向的是.Release.Name