跳转到内容

写入被拒绝,且该请求并非来自您

Symptom

部署写入被拒绝,错误代码为 registry_credential_store_unavailable,消息显示控制平面无法解析注册表凭据。请求本身没有任何问题,修改规范也无法使其成功——一旦平台恢复健康,相同的请求体将被接受。

这是平台报告自身故障,而非判断您发送的内容。值得一眼区分:image_not_found 表示注册表已响应但镜像不存在,这需要您自行修复。此代码表示注册表从未被询问,因为控制平面无法找到用于询问的凭据。

Diagnose

  1. 确认是平台而非镜像问题。 阅读代码,而非说明文本。image_not_found 是一个已确认不存在的镜像。registry_credential_store_unavailable 是控制平面表示 它无法进行检查。
  2. 询问控制平面自身状态。 GET /healthz 以一行回复:它报告 consul not configured 表示控制平面启动时完全没有键值存储客户端, consul unhealthy 表示它曾有客户端但后来丢失了。这是两种不同的故障, 需要不同的修复方法,因此该端点会区分它们。
  3. 要获取比结论更多的信息,GET /api/v1/cluster/health 将平台分解为组件, 并为键值存储提供独立状态 — unavailable 表示“Consul 客户端未配置”,或 unhealthy 表示“Consul 已断开连接”。平台管理员可以阅读它;这与 仪表板集群健康状态渲染的视图相同。
  4. 如果显示未配置,需要检查控制平面启动时使用的地址 — ODYSSEUS_CONSUL_ADDRESS,或它覆盖的 consul.address 设置。一个 启动时没有配置地址的控制平面不会自行在之后获取它。
  5. 如果显示已断开连接,则存储已配置但当前无法访问:请检查 Consul 容器是否正在运行,以及控制平面是否可以通过给定地址访问它。仅 重启存储本身不足以证明控制平面已重新连接 — 之后请再次阅读 /healthz,而不是假设。

Resolve

  • 作为调用方: 无需操作,这是诚实的答案。一旦平台报告健康状态,即可重试相同的请求。由于未发生任何写入操作,因此不存在需要撤销的半完成更改,也没有容器受到干扰。
  • 作为未配置的操作员: 在控制平面的配置中设置键值存储地址并重启它。不要通过关闭镜像检查来绕过此问题——该检查的存在是因为,如果没有它,一次被接受的写入会先拆除一个健康的容器,然后才发现镜像无法拉取。
  • 作为断开连接的操作员: 恢复存储,然后在 /healthz 上确认控制平面已重新连接,之后再告知任何人平台已恢复。一旦连接真实建立,拒绝状态会自动清除。

Prevent

对集群健康状况的键值存储组件发出警报,而不仅仅是监控控制平面的进程是否运行。处于此状态的控制平面可以响应读取请求、提供仪表盘服务,并且看起来完全正常,但却拒绝所有部署的写入操作——因此,“服务正在运行”并不能证明任何人都可以进行部署。