You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 -}}

问题原因

  1. YAML结构错误:Pod的affinity和containers是spec的直接子项,不应嵌套在securityContext内,这会导致容器配置被错误解析。
  2. 语法格式错误:列表项标识-后缺少空格(如-name、-containerPort),YAML无法识别为合法列表项。
  3. 变量引用错误:imagePullPolicy和initialDelaySeconds未正确引用values.yaml中的配置值,而是使用了空字符串。
  4. 缩进不规范: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:10:18