K8s启动探针连接MongoDB时Pod陷入未就绪状态问题排查
K8s启动探针连接MongoPod异常问题解决
问题现象
用K8s启动探针做MongoDB连通性检测时,Pod一直卡在未就绪状态:
- 探针脚本自身日志显示MongoDB连接检测成功
- Helm发布日志却出现
context deadline error/client rate limiter错误 - 注释掉探针里的
MongoClient初始化和server_info()调用代码后,Pod能正常启动,不会被探针触发重启
涉及代码与配置
探针Python代码
def test_mongodb(conn_str): logging.debug("testing Mongo...") try: start_time = time.time() # Start timing client = MongoClient(conn_str) info = client.server_info() end_time = time.time() # End timing elapsed_time = end_time - start_time logging.debug(f"MongoDB connection check took {elapsed_time:.2f} seconds") logging.debug("Mongodb server info: %s", info) print("MongoDB Server Information:", info) return True except Exception as e: logging.debug(f"mongo failed: {str(e)}") return False test_mongodb(conn_str)
Helm启动探针配置
startupProbe: enabled: true initialDelaySeconds: 30 periodSeconds: 60 failureThreshold: 6 exec: command: - python - /app/start.py
问题根源
- 探针超时时间默认过短:K8s探针默认
timeoutSeconds为1秒,而MongoClient建立连接+获取server_info()的实际耗时很可能超过1秒。此时不管探针脚本内部是否执行成功,K8s都会判定探针超时失败,触发Pod重启。 - 限流触发:探针频繁失败导致K8s不断重试,触发了客户端请求限流,出现
client rate limiter错误。
解决方案
1. 给探针设置足够的超时时间
在Helm配置里添加timeoutSeconds,值要大于你实际测出来的MongoDB连接耗时(比如设为5秒):
startupProbe: enabled: true initialDelaySeconds: 30 periodSeconds: 60 failureThreshold: 6 timeoutSeconds: 5 # 新增超时配置 exec: command: - python - /app/start.py
2. 优化MongoDB连接逻辑
- 给
MongoClient设置连接超时,避免无限等待:
# 添加serverSelectionTimeoutMS参数,3秒超时 client = MongoClient(conn_str, serverSelectionTimeoutMS=3000)
- 连接检测完成后及时关闭客户端,释放资源:
client.close() # 在return True前添加
- 去掉不必要的
print输出,减少IO开销(探针日志用logging即可)
3. 调整探针执行频率
根据服务实际启动速度,适当调大initialDelaySeconds,减少前期不必要的探针执行,避免触发限流。
内容的提问来源于stack exchange,提问作者projectl
相关产品推荐
相关产品推荐

