[BUG]: k8s manifest liveness/readiness probes hit the collector (8888), not the server

这个报错通常出现在用 AnythingLLM 官方 Kubernetes 示例清单( cloud-deployments/k8/manifest.yaml )部署时:liveness/readiness 探针指向 8888(collector 端口)的 /v1/api/health ,而真正的应用服

快速结论:这个报错通常出现在用 AnythingLLM 官方 Kubernetes 示例清单(cloud-deployments/k8/manifest.yaml)部署时:liveness/readiness 探针指向 8888(collector 端口)的 /v1/api/health,而真正的应用服务端监听的是 3001,导致服务端卡死时探针仍然通过。优先排查探针端口与路径是否指向 server 的 3001 端口。

适用环境:AnythingLLM 的 Kubernetes 示例清单 cloud-deployments/k8/manifest.yaml;容器端口配置为 collector 默认 8888、SERVER_PORT 设为 3001。Issue 作者声明是阅读源码发现,并非在真实集群复现,也未检查清单所拉取的已发布 :render 镜像。

最快修复方案:暂无确认的一步修复方案。Issue 中建议把探针改为 httpGet: path: /api/ping, port: 3001,但该改动尚未验证,且维护者表示清单属于社区模板,欢迎直接提 PR。

注意事项:探针改指向 server 后,首次 prisma migrate deploy 较慢可能导致 liveness 失败并重启容器;Issue 作者提出可能需要加 startupProbe 或延长 liveness 的 initialDelaySeconds,但这一影响未经验证。此外,容器崩溃仍会通过脚本中的 wait -n 结束容器,探针问题主要影响“卡死但不退出”的场景。

问题场景

用户在 Kubernetes 集群中按 AnythingLLM 仓库自带的示例清单 cloud-deployments/k8/manifest.yaml 部署 AnythingLLM。清单中 collector 默认监听 8888,server 通过 SERVER_PORT 监听 3001,但同一份清单把 liveness 和 readiness 探针都指向了 8888 端口的 /v1/api/health。结果是探针请求由 collector 的 catch-all 路由直接返回 200,探针健康状态反映的是 collector 而不是应用服务端。

报错原文

[BUG]: k8s manifest liveness/readiness probes hit the collector (8888), not the server

原因分析

最可能的原因:示例清单里的探针端口配置与服务端实际监听端口不一致。

  • 8888 是 collector 的默认端口(collector/utils/http/index.js:4);server 监听 SERVER_PORT,清单中设为 3001。
  • collector 注册了 catch-all 路由 app.all("*", ... response.sendStatus(200))(collector/index.js:212-213),会以 200 响应这个 GET 请求,因此探针“通过”并不代表服务端正常。
  • 由于 server 在 prisma migrate deploy 之后才启动,readiness 可能在迁移仍在进行时就变为可用;服务端 hang 住时 liveness 也不会失败。
  • 服务端真正崩溃时,仍会因为 wait -n(manifest.yaml 第 126-127 行)结束容器,但这掩盖不了探针指向错误端点的问题。

环境排查

  • 确认 Kubernetes 清单来源与版本:是否为 cloud-deployments/k8/manifest.yaml。
  • 确认清单中 liveness/readiness 探针的 port 与 path(Issue 指出为 8888 与 /v1/api/health)。
  • 确认容器环境变量 SERVER_PORT 的值(Issue 中为 3001)以及 collector 端口是否为默认 8888。
  • 确认部署所使用的镜像,例如 Issue 提到的已发布 :render 镜像(Issue 作者表示未检查该镜像)。
  • 可对照 Docker 镜像的健康检查命令 curl http://localhost:${SERVER_PORT:-3001}/api/ping,确认 server 的真实健康端点。

解决步骤

  1. 定位清单文件 cloud-deployments/k8/manifest.yaml 中的 liveness 和 readiness 探针定义(Issue 引用为第 128-141 行)。
  2. 可优先尝试把两个探针改为指向服务端端口和路径,即 Issue 建议的形式:
    httpGet:
      path: /api/ping
      port: 3001

    其中 /api/ping 注册于 server/endpoints/system.js:83,并在 server/index.js:81-82 挂载到 /api 下。

  3. 如果直接改 liveness,评估首次迁移较慢带来的重启风险,必要时增加 startupProbe 或延长 liveness 延迟(该建议出自 Issue 作者,尚未验证)。
  4. 按维护者回复,这类改动属于 community-templates 范围,可直接提交 PR;只要清单有效或有帮助即可合并。

验证方法

改完探针后重新部署,确认探针请求实际命中 3001 端口的 /api/ping;可进一步在服务端未启动或 hang 住时观察 readiness/liveness 是否按预期失败。由于 Issue 作者未在运行中的集群验证,建议在测试集群中先行确认迁移期间的重启行为是否可接受。

参考来源

Mintplex-Labs/anything-llm #6579

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27039

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注