使用helm遇到一个奇怪的问题,无论我们在values文件中配置变量使用双引号还是单引号,如果是纯数字,在替换后都会变成整数类型。
正常来说,我们声明什么,helm原封不动的替换不就可以了吗,为什么会丢弃掉原本的单引号或双引号,而尝试转为整数类型呢?
举例:
在values.yaml文件中声明prometheus.username
变量:
prometheus:
username: '1491301'
在templates中通过{{.Values.prometheus.username}}
使用,部署后查看替换后的值,发现单引号不见了,并且还变成了科学计数。
部署会发生类型错误:
* Deployment in version "v1" cannot be handled as a Deployment: json: cannot unmarshal number into Go struct field EnvVar.spec.template.spec.containers.env.value of type string
怎么才能让它变成字符串呢?
试了无论单引号还是双引号都是不行的。给{{.Values.prometheus.username}}
加单引号==>'{{.Values.prometheus.username}}'
,也是不行。
同时还需要借助helm提供的函数才可以,例如使用toString函数:
'{{ toString .Values.prometheus.username }}'
这样替换后就是字符串了。
我个人的猜测:
helm在获取values.yaml文件中配置的值时,由于没有对应一个结构体来反序列化yaml,只能使用map来接收,例如map[string]interface{}
,那么反序列化后,helm再取值替换{{.Values.prometheus.username}}
时,可能是将interface{}
尝试转成数字,能够转换成功helm就误以为我们需要的就是数字了。而使用toString函数,就是强制将interface{}
转为字符串。