【问题标题】:Running a nomad job for a docker container that Traefik can find为 Traefik 可以找到的 docker 容器运行 nomad 作业
【发布时间】:2021-04-06 06:50:00
【问题描述】:

我目前正在使用以下 docker-compose 文件运行一个使用 Traefik 作为负载均衡器的 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 的一部分,我只是希望能够使用 nomad 作业 loris.nomad 而不是使用 docker-compose 文件来启动这个容器。

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
      }
    }
  }
}

非常感谢任何建议。

【问题讨论】:

    标签: docker docker-compose traefik nomad


    【解决方案1】:

    嗯,在 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 插件中启用主机路径挂载。请参阅 thisthis。您可以将配置放在一个额外的文件中,例如 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 -&gt; host:&lt;random&gt;,但我认为这足以说明它变得多么复杂 :)):

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

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

    【讨论】:

    • 感谢您抽出宝贵时间撰写此回复。这很有帮助。显然,我现在还在学习如何添加 Consul。您的回答是我学习旅程中非常感谢的一部分:)
    • 不客气!很高兴阅读它对您有帮助!当你学习如何运行分布式微服务架构应用程序时,也可以看看 kubernetes,因为它已经是“标准”(只是我的观点)。很好的资源是 learnk8s.iokatacoda.com(在这里你也可以找到几个 hashcorp 工具)。
    猜你喜欢
    • 2018-01-04
    • 2021-08-23
    • 2018-12-27
    • 2017-10-26
    • 2016-02-21
    • 1970-01-01
    • 2020-12-04
    • 2019-10-04
    • 2016-08-29
    相关资源
    最近更新 更多