首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Traefik可以找到的码头集装箱运行游牧民作业

为Traefik可以找到的码头集装箱运行游牧民作业
EN

Stack Overflow用户
提问于 2020-12-29 16:39:22
回答 1查看 2.4K关注 0票数 1

我目前正在运行一个使用Traefik作为负载均衡器的docker容器,使用以下docker-组合文件:

代码语言:javascript
复制
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节中,但是这不起作用,而且我在跟踪文档时遇到了困难。我见过一些例子,其中添加了一个额外的“服务”节,但我仍然不确定。

下面是我要修改的游牧民文件的基本内容。

代码语言:javascript
复制
# 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
      }
    }
  }
}

任何建议都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-04 01:05:17

在游牧民中运行traefik和容器之间的负载平衡最合适的选项是使用领事目录 (服务发现所必需的)。

要运行这一点,您必须在开始游牧民时混淆消费连接。如果您喜欢在本地测试,只需运行sudo nomad agent -dev-connect就可以做到这一点。领事可以从consul agent -dev -client="0.0.0.0"开始。

现在,您可以使用标记提供traefik配置,如这里所示。

如果确实需要(这肯定会在集群设置中引起问题)与码头提供者一起在游牧民中运行traefik,则可以执行以下操作:

首先,您需要启用挂接插件中的主机路径。见。您可以将您的配置放在一个额外的文件中,如extra.hcl,如下所示:

代码语言:javascript
复制
plugin "docker" {
  config {
    volumes {
      enabled = true
    }
  }
}

现在,您可以从这个额外的设置sudo nomad agent -dev-connect -config=extra.hcl开始游牧民。现在,您可以在config/labels块中提供traefik设置,如(完整):

代码语言:javascript
复制
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>,但我认为这足以说明它有多复杂:):

代码语言:javascript
复制
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"
        }
      }
    }
  }
}

我希望这能回答你的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65495567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档