K8s集群Node.js连接Redis报value not integer类ReplyError求解
问题触发原因
- 你代码中使用的
Queue是基于Redis实现的任务队列库Bull,这类库在解析Redis连接URL时,会按照标准格式提取路径段的数字作为Redis数据库编号,后续会执行SELECT命令切换到对应编号的数据库。 - 你当前配置的连接串值为
redis://redis-srv:6379/,URL末尾的路径段为空,库解析逻辑会把空值转为数字,最终得到非数字值NaN。客户端向Redis发送SELECT NaN命令时,Redis因为收到非整数、超出合法范围的库编号,直接抛出ERR value is not an integer or out of range错误,和你看到的堆栈报错完全匹配。 - 额外配置隐患:你贴出的Node.js Deployment配置存在标签选择器笔误:
spec.selector.matchLabels.app的值写为no,和Pod模板上配置的标签app: nodeJsApp不匹配,正常场景下K8s会拒绝创建这类不匹配的Deployment,你提到当前所有Pod、Service运行正常,大概率是实际部署时修正了这个笔误,后续调整配置时需要留意避免同类问题。
解决方法
- 修正Redis连接串的格式,明确指定要使用的Redis数据库编号。如果使用Redis默认的0号库,只需要把连接串修改为带库编号的格式即可:
env: - name: REDISCONNECTIONDEV value: "redis://redis-srv:6379/0" - 如果希望简化连接串、省略库编号段,也可以直接去掉URL末尾的斜杠,写为
redis://redis-srv:6379,这种格式下Bull会默认使用0号数据库,不会触发空路径解析出NaN的问题。 - 修改完Deployment配置后,重新应用配置让Pod滚动重启,等待新Pod启动完成后,Redis连接即可正常建立。
- 连通性验证小技巧:可以通过
kubectl exec进入Node.js应用的Pod容器,手动执行redis-cli -h redis-srv -p 6379 ping,收到PONG返回就说明网络连通没有问题。
内容的提问来源于stack exchange,提问作者Süleyman Ali Akpınar
相关产品推荐
相关产品推荐

