部署始终无法完成调度
Symptom
部署已被接受——它存在,GET /api/v1/deployments/{name} 返回它——但从未出现任何容器。副本计数保持为零,没有节点列出它。
Diagnose
-
在猜测之前,请先阅读拒绝信息。 一个从未被调度的部署会发布一个
deployment.unschedulable事件,其中包含调度器自身的原话:列出每个候选节点的名称, 以及每个节点被拒绝的原因。GET /api/v1/events包含此信息。部署自身的状态消息 是摘要——即某些副本因没有就绪节点接受新工作而无法调度——因此, 每个节点的具体原因仅存在于该事件中,别无他处。 -
您的租户中是否有任何节点处于就绪状态? 打开 节点,或
GET /api/v1/nodes。调度永远不会 跨越租户边界,因此另一个租户的空闲容量不算作可用容量。 -
资源请求是否能装入单个节点? 一个大于任何单个节点空闲容量的请求 不会被拆分。请将部署的资源请求与节点报告的容量进行比较。
-
调度约束是否匹配任何节点? 标签约束、反亲和性或指定节点名称 都是过滤器,而一个不匹配任何节点的过滤器会导致容器无处可放。请参阅 调度与分配。
-
唯一的候选节点是否是控制平面本身运行的节点? 一个代理程序可以服务多个 租户,并且该节点会继续运行已调度到其上的部署——但它不接受来自任何租户(平台自身除外)的 新部署。这也不会被报告为故障:虽然平台自身对该节点的记录是新鲜的, 但节点的存活性是从该记录中读取的,而您租户的健康检查循环会忽略其状态, 因此它永远不会被标记为故障,也永远不会被计入受损节点。一个租户如果其唯一节点 就是该节点,那么它将无处放置任何新工作负载。
-
部署是否要求一个没有节点声明的区域或国家? 数据驻留是一个硬性 过滤条件,而非偏好。您将其写作
placement.residency,它会被编译为调度器读取的 三个标签——因此请在部署上查找这两种形式:你写入 它被存储为 节点通过以下方式满足它 placement.residency.countryodysseus.io/data-residency-countryodysseus.io/country与之相等placement.residency.regionodysseus.io/data-residency-regionodysseus.io/geo-region与之相等,或该区域覆盖的国家placement.residency.blockedCountriesodysseus.io/blocked-countries,逗号连接无 — 列出的国家会移除该节点 拒绝信息会同时引用您要求的值和节点报告的值,因此拼写不匹配是可见的,而非推断得出。如果您是拿着手写的
odysseus.io/data-residency-*标签来到这里,那么该形式已完全不再被接受:左侧列中的键入块是替代方案,拒绝信息会将您自己的值打印回其中。 请参阅 数据驻留。 -
驻留是否在您未读取警告的情况下被接受? 此控制平面无法满足的驻留约束会被存储而非拒绝,响应体会说明是以下两种情况中的哪一种:地理强制执行已关闭,或范围内没有节点宣传匹配的标签——第二种情况会列出您的节点实际宣传的值。两者均位于 拒绝和修改 的
placement.residency下。无论哪种情况,部署都会被接受并等待。GET /api/v1/scheduler/regions直接回答这两个问题 ——此控制平面声明的区域,以及强制执行是否开启。 -
租户是否达到配额? 达到的配额会阻止新的容器,而非缩减 现有容器。

Resolve
-
没有就绪的节点: 注册一个,或让现有节点恢复在线 — 参见 您注册的节点未列出。
-
请求过大: 降低请求,或添加一个能满足请求的节点。请求用于指导放置;它们不是预留,因此修复方法是调整以适应,而非预留。
-
约束无匹配: 放宽约束,或为节点添加标签以使其匹配。同时设置放置块和等效的手写标签会被拒绝,因此请更改其中之一,而非两者都改。
-
仅控制平面自身的节点是候选: 注册一个您自己的节点。这是有意为之而非故障 — 与控制平面共享的节点会被排除在除平台自身外所有租户的放置列表之外,同时其活跃性从平台的记录中镜像,以便已在其上的容器得到诚实的监控。您在部署上设置的任何内容都无法覆盖此规则,因为这是一项安全规定而非您编写的约束。
-
驻留无匹配: 为节点添加部署所需的
odysseus.io/country或odysseus.io/geo-region标签 — 在该节点自身的代理程序配置中设置,并在 代理程序 重启时重新通告,而非在控制平面重启时 — 或更改部署的要求。编辑部署前请检查节点通告的内容:一个拼写方式无节点通告的区域,其效果与完全没有容量完全相同。在placement.residency中更改要求,切勿通过编辑odysseus.io/data-residency-*标签来更改;该标签在写入时会被拒绝,拒绝操作会向您提供一个已填入您自身值的类型化块:placement:residency:country: CA # or `region:`, naming one this control plane declaresblockedCountries: [CN] -
The region name is not one this control plane declares: it is refused rather than left pending, and the refusal lists the declared names.
GET /api/v1/scheduler/regionslists them too, and says whether enforcement is switched on — regions are declared per control plane, so a name that works elsewhere may not exist here. -
Quota reached: free capacity by removing what you no longer run, or ask for the quota to be raised.
Prevent
根据实际测量的使用量设置请求值,而非使用整数,并保留至少一个不匹配任何约束的自有节点,这样即使标签输入错误,容器也能有地方运行。与控制平面共享的节点不算作备用节点:无论其标签如何,它都不会接受来自您租户的新部署。