问题描述
我试图了解Nomad spread
如何处理客户端故障。
在Nomad作业中,您可以定义一个spread
节,以使作业的实例传播到所有客户端。
以下是文档: https://www.nomadproject.io/docs/job-specification/spread
由于spread
是一个软优先级,因此如果某个客户端发生故障,无论出于何种原因,Nomad都会将丢失的客户端上运行的所有作业迁移到另一个可用的客户端上。 (这甚至在装箱时也有效)。
在2个客户端网格和一个具有两个分配的作业的情况下,如果一个客户端失败,则两个分配将在同一客户端上运行。
当网格恢复并启动新客户端时会发生什么?是在spread
节之后将作业重新分发到两个节点,还是将在同一客户端上继续运行这两个分配,直到重新运行该作业?
解决方法
很难找到答案。我的印象是,除非有资源限制,否则Nomad不会迁移分配。因此,在您的示例中,作业不会重新传播。
一些地方可以提高确定性:
- 存在节点亲缘关系:https://learn.hashicorp.com/tutorials/nomad/affinity,
binpack
,job-anti-affinity
和node-reschedule-penalty
可能会影响您分配的移动(但同样,我认为这正处于资源争用之下) - 抢占现在已成问题,但似乎又更多地涉及资源限制:https://www.nomadproject.io/docs/internals/scheduling/preemption
- 这里有一个传播测试,我认为可以对其进行修改以测试您的用例:https://github.com/hashicorp/nomad/blob/235f938e87afbdc73037c1868a17668c06a8cf94/scheduler/generic_sched_test.go#L616,我自己尝试过这样做,但是在复杂性方面有些困惑。
有趣的是,我从未见过分配会自愿在具有空闲资源的节点上迁移,也从未见过分配会自由移动到新的空节点。