我正在尝试将图表安装到我的集群,但出现错误
Error: template: go-api/templates/deployment.yaml:18:24: executing "go-api/templates/deployment.yaml"
at <.Values.deployment.container.name>: nil pointer evaluating interface {}.name
但是我对另外 2 个图表执行了相同的命令,效果很好。
我使用的模板文件是这样的:
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 }}
如果您用于安装的 Helm 值没有该特定块,则可能会发生这种情况:
namespace: default
deployment:
name: a-name
replicas: 1
# but no container:
为了避免模板代码中的这种特定错误,将父字典挑选到变量中是有用的;然后,如果父母完全不在,你可以决定该怎么做。如果有可选字段或合理的默认值,此技术会更有用:
{{- $deployment := .Values.deployment | default dict }}
metadata:
name: {{ $deployment.name | default (include "chart.fullname" .) }}
spec:
{{- if $deployment.replicas }}
replicas: {{ $deployment.replicas }}
{{- end }}
如果您确实无法在没有该值的情况下工作,Helm 有一个未记录的
required
函数,可以打印更具体的错误消息。
{{- $deployment := .Values.deployment | required "deployment configuration is required" }}
(我的经验是,作为最终用户,
required
值有些令人沮丧,特别是当您尝试运行其他人的图表时,如果可能的话,我会尽力避免这种情况。)
鉴于您所显示的内容,您也有可能使图表太可配置。例如,容器名称主要是一个只有在您拥有多容器 pod(或正在使用 Istio)时才会出现的详细信息;容器端口是您正在运行的映像的固定属性。您可以安全地在 Helm 模板文件中修复这些值,然后为副本计数或映像名称等提供默认值是合理的(考虑将存储库名称、映像名称和标记设置为单独的变量)。
{{- $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 # fixed
如果该值是在您的值文件中定义的,并且您仍然收到错误,则问题可能是由于在
range
或类似函数中访问该值而更改了上下文。
例如,要使用已通过
mySuffix
定义的命名模板 .Values
并在 range
内部使用 template
函数,我们需要向 $
函数提供 template
,而不是通常的函数.
:
{{- define "mySuffix" -}}
{{- .Values.suffix }}
{{- end }}
...
{{- range .Values.listOfValues }}
echo {{ template "mySuffix" $ }}
{{- end }}
检查您的 Values.yaml 文件名是否太大?并确保描述值时没有太多字符。这解决了我的问题。