运行 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"
        }
      }
    }
  }
}

我希望这能以某种方式回答您的问题。