Helm chart在values文件中声明为字符串的变量,部署替换占位符后却变成了数字类型

原创 吴就业 214 0 2024-04-19

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/bb073de1a21e49bdbf38a14788427ad3

作者:吴就业
链接:https://wujiuye.com/article/bb073de1a21e49bdbf38a14788427ad3
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

使用helm遇到一个奇怪的问题,无论我们在values文件中配置变量使用双引号还是单引号,如果是纯数字,在替换后都会变成整数类型。

正常来说,我们声明什么,helm原封不动的替换不就可以了吗,为什么会丢弃掉原本的单引号或双引号,而尝试转为整数类型呢?

举例:

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{}转为字符串。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

如何自己部署autoscaler实现节点的自动扩缩容(三):验证修改缩容节点时长

autoscaler,想要缩短空闲节点被回收的时间,需要同时考虑三个启动参数的配置:scale-down-unneeded-time、unremovable-node-recheck-timeout、scale-down-delay-after-add。

如何自己部署autoscaler实现节点的自动扩缩容(二):支持自定义调度器触发的扩容

想要让autoscaler支持自定义调度器触发节点扩展,有两种方案。一是autoscaler支持自定义调度器的过滤器插件,二是autoscaler取消check逻辑。

如何自己部署autoscaler实现节点的自动扩缩容(一):本地debug运行autoscaler

在google cloud上使用gke集群,gke已经集成autoscaler,通过在控制台创建节点池点击开启自动扩缩容就可以,那么为什么还要自己部署呢?怎么本地让autoscaler成功跑起来呢?

kubebuilder如何Watch由Pod产生的Event的创建,触发控制器Reconcile方法的执行

自定义资源的Controller创建出来的子资源,子资源创建的子资源(子子资源),如何Watch子子资源的事件?我们以MyDeployment->创建Pod->创建Event,想要watch Pod创建的Event的Create事件为例。

Kubebuilder控制器配置Owns然而监听到事件却不触发Reconcile方法

我们在CreateFunc、DeleteFunc、UpdateFunc方法中添加日记,发现这些方法被调用了,但却没有触发控制器的Reconcile方法执行。

满足Autoscaler触发自定扩容Node的条件是什么?

我们使用自定义的调度器来调度pod,有自定义的Filter插件。Autoscaler在执行扩容之前,会调用Filter插件,尝试是不是真的没有node满足调度这个pod再去扩容。而默认情况下,Autoscaler拿的是默认的Filter插件,拿不到我们自定义的Filter插件,所以没有走我们的Filter逻辑,所以不会扩容。