Estoy tratando de instalar un gráfico en mi clúster pero recibo un error
Error: template: go-api/templates/deployment.yaml:18:24: executing "go-api/templates/deployment.yaml" at <.Values.deployment.container.name>: nil pointer evaluating interface {}.nameSin embargo, ejecuté los mismos comandos para otros 2 gráficos y funcionó bien.
El archivo de plantilla que estoy usando es este:
apiVersion: apps/v1 kind: Deployment metadata: namespace: {{ .Values.namespace}} labels: {{- include "chart.labels" . | nindent 4 }} name: {{ .Values.deployment.name}} spec: replicas: {{ .Values.deployment.replicas}} selector: matchLabels: {{ include "chart.matchLabels" . | nindent 6 }} template: metadata: labels: app.kubernetes.io/name: {{ template "chart.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ .Values.deployment.container.name }} image: {{ .Values.deployment.container.image }} imagePullPolicy: Never ports: - containerPort: {{ .Values.deployment.container.port }}Esto puede suceder si los valores de Helm que está utilizando para instalar no tienen ese bloque en particular:
namespace: default deployment: name: a-name replicas: 1 # but no container:Para evitar este error específico en el código de la plantilla, es útil seleccionar el diccionario principal en una variable; luego, si el padre está totalmente ausente, puede decidir qué hacer al respecto. Esta técnica es un poco más útil si hay campos opcionales o valores predeterminados sensibles:
{{- $deployment := .Values.deployment | default dict }} metadata: name: {{ $deployment.name | default (include "chart.fullname" .) }} spec: {{- if $deployment.replicas }} replicas: {{ $deployment.replicas }} {{- end }} Si realmente no puede trabajar sin el valor, Helm tiene una función required no documentada que puede imprimir un mensaje de error más específico.
{{- $deployment := .Values.deployment | required "deployment configuration is required" }} (Mi experiencia ha sido que los valores required son algo frustrantes como usuario final, especialmente si está tratando de ejecutar el gráfico de otra persona, y trataría de evitar esto si es posible).
Dado lo que muestra, también es posible que esté haciendo que el gráfico sea demasiado configurable. El nombre del contenedor, por ejemplo, es principalmente un detalle que solo aparece si tiene un pod de varios contenedores (o está usando Istio); el puerto del contenedor es un atributo fijo de la imagen que está ejecutando. Puede corregir estos valores de forma segura en el archivo de plantilla de Helm y, luego, es razonable proporcionar valores predeterminados para cosas como el recuento de réplicas o el nombre de la imagen (considere establecer el nombre del repositorio, el nombre de la imagen y la etiqueta como variables separadas).
{{- $deployment := .Values.deployment | default dict }} {{- $registry := $deployment.registry | default "docker.io" }} {{- $image := $deployment.image | default "my/image" }} {{- $tag := $deployment.tag | default "latest" }} containers: - name: app # fixed image: {{ printf "%s/%s:%s" $registry $image $tag }} {{- with .Values.imagePullPolicy }} imagePullPolicy: {{ . }} {{- end }} ports: - name: http containerPort: 3000 # fixedSi el valor está definido en su archivo de valores y aún recibe el error, entonces el problema podría deberse al acceso a ese valor dentro del range o una función similar que cambia el contexto.
Por ejemplo, para usar una plantilla con nombre mySuffix que se ha definido con .Values y usar ese range interno con la función de template , debemos proporcionar $ a la función de template en lugar del habitual . :
{{- define "mySuffix" -}} {{- .Values.suffix }} {{- end }} ... {{- range .Values.listOfValues }} echo {{ template "mySuffix" $ }} {{- end }}