嗯,在 nomad 中运行 traefik 和容器之间负载平衡的最合适的选项是使用 consul catalog(服务发现所必需的)。
要运行此程序,您必须在启动 nomad 时配置 consule connection。如果您想在本地进行测试,只需运行sudo nomad agent -dev-connect 即可。 Consul 可以以consul agent -dev -client="0.0.0.0" 开头。
现在您可以使用 tags 简单地提供您的 traefik 配置,如 here 所示。
如果您真的需要(这肯定会导致集群设置出现问题)使用 docker 提供程序在 nomad 中运行 traefik,您可以执行以下操作:
首先您需要在 docker 插件中启用主机路径挂载。请参阅 this 和 this。您可以将配置放在一个额外的文件中,例如 extra.hcl,如下所示:
plugin "docker" {
config {
volumes {
enabled = true
}
}
}
现在您可以使用这个额外的设置sudo nomad agent -dev-connect -config=extra.hcl 开始游牧。现在您可以在 config/labels 块中提供您的 traefik 设置,例如(完整):
job "traefik" {
region = "global"
datacenters = ["dc1"]
type = "service"
group "traefik" {
count = 1
task "traefik" {
driver = "docker"
config {
image = "traefik:v2.3"
//network_mode = "host"
volumes = [
"local/traefik.yaml:/etc/traefik/traefik.yaml",
"/var/run/docker.sock:/var/run/docker.sock"
]
labels {
traefik.enable = true
traefik.http.routers.from-docker.rule = "Host(`docker.loris.mydomain`)"
traefik.http.routers.from-docker.entrypoints = "web"
traefik.http.routers.from-docker.service = "api@internal"
}
}
template {
data = <<EOF
log:
level: DEBUG
entryPoints:
traefik:
address: ":8080"
web:
address: ":80"
api:
dashboard: true
insecure: true
accessLog: {}
providers:
docker:
exposedByDefault: false
consulCatalog:
prefix: "traefik"
exposedByDefault: false
endpoint:
address: "10.0.0.20:8500"
scheme: "http"
datacenter: "dc1"
EOF
destination = "local/traefik.yaml"
}
resources {
cpu = 100
memory = 128
network {
mbits = 10
port "http" {
static = 80
}
port "traefik" {
static = 8080
}
}
}
service {
name = "traefik"
tags = [
"traefik.enable=true",
"traefik.http.routers.from-consul.rule=Host(`consul.loris.mydomain`)",
"traefik.http.routers.from-consul.entrypoints=web",
"traefik.http.routers.from-consul.service=api@internal"
]
check {
name = "alive"
type = "tcp"
port = "http"
interval = "10s"
timeout = "2s"
}
}
}
}
}
(可能存在绑定到0.0.0.0 的设置,我在/etc/hosts 中定义了这些域以指向我的主接口IP)。
您可以使用修改后的 webapp 规范对其进行测试(我没有弄清楚如何正确映射端口,例如 container:80 -> host:<random>,但我认为这足以说明它变得多么复杂 :)):
job "demo-webapp" {
datacenters = ["dc1"]
group "demo" {
count = 3
task "server" {
env {
// "${NOMAD_PORT_http}"
PORT = "80"
NODE_IP = "${NOMAD_IP_http}"
}
driver = "docker"
config {
image = "hashicorp/demo-webapp-lb-guide"
labels {
traefik.enable = true
traefik.http.routers.webapp-docker.rule = "Host(`docker.loris.mydomain`) && Path(`/myapp`)"
traefik.http.services.webapp-docker.loadbalancer.server.port = 80
}
}
resources {
network {
// Used for docker provider
mode ="bridge"
mbits = 10
port "http"{
// Used for docker provider
to = 80
}
}
}
service {
name = "demo-webapp"
port = "http"
tags = [
"traefik.enable=true",
"traefik.http.routers.webapp-consul.rule=Host(`consul.loris.mydomain`) && Path(`/myapp`)",
]
check {
type = "http"
path = "/"
interval = "2s"
timeout = "2s"
}
}
}
}
}
我希望这能以某种方式回答你的问题。