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

ArgoCD在Range循环中仅生成最后一个对应Ingress资源问题

问题:ArgoCD部署时仅生成Helm循环中的最后一个Ingress资源

本地执行helm template命令可正常输出3个Ingress自定义资源,但通过ArgoCD部署时,仅会生成Range循环中的最后一个Ingress资源。

原Ingress模板(ingress.yaml)

{{- range $index, $record :=  .Values.dnsRecords.cnameRecords }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cname-record-ingress-{{ $index }}
  namespace: {{ $.Values.deployment.namespace }}
  annotations:
    # Disable Cert-Manager
    cert-manager.io/issue-temporarily-disabled: "true"
    argocd.argoproj.io/sync-wave: "{{ $index }}"

    # ExternalDNS Annotations for CNAME Records
    external-dns.alpha.kubernetes.io/hostname: "{{ $record.name }}"
    external-dns.alpha.kubernetes.io/record-type: "CNAME"
    external-dns.alpha.kubernetes.io/target: "{{ $record.value }}"
    external-dns.alpha.kubernetes.io/ttl: "{{ $record.ttl | default 300 }}"
  labels:
    argocd.argoproj.io/instance: {{ $.Release.Name }}
spec:
  rules:
    - host: dummy.com-{{ $index }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: dummy-service-{{ $index }}
                port:
                  number: 80
{{- end }}

对应values.yaml配置

dnsRecords:
  cnameRecords:
  - name: "oopizw5ap7ktcbe._domainkey.example.com"
    value: "oopizw5ap7ktcbe.dkim.amazonses.com"
  - name: "uzq4rog4echrx._domainkey.example.com"
    value: "uzq4rog4echrxx.dkim.amazonses.com"
  - name: "jqq4x6xkorwe2._domainkey.example.com"
    value: "jqq4x6xkorwe2.dkim.amazonses.com"

问题原因

Helm模板通过Range循环生成多个YAML资源时,需要用---作为YAML文档分隔符,否则多个Ingress的YAML内容会被合并成一个文档。ArgoCD解析这种合并后的文档时,只会识别最后一个有效的Ingress定义,导致前面的资源被覆盖。

解决方案

在Range循环的每个Ingress资源之间添加YAML文档分隔符---,修正后的模板如下:

{{- range $index, $record :=  .Values.dnsRecords.cnameRecords }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cname-record-ingress-{{ $index }}
  namespace: {{ $.Values.deployment.namespace }}
  annotations:
    # Disable Cert-Manager
    cert-manager.io/issue-temporarily-disabled: "true"
    argocd.argoproj.io/sync-wave: "{{ $index }}"

    # ExternalDNS Annotations for CNAME Records
    external-dns.alpha.kubernetes.io/hostname: "{{ $record.name }}"
    external-dns.alpha.kubernetes.io/record-type: "CNAME"
    external-dns.alpha.kubernetes.io/target: "{{ $record.value }}"
    external-dns.alpha.kubernetes.io/ttl: "{{ $record.ttl | default 300 }}"
  labels:
    argocd.argoproj.io/instance: {{ $.Release.Name }}
spec:
  rules:
    - host: dummy.com-{{ $index }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: dummy-service-{{ $index }}
                port:
                  number: 80
{{- if not (eq $index (sub (len $.Values.dnsRecords.cnameRecords) 1)) }}
---
{{- end }}
{{- end }}

验证说明

修改模板后,重新通过ArgoCD部署,即可生成3个独立的Ingress资源。{{- if not (eq $index (sub (len $.Values.dnsRecords.cnameRecords) 1)) }} 这段逻辑会确保最后一个资源后不会多余添加分隔符,避免YAML格式错误。

内容的提问来源于stack exchange,提问作者aitoolkit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:23:17