使用 Helm helper.tpl 从 values.yaml 或 Chart.yaml 设置存储库和映像

Using Helm helper.tpl to set repository and image from the values.yaml or Chart.yaml

我有几个不同产品的图表。在第一个中,编写了一个帮助程序来构建存储库、图像名称和 tag/version。这行得通,但由于另一个图表完全不同,我采用了一种更简单的方法,但行不通。我收到错误,

error calling include: template: MYChart/templates/_helpers.tpl:94:28: executing "getImageName" at <.Values.registryName>: nil pointer evaluating interface {}.registryName

这是帮手。

{{/*
This allows us to not have image: .Values.xxxx.ssss/.Values.xxx.xxx:.Values.ssss
in every single template.
*/}}
{{- define "imageName" -}}
{{- $registryName := .Values.registryName -}}
{{- $imageName := .Values.imageName -}}
{{- $tag := .Chart.AppVersion -}}
{{- printf "%s/%s:%s" $registryName $imageName $tag -}}
{{- end -}}

这些是值

registry:
  registryName: "index.docker.io/myrepo"
  image_Name: "myimage"

在 _helper.tpl 中调用上面的值应该可行,有很多使用这种方法的示例。我错过了什么?

模板文件:

{{- $root := . -}}
{{- $FullChartName := include "myapp.fullname" . -}}
{{- $ChartName := include "myapp.name" . -}}
{{- range $worker, $parameter := .Values.workerPods }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $parameter.name }}-worker
spec:
  replicas: {{ $parameter.replicas }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ $parameter.name }}-worker
      app.kubernetes.io/instance: {{ $root.Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ $parameter.name }}-worker
        app.kubernetes.io/instance: {{ $root.Release.Name }}
        autoscale: "true"
      annotations:
      {{- if $root.Values.worker.annotations }}
      {{ toYaml $root.Values.worker.annotations | indent 8 }}
      {{- end }}
    spec:
      imagePullSecrets:
        - name: myapp-registry-credentials
      containers:
        - name: {{ $parameter.name }}-worker
          image: {{ template "imageName" . }}
          imagePullPolicy: {{ $root.Values.worker.image.pullPolicy }}
          command: ["/bin/sh"]
          args: ["-c", "until /usr/bin/pg_isready -h $DATABASE_HOST; do sleep 2; done; bundle exec rake jobs:work"]
          {{- range $container, $containerResources := $root.Values.containers }}
          {{- if eq $container $parameter.size }}
          resources:
            {{- toYaml $containerResources.resources | nindent 12 }}
          {{- end }}
          {{- end }}
          envFrom:
            - configMapRef:
                name: common-env
            - secretRef:
                name: myapp-secrets          

          volumeMounts:
          - name: mnt-data
            mountPath: "/mnt/data"
      volumes:
        - name: mnt-data
          persistentVolumeClaim:
            claimName: myapp-pvc
      {{- with $root.Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with $root.Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with $root.Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}
{{- end }}

我也尝试过这种方法并将以下内容添加到 Chart.yaml 但得到了类似的错误,老实说,我不确定这是否有效,但有兴趣听听其他人的想法。

annotations:
  image: "myimage"
  registry: "index.docker.io/myrepo"

帮手看起来像这样。

{{/*
This allows us to not have image: .Values.xxxx.ssss/.Values.xxx.xxx:.Values.ssss
in every single template.
*/}}
{{- define "imageName" -}}
{{- $registryName := .Chart.Annotations.registry -}}
{{- $imageName := .Chart.Annotations.image -}}
{{- $tag := .Chart.AppVersion -}}
{{- printf "%s/%s:%s" $registryName $imageName $tag -}}
{{- end -}}

您在调用模板时使用了错误的参数。将 Helm 模板文件减少到最低限度以证明这一点:

{{- $root := . -}}
{{- range $worker, $parameter := .Values.workerPods }}
image: {{ template "imageName" . }}
imagePullPolicy: {{ $root.Values.worker.image.pullPolicy }}
{{- end }}

标准 Go text/template range 语句重新绑定 . 变量(我相信与 $parameter 相同)。因此,当您调用 imageName 模板时,它的参数不是 Helm 根值,而是值文件中的块; .Values 未定义且 returns nil;然后 .Values.registryName 是对 nil 的查找,它会产生您看到的错误。

一个标准的解决方法是将 . 保存到 range 循环之外的一个变量,并在任何你会使用 . 的地方使用该变量。事实上,您已经这样做了,下一行中的 $root.Values.worker... 引用应该可以正常工作。您只需要在通话时更改此设置:

image: {{ template "imageName" $root }}