Skaffold setValues丢失Helm值:ingress.tls[0].hosts缺失问题
使用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。
可以通过以下几种方式解决:
改用valuesFiles配置(稳定方案)
把Ingress相关配置写入单独的values文件(比如ingress-values.yml),然后在Skaffold的Helm配置中通过valuesFiles引用:deploy: helm: releases: - name: example # ...其他配置 valuesFiles: - ingress-values.yml这种方式能完全避免setValues的解析问题,也是Helm推荐的配置方式。
手动指定数组索引的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参数。升级Skaffold版本
该嵌套数组解析bug在后续的Skaffold稳定版本中已被修复,升级到较新的版本(比如v2.x的最新稳定版)可以直接解决问题。
内容的提问来源于stack exchange,提问作者m18unet

