You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会终止旧的同标识部署,导致旧任务被替换。

解决步骤

  1. 修改Waypoint配置,让应用标识区分环境
    将project或app名称加入${var.env}变量,确保每个环境的应用拥有独立标识。示例修改如下:
    # 将project名称改为包含环境变量
    project = "xx-db-${var.env}"
    
    # 或者(推荐同时修改app名称,确保唯一性)
    app "xx-db-${var.env}" {
        # 原build、deploy逻辑保持不变
    }
    
  2. 重新部署验证
    对每个环境重新执行部署命令,Waypoint会为每个环境创建独立的应用实例,不再互相覆盖旧任务。
  3. 额外确认
    当前Nomad的job名称已通过${env}区分,这部分无需修改,确保了Nomad层面任务的独立性。

内容的提问来源于stack exchange,提问作者Rabah DevOps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:50:31