Helm range循环仅生成最后一个容器问题求助
问题描述
我在Deployment模板中尝试通过遍历values.yaml里的多组镜像配置生成多个容器,但最终仅创建了最后一个镜像对应的容器,不符合预期。
配置文件
values.yaml
images: image1: name: "hjdsh" repository: nginx pullPolicy: IfNotPresent tag: "" initialDelaySeconds: 5 resources: requests: memory: "128Mi" cpu: "128m" limits: memory: "128Mi" cpu: "128m" image2: name: "kjbjk" repository: nginx pullPolicy: IfNotPresent tag: "" initialDelaySeconds: 5 resources: requests: memory: "128Mi" cpu: "128m" limits: memory: "128Mi" cpu: "128m"
_deployment.yaml(原错误版本)
{{- define "common-helm.deployment.tpl" -}} {{- $requiredMsg := include "common.default-check-required-msg" . -}} apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "common.name" .}} labels: {{- include "common.labels" . | nindent 4 }} spec: {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.deploymentReplicas }} {{- end }} minReadySeconds: {{ .Values.deployment.minReadySeconds | default 0 }} strategy: {} selector: matchLabels: app: {{- include "common.selectorLabels" . | nindent 6 }} template: metadata: labels: app: {{- include "common.labels" . | nindent 8 }} spec: {{- if .Values.gitlab.auth.enabled }} imagePullSecrets: - name: {{ include "common.fullname" . }}-gitlab-auth {{- end }} serviceAccountName: {{ .Values.serviceAccount.name | quote }} securityContext: fsGroup: {{ .Values.deployment.runAsUser | default 1000 }} runAsUser: {{ .Values.deployment.runAsUser | default 1000 }} runAsNonRoot: {{ .Values.deployment.runAsNonRoot | default true }} affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - {{ include "common.fullname" . }} topologyKey: "kubernetes.io/hostname" containers: {{- range $key, $value := .Values.images}} -name: {{ $value.name }}_{{ $key }} securityContext: runAsNonRoot: true runAsUser: 1200 image: {{ $value.repository }} imagePullPolicy: "" ports: -containerPort: 8080 resources: requests: memory: {{ $value.resources.requests.memory }} cpu: {{ $value.resources.requests.cpu }} limits: memory: {{ $value.resources.limits.memory }} cpu: {{ $value.resources.limits.cpu }} readinessProbe: httpGet: path: /v1/healthCheck port: 8080 initialDelaySeconds: "" periodSeconds: 10 {{- end }} {{- end }} {{- define "common-helm.deployment" -}} {{- include "common-helm.util.merge" (append . "common-helm.deployment.tpl") -}} {{- end -}}
问题原因
- YAML结构错误:Pod的
affinity和containers是spec的直接子项,不应嵌套在securityContext内,这会导致容器配置被错误解析。 - 语法格式错误:列表项标识
-后缺少空格(如-name、-containerPort),YAML无法识别为合法列表项。 - 变量引用错误:
imagePullPolicy和initialDelaySeconds未正确引用values.yaml中的配置值,而是使用了空字符串。 - 缩进不规范:
range循环内的容器配置缩进不一致,导致生成的YAML结构混乱。
修正后的_deployment.yaml
{{- define "common-helm.deployment.tpl" -}} {{- $requiredMsg := include "common.default-check-required-msg" . -}} apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "common.name" .}} labels: {{- include "common.labels" . | nindent 4 }} spec: {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.deploymentReplicas }} {{- end }} minReadySeconds: {{ .Values.deployment.minReadySeconds | default 0 }} strategy: {} selector: matchLabels: {{- include "common.selectorLabels" . | nindent 6 }} template: metadata: labels: {{- include "common.labels" . | nindent 8 }} spec: {{- if .Values.gitlab.auth.enabled }} imagePullSecrets: - name: {{ include "common.fullname" . }}-gitlab-auth {{- end }} serviceAccountName: {{ .Values.serviceAccount.name | quote }} # Pod级securityContext,与affinity、containers同级 securityContext: fsGroup: {{ .Values.deployment.runAsUser | default 1000 }} runAsUser: {{ .Values.deployment.runAsUser | default 1000 }} runAsNonRoot: {{ .Values.deployment.runAsNonRoot | default true }} # affinity移到spec下,与securityContext同级 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - {{ include "common.fullname" . }} topologyKey: "kubernetes.io/hostname" containers: {{- range $key, $value := .Values.images}} - name: {{ $value.name }}_{{ $key }} securityContext: runAsNonRoot: true runAsUser: 1200 image: {{ $value.repository }}:{{ default $.Chart.AppVersion $value.tag }} imagePullPolicy: {{ $value.pullPolicy }} ports: - containerPort: 8080 resources: requests: memory: {{ $value.resources.requests.memory }} cpu: {{ $value.resources.requests.cpu }} limits: memory: {{ $value.resources.limits.memory }} cpu: {{ $value.resources.limits.cpu }} readinessProbe: httpGet: path: /v1/healthCheck port: 8080 initialDelaySeconds: {{ $value.initialDelaySeconds }} periodSeconds: 10 {{- end }} {{- end }} {{- define "common-helm.deployment" -}} {{- include "common-helm.util.merge" (append . "common-helm.deployment.tpl") -}} {{- end -}}
关键修正点
- 调整
affinity和containers的位置,使其成为spec的直接子项,脱离securityContext嵌套。 - 修正列表项格式:
-name改为- name,-containerPort改为- containerPort。 - 正确引用配置变量:
imagePullPolicy: {{ $value.pullPolicy }}、initialDelaySeconds: {{ $value.initialDelaySeconds }}。 - 完善镜像标签:使用
{{ default $.Chart.AppVersion $value.tag }},优先使用配置中的tag,否则用Chart的appVersion。 - 统一缩进格式,确保生成的YAML结构合法。
内容的提问来源于stack exchange,提问作者Neeraj Yadav
相关产品推荐
相关产品推荐

