-1

我有一个 3 节点测试集群和几个作业(简单配置、无约束、java 服务)。我的问题是每次我开始工作时都会在第一个节点上启动。如果我增加 count=2 并添加一个不同的主机约束,那么其他节点上也会有分配。但是,如果我以 count=1 开始 50 个作业,则第一个节点上有 50 个分配,而 node2 或 node3 上没有。

job "test" {
  datacenters = ["dc1"]
  type = "service"
  group "test" {
    count = 1
    task "test" {
    driver = "java"
    config {
       jar_path    = "/usr/share/java/test.jar"
       jvm_options = [
                    "-Xmx256m",
                    "-Xms256m"]
    }
    resources {
       cpu = 300
       memory = 256
    }
 }
}

现在我想了解/看看 Nomad 如何为分配选择节点。所有 3 个节点都有相同的资源 - 所以作业应该平均分配吗?

编辑:突然之间,工作将被分配。所以我的新问题是:是否有详细的输出或者我可以看到 Nomad 在开始新工作时如何以及为什么选择特定节点的东西。

4

1 回答 1

1

如官方文档中所述

第二阶段是排名,调度程序对可行节点进行评分以找到最合适的节点。评分主要基于 bin 打包,用于优化应用程序的资源利用率和密度,但也通过亲和性和反亲和性规则进行增强。Nomad 自动应用作业反关联性规则,该规则不鼓励将任务组的多个实例放在一起。这种反亲和性和装箱的组合优化了密度,同时降低了相关故障的可能性。

这意味着 Nomad 将首先尝试“填充”特定节点。让我举个例子:假设你有三个有要求的工作:

j1(200M)、j2(300M)、j3(500M)

并拥有三个具有免费资源的节点

n1(1G)、n2(2G)、n3(3G)。

在这种情况下,Nomad 将选择一个将首先填充的节点。因此,当您尝试安排 J1 时,将选择 N1。现在,具有剩余资源的节点的状态将是:

n1(800M)、n2(2G)、n3(3G)

现在,假设您要安排 j2。在这种情况下,将选择 n1,因为该节点的填充速度将比 n2 和 n3 快。

因此,您最终分配的免费资源将如下所示

n1 (j1,j2,j3)(100M)      n2(2G)       n3(3G)

现在如果一个工作 j4 有 200M 的需求,n2 将被选中。这会将您的集群状态发送到

n1 (j1,j2,j3)(100M)      n2(j4)(1800M)       n3(3G)

如果您想了解更多在 Nomad 中 bin-packing 的工作原理,您可以查看https://www.nomadproject.io/docs/internals/scheduling.html上的高级文档

此外,与分配分配相关的权重计算在评估 API 的结果中公开。这意味着如果您发出以下命令:

$ nomad plan <job> file

然后记下评估 ID,并向 评估 API 发出 HTTP 请求

$ curl localhost:4646/v1/evaluation/<eval_id>

您将获得调度程序计算的结果和要安排的游牧作业的条件。此plan命令对于了解任务组分配非常有用。它还会告诉您是否有足够的资源在数据中心运行该作业。

于 2018-06-24T11:11:20.863 回答