运行 Traefik 可以找到的 docker 容器的游牧工作
Running a nomad job for a docker container that Traefik can find
我目前 运行 一个 docker 容器,使用 Traefik 作为负载均衡器,使用以下 docker-compose 文件:
services:
loris:
image: bdlss/loris-grok-docker
labels:
- traefik.http.routers.loris.rule=Host(`loris.my_domain`)
- traefik.http.routers.loris.tls=true
- traefik.http.routers.loris.tls.certresolver=lets-encrypt
- traefik.port=80
networks:
- web
它运行良好。作为我第一次尝试使用 Nomad 的一部分,我只是希望能够使用一个 Nomad 作业 loris.nomad
而不是使用 docker-compose 文件来启动这个容器。
Docker容器'Labels'和'Network'标识对于Traefik做动态路由非常重要
我的问题是:我可以把这个“标签”信息和“网络”信息放在loris.nomad
文件的什么地方,这样它就可以在同一个文件中启动容器docker-compose
文件当前的方式。
我试过将这些信息放在 task.config
节中,但这不起作用,而且我在遵循文档时遇到了问题。我已经看到添加了额外的“服务”节的示例,但我仍然不确定。
这是我要修改的游牧文件的基础知识。
# loris.nomad
job "loris" {
datacenters = ["dc1"]
group "loris" {
network {
port "http" {
to = 5004
}
task "loris" {
driver = "docker"
config {
image = "bdlss/loris-openjpeg-docker"
ports = ["http"]
}
resources {
cpu = 500
memory = 512
}
}
}
}
非常感谢任何建议。
好吧,运行ning traefik 在游牧和容器之间的负载平衡中最合适的选择是使用 consul catalog(服务发现需要)。
为此 运行 您必须在启动游牧时配置 consule connection。如果您想在本地进行测试,只需 运行ning sudo nomad agent -dev-connect
即可。 Consul 可以用 consul agent -dev -client="0.0.0.0"
.
开头
现在您可以简单地使用 tags 提供您的 traefik 配置,如图 here.
如果你真的需要(这肯定会在集群设置中引起问题)到 运行 traefik in nomad with docker provider 你可以做以下:
首先你需要在docker插件中启用主机路径挂载。参见 this and this。您可以将您的配置放在一个额外的文件中,例如 extra.hcl,如下所示:
plugin "docker" {
config {
volumes {
enabled = true
}
}
}
现在您可以使用这个额外的设置开始游牧 sudo nomad agent -dev-connect -config=extra.hcl
。现在您可以在 config/labels 块中提供您的 traefik 设置,例如 (full):
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"
}
}
}
}
}
我希望这能以某种方式回答您的问题。
我目前 运行 一个 docker 容器,使用 Traefik 作为负载均衡器,使用以下 docker-compose 文件:
services:
loris:
image: bdlss/loris-grok-docker
labels:
- traefik.http.routers.loris.rule=Host(`loris.my_domain`)
- traefik.http.routers.loris.tls=true
- traefik.http.routers.loris.tls.certresolver=lets-encrypt
- traefik.port=80
networks:
- web
它运行良好。作为我第一次尝试使用 Nomad 的一部分,我只是希望能够使用一个 Nomad 作业 loris.nomad
而不是使用 docker-compose 文件来启动这个容器。
Docker容器'Labels'和'Network'标识对于Traefik做动态路由非常重要
我的问题是:我可以把这个“标签”信息和“网络”信息放在loris.nomad
文件的什么地方,这样它就可以在同一个文件中启动容器docker-compose
文件当前的方式。
我试过将这些信息放在 task.config
节中,但这不起作用,而且我在遵循文档时遇到了问题。我已经看到添加了额外的“服务”节的示例,但我仍然不确定。
这是我要修改的游牧文件的基础知识。
# loris.nomad
job "loris" {
datacenters = ["dc1"]
group "loris" {
network {
port "http" {
to = 5004
}
task "loris" {
driver = "docker"
config {
image = "bdlss/loris-openjpeg-docker"
ports = ["http"]
}
resources {
cpu = 500
memory = 512
}
}
}
}
非常感谢任何建议。
好吧,运行ning traefik 在游牧和容器之间的负载平衡中最合适的选择是使用 consul catalog(服务发现需要)。
为此 运行 您必须在启动游牧时配置 consule connection。如果您想在本地进行测试,只需 运行ning sudo nomad agent -dev-connect
即可。 Consul 可以用 consul agent -dev -client="0.0.0.0"
.
现在您可以简单地使用 tags 提供您的 traefik 配置,如图 here.
如果你真的需要(这肯定会在集群设置中引起问题)到 运行 traefik in nomad with docker provider 你可以做以下:
首先你需要在docker插件中启用主机路径挂载。参见 this and this。您可以将您的配置放在一个额外的文件中,例如 extra.hcl,如下所示:
plugin "docker" {
config {
volumes {
enabled = true
}
}
}
现在您可以使用这个额外的设置开始游牧 sudo nomad agent -dev-connect -config=extra.hcl
。现在您可以在 config/labels 块中提供您的 traefik 设置,例如 (full):
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"
}
}
}
}
}
我希望这能以某种方式回答您的问题。