由于模板中的 Consul KV 解析失败,Nomad 作业陷入待处理状态

Posted

技术标签:

【中文标题】由于模板中的 Consul KV 解析失败,Nomad 作业陷入待处理状态【英文标题】:Nomad job stuck in pending state due to failed Consul KV resolution in template 【发布时间】:2021-08-26 22:10:37 【问题描述】:

Nomad v1.0.4,Consul v1.7.3

我们有一个包含多个任务组的 Nomad 工作规范。每个任务组都有一个任务。每个任务都有相同的模板节,它引用了多个 Consul KV 路径,如下所示:

 if keyExists "services/mysql/database" 
  MYSQL_DB = " key "services/mysql/database" "
 end 

Nomad 作业规范以 JSON 格式以编程方式生成,并通过 POST /jobs 提交到 Nomad 集群。此作业中的所有任务都被限制在同一台主机上运行。

我们看到一些(不是全部)任务陷入pending 状态并出现分配错误,例如:

[1] Template failed: kv.block(services/mysql/database): Get "http://127.0.0.1:8500/v1/kv/services/mysql/database?index=1328&stale=&wait=60000ms": EOF

[2] Missing: kv.block(services/mysql/database)

请注意,分配错误消息中指示的特定 Consul KV 路径是不确定的。如上所述,每个作业都使用相同的模板节,并且模板节本身引用了多个 Consul KV 路径。对于每个失败的分配,分配错误中指示的Consul KV路径可能不同。

我们已经验证了 Consul 集群是活跃的,并且模板节中引用的所有 KV 路径都存在。

理论上,如果 Consul HTTP 请求错误或 Consul KV 路径不存在,所有任务都应该遇到相同的命运(例如失败)。如前所述,只有部分任务失败,而其他任务成功进入running 状态。由此,我们知道模板节本身是有效的,因为至少有一些作业能够成功运行。

我们通过 cURL 直接运行 Consul HTTP 请求来验证它是否正常工作。

有趣的是,一些失败的任务在未来重新安排时会随着时间的推移自动恢复。但是,其他人只是永远保持pending 状态。

非常感谢您对此行为的任何见解或探索的可能解决方案。

【问题讨论】:

【参考方案1】:

Consul limits number 来自单个 IP 的并发 HTTP 连接。你可以试着检查一下。 在我的游牧/领事部署中,我遇到了类似的问题。前 20 个任务可以在特定节点上启动,但随后第 21 个任务无法启动,因为它无法读取 KV 条目(但其他 20 个可以读取相同的条目)。它的行为非常奇怪。提到的限制解决了我的问题。

顺便说一句。我对从 200 增加这个限制持怀疑态度,它似乎足够高。但是,在我看来,一个 nomad 任务会打开多个 consul HTTP 连接,所以我的 20 个任务很快就会耗尽 200 个的限制。

【讨论】:

以上是关于由于模板中的 Consul KV 解析失败,Nomad 作业陷入待处理状态的主要内容,如果未能解决你的问题,请参考以下文章

consul:kv

Consul KV

consul 配置/KV/ACL

consul 配置/KV/ACL

记一次搭建简单cloudconsul项目错误

python-consul