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

Skaffold setValues丢失Helm值:ingress.tls[0].hosts缺失问题

问题:Skaffold setValues配置Helm时嵌套数组值丢失

使用Skaffold的setValues配置Helm时出现值丢失问题:将Ingress的TLS主机配置写在setValues中时,生成的Ingress资源里ingress.tls[0].hosts字段为空;但把相同配置保存到values.yml并通过valuesFiles引用时,渲染完全正常。推测是setValues无法正确识别嵌套数组结构,相关示例如下:

skaffold.yaml配置

apiVersion: skaffold/v2beta29
kind: Config
build:
  local:
    push: false
  tagPolicy:
    sha256: {}
  artifacts:
  - image: example
    jib: {}
    sync:
      auto: false
deploy:
  helm:
    releases:
    - name: example
      chartPath: backend-app
      artifactOverrides:
        image: example
      imageStrategy:
        helm: {}
      setValues:
        ingress:
          enabled: true
          className: nginx
          hosts:
            - host: example.minikube
              paths:
                - path: /
                  pathType: ImplementationSpecific
          tls:
            - secretName: example-tls
              hosts:
                - example.minikube

skaffold run命令及日志

执行命令:

skaffold run -v TRACE

关键日志片段:

[...]
DEBU[0106] Running command: [
helm --kube-context minikube install example backend-app --set-string image.repository=example,image.tag=6ad72230060e482fef963b295c0422e8d2f967183aeaca0229838daa7a1308c3 --set ingress.className=nginx --set --set ingress.enabled=true --set ingress.hosts[0].host=example.minikube --set ingress.hosts[0].paths[0].path=/ --set ingress.hosts[0].paths[0].pathType=ImplementationSpecific --set ingress.tls[0].secretName=example-tls]  subtask=0 task=Deploy
[...]

生成的Ingress资源清单

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example
spec:
  ingressClassName: nginx
  tls:
    - hosts:
      secretName: example-tls
  rules:
    - host: "example.minikube"
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: example
                port:
                  number: 80
解答

从Skaffold的TRACE日志可以看到,它生成的Helm命令里缺少了--set ingress.tls[0].hosts[0]=example.minikube这一参数,这就是ingress.tls[0].hosts为空的直接原因。这是旧版本Skaffold(如你使用的v2beta29)在解析setValues中嵌套字符串数组时的已知bug。

可以通过以下几种方式解决:

  1. 改用valuesFiles配置(稳定方案)
    把Ingress相关配置写入单独的values文件(比如ingress-values.yml),然后在Skaffold的Helm配置中通过valuesFiles引用:

    deploy:
      helm:
        releases:
        - name: example
          # ...其他配置
          valuesFiles:
            - ingress-values.yml
    

    这种方式能完全避免setValues的解析问题,也是Helm推荐的配置方式。

  2. 手动指定数组索引的set格式
    在setValues中直接用Helm的--set参数格式来定义嵌套数组项,绕过Skaffold的自动解析:

    setValues:
      ingress:
        enabled: true
        className: nginx
        hosts:
          - host: example.minikube
            paths:
              - path: /
                pathType: ImplementationSpecific
        tls[0].secretName: example-tls
      ingress.tls[0].hosts[0]: example.minikube
    

    这样Skaffold会正确生成对应的--set参数。

  3. 升级Skaffold版本
    该嵌套数组解析bug在后续的Skaffold稳定版本中已被修复,升级到较新的版本(比如v2.x的最新稳定版)可以直接解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:55:20