如何配置Nomad组内任务为不同实例分配不同存储卷?
元数据
- Nomad v1.7.2
- 操作系统:Windows
- 调度器:service
- 驱动:exec / raw_exec
架构说明
我有10台运行Nomad客户端节点的Windows服务器。
我希望通过Nomad运行3个有状态服务实例。每个实例(01、02、03)会将检查点和数据写入文件系统(例如/tmp/instance01、/tmp/instance02、/tmp/instance03)。实例重启时会从最新检查点恢复运行。每个实例可分配至任意主机,但重启后需使用与之前故障实例相同的目录。
即:
01<-->/tmp/instance0102<-->/tmp/instance0203<-->/tmp/instance03
为简化场景,假设这3个目录创建于NAS中,且NAS已挂载至所有运行Nomad客户端节点的服务器,所有组/任务均拥有这3个目录的读写权限。
问题描述
我可通过以下几种方式配置服务读写状态数据的目录:
- 命令行参数
- 通过环境变量配置文件
- 通过Nomad模板插值的Template块
如何为组内不同实例运行的同一任务传递不同值?
即:如何为每个实例分配唯一且一致的标识,以便可靠识别?
已考虑方案
Parameterized Block--> 不适用于Service类型作业Template Block--> 所有任务实例会接收相同数据Env Var--> 所有任务实例会接收相同数据Meta Block--> 所有任务实例会接收相同数据Variable Block--> 所有任务实例会接收相同数据Dynamic Block--> 可行方案,但本质是重复Group块Repeating Group Block--> 尽量避免此方案Multiple Job Spec--> 尽量避免此方案
Nomad支持在单个任务内循环,但似乎不支持跨任务循环。
欢迎任何解决方案,即使是临时方案。感谢!
作业配置示例
job "app-write" { datacenters = ["dc1"] type = "service" node_pool = "default" # Write group "app-write" { count = 3 # /tmp/instance01 volume "app01" { type = "host" read_only = false source = "tmpapp01" } # /tmp/instance02 volume "app02" { type = "host" read_only = false source = "tmpapp02" } # /tmp/instance03 volume "app03" { type = "host" read_only = false source = "tmpapp03" } network { port "http" { } // 3100 port "grpc" { } // 9095 port "gossip" { } // 7946 # port "lb" { static = 8080 } } service { name = "app-write" address_mode = "host" port = "http" tags = ["http"] provider = "nomad" } service { name = "app-write" address_mode = "host" port = "grpc" tags = ["grpc"] provider = "nomad" } service { name = "app-write" address_mode = "host" port = "gossip" tags = ["gossip"] provider = "nomad" } task "app-write" { driver = "exec" # or "raw_exec" volume_mount { volume = "app01" destination = "/tmp/app01" read_only = false } volume_mount { volume = "app02" destination = "/tmp/app02" read_only = false } volume_mount { volume = "app03" destination = "/tmp/app03" read_only = false } config { command = "/usr/bin/app" args = [ "-config.file=local/app/config.yaml", "-working-directory=/tmp/app01" # <-- Need this to change for each instance ] } resources { cpu = 100 memory = 128 } # Can change this for each instance too template { source = "/etc/app/config.yaml.tpl" destination = "local/app/config.yaml" change_mode = "restart" // restart } } } }
内容的提问来源于stack exchange,提问作者Yeile
相关产品推荐
相关产品推荐

