k8s 部署springboot+redis报无法从string转化为 int问题
在用k8s部署springboot项目时,碰到一个问题,卡了1天多。在启动springboot时,控制台输出错误, ${REDIS_HOST:6379} 无法从string转化为 int,REDIS_HOST的值为 tcp:xxx.xxx.xxx:6379 。网上查询一番后,说是环境变量的问题,spring配置有个生效优先级属性文件的读取顺序大概是:java se运行时系统属性 >系统环境变
在用k8s部署springboot项目时,碰到一个问题,卡了1天多。
在启动springboot时,控制台输出错误, ${REDIS_HOST:6379} 无法从string转化为 int,
REDIS_HOST的值为 tcp:xxx.xxx.xxx:6379 。
网上查询一番后,说是环境变量的问题,spring配置有个生效优先级
属性文件的读取顺序大概是:
java se运行时系统属性 >系统环境变量属性>bootstrap.properties> bootstrap-dev.properties >configService 配置中心属性源>application属性源> application-dev属性源
也就意味着REDIS_HOST被替换成了tcp:xxx.xxx.xxx:6379。奇不奇怪。
application.yml配置的是${REDIS_HOST:6379},按理是没问题的。结合上面属性文件的读取顺序,怀疑是系统环境变量中也有REDIS_HOST。查了N多资料后,最终找到了一段话给我我思路
创建Pod资源时,kubelet会将其所属名称空间内的每个活动的Service对象以一系列环境变量的形式注入其中。它支持使用Kubernetes Service环境变量以及与Docker的links兼容的变量。
-
kubernetes Service 环境变量
Kubernetes为每个Service资源生成包括以下形式的环境变量在内的一系列环境变量,在同一名称空间中创建的Pod对象都会自动拥有这些变量。
{SVCNAME}_SERVICE_HOST
{SVCNAME}_SERVICE_PORT
如果SVCNAME中使用了连接线,那么Kubernetes会在定义为环境变量时将其转换为下划线。
标红的那句话最终解开了谜题,因为在创建 redis的service是,将name命名成了redis,所以按照以上逻辑,k8s会拼接一个 REDIS_HOST环境变量注入到我的springboot容器当中,而注入的值是tcp:xxx.xxx.xxx:6379,导致了错误的发生
解决:
将k8s 中声明service的文件 reids_service.yml中,name改成 xxx_redis即可。最终k8s生成变量为 xxx_REIDS_HOST,也就影响不到我springboot中的配置了
更多推荐
所有评论(0)