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

如何在Helm中判断microservices子映射是否存在ingress.enabled键?

简化Helm模板中Ingress Enabled字段的判断逻辑

场景与需求

现有如下values.yaml配置:

microservices:
  - name: service-1
  - name: service-2
    ingress:
      enabled: false

需要遍历microservices列表时,判断每个服务的ingress.enabled是否存在:

  • 若存在则使用该值
  • 若不存在则 fallback 到$.Values.common.ingress.enabled的默认值

当前使用的模板代码如下:

{{ if and (hasKey . "ingress") (hasKey .ingress "enabled") }}
    {{ $ingress = .ingress.enabled }}
{{ else }}
    {{ $ingress = $.Values.common.ingress.enabled }}
{{ end }}

希望简化这段逻辑,避免嵌套的hasKey判断;但直接使用(hasKey .ingress "enabled")会触发报错:
"at <.ingress>: wrong type for value; expected map[string]interface {}; got interface {}"
原因是service-1未定义ingress字段,此时.ingress是nil而非map类型,导致hasKey函数类型校验失败。

解决方案

方案1:使用dig函数(推荐,Helm 3.5+支持)

dig函数专门处理多级嵌套字段访问,自动处理中间层级不存在或类型错误的情况,直接返回默认值:

{{ $ingress := dig "ingress" "enabled" $.Values.common.ingress.enabled . }}
  • 逻辑:依次查找当前上下文(.)中的ingress→enabled路径
  • 若任意一级不存在/类型不匹配,直接返回最后一个参数作为默认值

方案2:使用with块(兼容旧版Helm)

利用with块特性:仅当目标值存在且非空时执行块内逻辑,否则保持默认值:

{{ $ingress := $.Values.common.ingress.enabled }}
{{ with .ingress.enabled }}
    {{ $ingress = . }}
{{ end }}
  • 注意:即使ingress.enabled被显式设为false,with块也会正常执行(false在Go模板中属于有效非空值),符合需求。

方案3:index+default组合

通过index函数按路径取值,再用default处理空值:

{{ $ingress := default $.Values.common.ingress.enabled (index . "ingress" "enabled" | default nil) }}
  • index . "ingress" "enabled"尝试按路径取值,若中间层级不存在则返回nil
  • 外层default将nil替换为预设的默认值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:15:04