Nomad集群部署多环境DB异常:Waypoint无法启动超2个任务
问题:Waypoint部署多环境Nomad任务时旧任务被自动替换
我在Nomad集群中使用Waypoint配合变量文件,实现Test、dev、qa、ppd多环境数据库的自动化部署,但遇到异常:每次启动新的数据库任务时,已运行的旧任务会被替换消失,前端和后端应用部署也存在同样问题。
部署状态说明
- 部署前:有2个数据库任务(test和formation环境)处于运行状态
- 启动新任务后:旧任务完全消失,仅新部署的任务留存
Waypoint配置文件
启动命令:waypoint up -var-file=/opt/waypoint/xx/xx-api/dev/dev.wpvars
project = "xx-db" # An application to deploy. app "xx-db" { build { use "docker" { dockerfile = "${path.app}/${var.dockerfile_path}" } registry { use "docker" { image = "${var.registry_path}/xx-db-${var.env}" tag = "${var.version}" } } } deploy { use "nomad-jobspec" { jobspec = templatefile("${path.app}/finess-db.hcl", { datacenter = var.datacenter env = var.env }) } } } variable env { type = string default = "" } variable dockerfile_path { type = string default = "Dockerfile" } variable "registry_path" { type = string default = "registry.repo.proxy-xx-xx.xx.xx.xx.net" } variable datacenter { type = string default = "xx" } variable "version" { type = string default = gitrefpretty() env = ["gitrefpretty()"] }
Nomad任务配置文件
job "xxx-psqldb-${env}" { datacenters = ["xxx"] type = "service" vault { policies = ["xxx"] change_mode = "noop" } update { stagger = "30s" max_parallel = 1 } group "xxx-psqldb-${env}" { count = "1" restart { attempts = 3 delay = "60s" interval = "1h" mode = "fail" } network { mode = "host" port "pgsqldb" { to = 5432 } } task "xxx-psqldb-${env}" { driver = "docker" config { image = "${artifact.image}:${artifact.tag}" ports = ["pgsqldb"] volumes = [ "name=xxxpsqldb${env},io_priority=high,size=5,repl=1:/var/lib/postgresql/data" ] volume_driver = "pxd" } template { data = <<EOH POSTGRES_USER="{{ with secret "app/xxx/db/admin" }}{{ .Data.data.user }}{{end}}" POSTGRES_PASSWORD="{{ with secret "app/xxx/db/admin" }}{{ .Data.data.password }}{{end}}" EOH destination = "secrets/db" env = true } resources { cpu = 256 memory = 256 } service { name = "xxx-psql-svc-${env}" tags = ["urlprefix-xxx-psql-${env} proto=tcp"] port = "pgsqldb" check { name = "alive" type = "tcp" interval = "10s" timeout = "5s" port = "pgsqldb" } } } } }
问题原因及解决方案
核心原因
Waypoint将同一个project+app标识的部署视为同一应用的版本更新,而非独立应用。当前配置中project和app名称固定为xx-db,未区分环境,所以每次部署新环境时,Waypoint会终止旧的同标识部署,导致旧任务被替换。
解决步骤
- 修改Waypoint配置,让应用标识区分环境
将project或app名称加入${var.env}变量,确保每个环境的应用拥有独立标识。示例修改如下:# 将project名称改为包含环境变量 project = "xx-db-${var.env}" # 或者(推荐同时修改app名称,确保唯一性) app "xx-db-${var.env}" { # 原build、deploy逻辑保持不变 } - 重新部署验证
对每个环境重新执行部署命令,Waypoint会为每个环境创建独立的应用实例,不再互相覆盖旧任务。 - 额外确认
当前Nomad的job名称已通过${env}区分,这部分无需修改,确保了Nomad层面任务的独立性。
内容的提问来源于stack exchange,提问作者Rabah DevOps
相关产品推荐
相关产品推荐

