K8s同命名空间MongoDB Pod间间歇性连接认证失败问题
同一Kubernetes命名空间内部署了两套MongoDB相关工作负载:
- 待定期备份的MongoDB实例,对应Pod名称:
mongodb-deployment-79bdf489d8-klyo7 - 执行备份任务的CronJob工作负载,对应Pod名称:
mongo-backup-toolset-75f8f679dd-abc2d
备注:上述CronJob依赖mongosh工具,Pod内搭载了Mongo运行环境。
按照备份方案设计,CronJob执行时会运行如下mongodump命令完成数据备份:
mongodump --uri="mongodb://admin:abc123@mongo-single-clusterip/platforms" --authenticationDatabase admin --gzip --out /tmp/dump-12-06-22/mybackup.gz
正式上线CronJob前,先将其部署为普通MongoDB容器,测试两个Pod间的网络连通性与认证有效性。测试方式为通过kubectl进入CronJob对应容器执行连接命令,操作如下:
kubectl exec -it mongo-backup-toolset-75f8f679dd-abc2d -- sh mongo mongodb://admin:abc123@mongo-single-clusterip/platforms?authSource=admin
从mongo-backup-toolset-75f8f679dd-abc2d Pod发起的MongoDB登录请求,应能跨会话稳定完成认证;连通与认证正常的前提下,使用相同MongoDB URI与账号凭证的mongodump命令也应稳定执行成功。
两个Pod间的连接存在间歇性异常:工具集Pod偶尔可成功连接并完成认证,偶尔会抛出如下认证失败错误:
mongo mongodb://admin:abc123@mongo-single-clusterip/platforms?authSource=admin MongoDB shell version v4.4.6 connecting to: mongodb://mongo-single-clusterip:27017/platforms?authSource=admin&compressors=disabled&gssapiServiceName=mongodb Error: Authentication failed. : connect@src/mongo/shell/mongo.js:374:17 @(connect):2:6 exception: connect failed exiting with code 1
异常表现为首次登录成功并正常登出后,后续连接尝试直接认证失败。
1. 优先检查Service关联的后端端点
这类间歇性认证失败90%以上的原因是mongo-single-clusterip Service的Endpoints包含了非预期的后端,比如残留的测试Mongo实例、多副本部署下未同步账号的其他Mongo节点,导致Service轮询转发流量时,部分请求落到了没有对应admin账号的实例上。
执行以下命令核验:
# 查看Service实际转发的后端IP列表 kubectl get endpoints mongo-single-clusterip -o wide # 查看目标Mongo实例的实际Pod IP kubectl get pod mongodb-deployment-79bdf489d8-klyo7 -o wide
如果Endpoints列表中出现了和目标Mongo Pod IP不一致的地址,修改Service的selector标签,确保仅选中待备份的目标Mongo Pod即可。
2. 修正mongodump命令参数错误
现有备份命令存在两个参数问题,会导致执行失败:
- 同时通过
--uri和--authenticationDatabase传递认证库参数,可能出现参数优先级冲突,建议将认证参数统一写入URI --out参数用于指定输出目录,加--gzip参数要输出单个压缩备份文件时,需要改用--archive参数指定文件路径
修正后的命令如下:
mongodump --uri="mongodb://admin:abc123@mongo-single-clusterip/platforms?authSource=admin" --gzip --archive=/tmp/dump-12-06-22/mybackup.gz
3. 校验客户端与服务端版本匹配
测试用的mongo shell版本为v4.4.6,需确保备份Pod内的mongodump、mongo shell版本和目标MongoDB实例大版本一致,版本差过大也会触发偶发的认证协议兼容问题。
内容的提问来源于stack exchange,提问作者Golide

