Helm模板报错‘error calling ge: incompatible types for comparison’求助
解决Helm模板中minReplicas类型不兼容的比较错误
问题场景
需要基于HPA的minReplicas值动态设置PDB的minAvailable参数,编写的Helm模板逻辑如下:
spec: {{ if (ge .Values.autoscaling.minReplicas 5) }} minAvailable: 80 {{ else if (eq .Values.autoscaling.minReplicas 4) }} minAvailable: 75 {{ else if (eq .Values.autoscaling.minReplicas 3) }} minAvailable: 65 {{ else if (eq .Values.autoscaling.minReplicas 2) }} minAvailable: 50 {{ else }} minAvailable: 0
执行Helm dry run时触发类型不兼容的比较错误,报错信息:
Error: INSTALLATION FAILED: template: service/templates/pdb.yaml:11:7: executing "service/templates/pdb.yaml" at <ge .Values.autoscaling.minReplicas 5>: error calling ge: incompatible types for comparison helm.go:84: [debug] template: service/templates/pdb.yaml:11:7: executing "ffservice/templates/pdb.yaml" at <ge .Values.autoscaling.minReplicas 5>: error calling ge: incompatible types for comparison INSTALLATION FAILED main.newInstallCmd.func2 helm.sh/helm/v3/cmd/helm/install.go:127 github.com/spf13/cobra.(*Command).execute github.com/spf13/cobra@v1.4.0/command.go:856 github.com/spf13/cobra.(*Command).ExecuteC github.com/spf13/cobra@v1.4.0/command.go:974 github.com/spf13/cobra.(*Command).Execute github.com/spf13/cobra@v1.4.0/command.go:902 main.main helm.sh/helm/v3/cmd/helm/helm.go:83 runtime.main runtime/proc.go:255 runtime.goexit runtime/asm_amd64.s:158
曾尝试用int(.Values.autoscaling.minReplicas)进行类型转换,即{{ if (ge int(.Values.autoscaling.minReplicas) 5) }},但仍出现相同错误。
解决方案
1. 纠正类型转换的语法
Helm使用Go模板语法,函数调用不需要括号,参数通过空格分隔。正确的整数转换写法是int .Values.autoscaling.minReplicas,修改后的模板如下:
spec: {{- $minReplicas := int .Values.autoscaling.minReplicas }} {{ if (ge $minReplicas 5) }} minAvailable: 80 {{ else if (eq $minReplicas 4) }} minAvailable: 75 {{ else if (eq $minReplicas 3) }} minAvailable: 65 {{ else if (eq $minReplicas 2) }} minAvailable: 50 {{ else }} minAvailable: 0 {{ end }}
- 先把转换后的值赋值给变量
$minReplicas,避免重复转换,提升可读性。 - 确保
.Values.autoscaling.minReplicas是可以转换为整数的有效值(比如字符串"3"或数字3)。
2. 确保Values中的值为整数类型
如果values.yaml中autoscaling.minReplicas是字符串类型(比如"3"),即使转换也可能出现问题,建议直接在values.yaml中定义为整数:
autoscaling: minReplicas: 3
3. 容错处理:默认值与安全转换
如果不确定minReplicas是否存在或是否为有效数字,可以添加默认值并使用atoi函数(处理字符串转整数,失败时返回0):
spec: {{- $minReplicas := atoi (toString (default "0" .Values.autoscaling.minReplicas)) }} {{ if (ge $minReplicas 5) }} minAvailable: 80 {{ else if (eq $minReplicas 4) }} minAvailable: 75 {{ else if (eq $minReplicas 3) }} minAvailable: 65 {{ else if (eq $minReplicas 2) }} minAvailable: 50 {{ else }} minAvailable: 0 {{ end }}
default "0"确保当值不存在时使用默认值"0"toString确保输入是字符串类型,适配atoi函数要求atoi将字符串转为整数,转换失败时返回0
内容的提问来源于stack exchange,提问作者Aravindhan P
相关产品推荐
相关产品推荐

