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
相关产品推荐
相关产品推荐

