我目前正在运行一个使用Traefik作为负载均衡器的docker容器,使用以下docker-组合文件:
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的一部分,我只是希望能够使用游牧作业loris.nomad来启动这个容器,而不是使用docker文件。
码头集装箱“标签”和“网络”标识对于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
}
}
}
}任何建议都是非常感谢的。
发布于 2021-01-04 01:05:17
在游牧民中运行traefik和容器之间的负载平衡最合适的选项是使用领事目录 (服务发现所必需的)。
要运行这一点,您必须在开始游牧民时混淆消费连接。如果您喜欢在本地测试,只需运行sudo nomad agent -dev-connect就可以做到这一点。领事可以从consul agent -dev -client="0.0.0.0"开始。
现在,您可以使用标记提供traefik配置,如这里所示。
如果确实需要(这肯定会在集群设置中引起问题)与码头提供者一起在游牧民中运行traefik,则可以执行以下操作:
首先,您需要启用挂接插件中的主机路径。见这和这。您可以将您的配置放在一个额外的文件中,如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"
}
}
}
}
}我希望这能回答你的问题。
https://stackoverflow.com/questions/65495567
复制相似问题