Skip to content
View as Markdown

故障排查 ​

下面每一条都是真实发生过的故障及其原因,按"最容易被误判成别的东西"排序。

no available local poder found ​

创建找不到 worker。消息里说 local 是因为 provider 是 local,不是因为机队坏了。

原因怎么查
没有任何 worker 注册过sandrpod-cli poder list
地域不一致 —— 客户端默认 local,worker 注册成 hkselect id, region from poders,两边必须一致
worker 到了容器上限看 worker 行的 usage_containers / max_containers;删掉已停止的沙箱
重启后 worker 离线心跳停了;看 docker logs sandrpod-worker
租户不匹配为一个工作区签的 join token 不能承载另一个工作区的沙箱

最后一条是故意的:拒绝,好过把两个租户挤在一起。

sandbox tunnel not available(503) ​

沙箱存在,但持有它隧道的 worker 没有连在收到请求的那个实例上。

  • 单实例:worker 离线,或者隧道断了正在重连(它每几秒重试一次)。
  • 多实例:owner 记录过期了。检查持有方实例的 -node-url 非空且在收心跳; tunnel_owners.updated_at 应该是几秒前,而不是几分钟前。

worker capability unavailable(409) ​

请求需要的能力没有任何可用 worker 具备 —— 出网策略需要带 egress 能力的 worker。 部署这样的 worker,或者去掉策略。

沙箱卡在 PENDING ​

创建没有到达 worker。job 行会说明原因:

bash
sandrpod-cli job get <job-id>

no available local poder found → 见上。什么都没有 → 进程死在投递中途;恢复器会在 大约一分钟内接过去,而一条超过这个时间又没有错误的 job 值得查一下。

create egress proxy container: No such image ​

worker 上没有 ghcr.io/sandrpod/egress-proxy。拉取之后重建 —— 失败的那次已经写入了 记录,所以先把它删掉。

删掉的沙箱又回来了 ​

删除会清掉记录和容器;一条仍然 PENDING 的创建 job 曾被恢复器重新投递。0.7.1 已修: 沙箱记录不存在、或已处于终态的 job 会判失败而不是重放。旧版本上如果遇到,升级。

用 E2B SDK 时 commands.run 返回 401 ​

SDK 不会把 API key 发给 envd。它把创建响应里的 envdAccessToken 作为 X-Access-Token 发出去,而托管部署必须接受这个 token,不能只认自己的工作区 key。0.7.1 已修;更早的 版本上只有 create 和 kill 能用。

E2B SDK 在发请求之前就拒绝密钥 ​

Invalid API key format: expected "e2b_" followed by hex characters。密钥必须用这种 拼写签发 —— 同一张表、同样吊销、只是前缀不同。见 E2B 直接替换。

envd 主机返回了 200,但健康文档不是 envd 的 ​

主机没有路由到 E2B 面。只按路径挂载(/sandboxes)足以支持创建和删除,不足以支持 <端口>-<id>.<域名>;请求落到了控制面。托管构建在 0.7.1 已修;检查你的反向代理是否 原样传递 Host 头。

自签部署上 TLS 失败 ​

证书通常只签了一个名字。用 IP 连接、而证书上是主机名时,即使 CA 被信任也会验证失败。 用证书上的名字连接,或者把 CA 加进进程的信任库(SSL_CERT_FILE)。

整体很慢,或者主机干脆不响应 ​

先看内存,再看 CPU。同一台机器上的 go build 拖垮过整台主机;同一台机器上既跑门户又 跑一批沙箱也一样。

bash
free -h; uptime; ps aux --sort=-%mem | head

解决办法几乎总是"别再合租":worker 单独机器、控制面小、数据库托管。见 生产部署。

该看哪里 ​

问题命令
平台健康吗curl -s https://…/healthz | jq
机队在干什么sandrpod-cli poder list
这次创建做了什么sandrpod-cli job get <job-id>
容器在干什么sandrpod-cli logs <名字> --tail 100
worker 在干什么docker logs sandrpod-worker

Apache 2.0 — your clouds, your machines, your rules.