Kubernetes Ingress模板中基于active字段过滤主机配置
解决Ingress模板仅包含active为true的主机条目问题
现有配置文件
Values.yaml
ingress: {backendServiceName: serv-swarm-lc001, cluster_issuer: letsencrypt-oe-dev-001, ingressClassName: nginx-lc001, tls_acme: 'true'} route: hosts: abcM: active: false host: chair112.abc.com logicalclustername: lc001 offboardtimestamp: null physicalclustername: oe-dev-001 region: us-east-1 status: Triggered timestamp: |- { "timestamp": "2024-02-05T14:43:18.00847359Z" } SDzWAgVebH: active: true host: bis311.abc.com logicalclustername: lc001 offboardtimestamp: NA physicalclustername: oe-dev-001 region: us-east-1 status: triggered timestamp: |- { "timestamp": "2024-04-04T15:54:21.649644213Z" }
原Ingress模板
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster-issuer: {{ .Values.ingress.cluster_issuer }} kubernetes.io/tls-acme: {{ .Values.ingress.tls_acme | quote }} nginx.ingress.kubernetes.io/client-max-body-size: 16m nginx.ingress.kubernetes.io/proxy-body-size: 16m name: ingress-{{ .Release.Name }} namespace: {{ .Release.Namespace }} labels: {{ include "common.labels" . | indent 4 }} spec: ingressClassName: {{ .Values.ingress.ingressClassName }} rules: {{- range .Values.route.hosts }} - host: {{ - if .Values.route.hosts.host.active }} {{- end }} http: paths: - backend: service: name: {{ $.Values.ingress.backendServiceName }} port: number: 80 path: / pathType: Prefix - backend: service: name: swaggerservice port: number: 80 path: /swagger pathType: Prefix {{- end }} tls: {{- range .Values.route.hosts }} - hosts: - {{ .host | quote }} secretName: commodo-tls5 {{- end }}
问题分析
原模板中条件判断写法错误:在range循环内部,当前迭代对象是单个host条目,直接用.active即可获取当前条目的active值,无需调用.Values.route.hosts.host.active,错误的引用路径导致模板解析失败。
修改后的正确Ingress模板
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster-issuer: {{ .Values.ingress.cluster_issuer }} kubernetes.io/tls-acme: {{ .Values.ingress.tls_acme | quote }} nginx.ingress.kubernetes.io/client-max-body-size: 16m nginx.ingress.kubernetes.io/proxy-body-size: 16m name: ingress-{{ .Release.Name }} namespace: {{ .Release.Namespace }} labels: {{ include "common.labels" . | indent 4 }} spec: ingressClassName: {{ .Values.ingress.ingressClassName }} rules: {{- range $key, $host := .Values.route.hosts }} {{- if eq $host.active true }} - host: {{ $host.host | quote }} http: paths: - backend: service: name: {{ $.Values.ingress.backendServiceName }} port: number: 80 path: / pathType: Prefix - backend: service: name: swaggerservice port: number: 80 path: /swagger pathType: Prefix {{- end }} {{- end }} tls: {{- range $key, $host := .Values.route.hosts }} {{- if eq $host.active true }} - hosts: - {{ $host.host | quote }} secretName: commodo-tls5 {{- end }} {{- end }}
关键修改点说明
- 循环变量命名:将
range .Values.route.hosts改为range $key, $host := .Values.route.hosts,明确迭代的键值对,方便直接引用当前host的属性。 - 条件判断逻辑:在
range内部添加{{- if eq $host.active true }},仅渲染active值为true的host条目,false的条目会被跳过。 - host值正确引用:直接使用
$host.host获取当前条目的域名,同时加上quote确保输出为字符串格式,符合Kubernetes YAML规范。 - 全局变量引用:在循环内部引用根层级的Values时,使用
$.Values(比如$.Values.ingress.backendServiceName),避免上下文切换导致的变量引用错误。
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

