在用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兼容的变量。

  1. 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中的配置了

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐