1

我正在尝试使用 Traefik v1 (1.7) 和 ECS 一次性任务作为后端来实现反向代理服务的解决方案,如此 SO question 中所述。路由应该是动态的 - 对路径的请求/user/1234/*应该转到 ECS 任务,使用适当的 docker 标签运行:

  docker_labels = {
    traefik.frontend.rule = "Path:/user/1234"
    traefik.backend       = "trax1"
    traefik.enable        = "true"
  }

到目前为止,此设置工作正常,但我需要为每个正在运行的任务创建一个 ECS 任务定义,因为 docker 标签是 ECS TaskDefinition 的属性,而不是 ECS 任务本身。是否可以在任务键/值属性中仅创建一个 TaskDefinition 并在 ECS 任务标签中传递 Traefik 规则?

这将需要对 Traefik 源代码进行一些修改,是否还有其他可用的选项或实现方式,我错过了,比如 API Gateway 或 Lambda@Edge?我对这些技术没有经验,现实世界的例子更受欢迎。

4

1 回答 1

0

通过使用 Traefik REST API提供程序解决。运行一次性任务的外部组件可以发现任务内部 IP 并通过对和部分中的traefik.frontend.rule = "Path:/user/1234"任务内部IP:port值即时更新 Traefik 配置backends

它应该GET首先从/api/providers/rest端点配置 Traefik,删除或添加相应的部分(如果任务已停止或启动),并通过方法将 Traefik 配置更新PUT到同一端点。

{
  "backends": {
    "backend-serv1": {
      "servers": {
        "server-service-serv-test1-serv-test-4ca02d28c79b": {
          "url": "http://172.16.0.5:32793"
        }
      }
    },
    "backend-serv2": {
      "servers": {
        "server-service-serv-test2-serv-test-279c0ba1959b": {
          "url": "http://172.16.0.5:32792"
        }
      }
    }
  },
  "frontends": {
    "frontend-serv1": {
      "entryPoints": [
        "http"
      ],
      "backend": "backend-serv1",
      "routes": {
        "route-frontend-serv1": {
          "rule": "Path:/user/1234"
        }
      }
    },
    "frontend-serv2": {
      "entryPoints": [
        "http"
      ],
      "backend": "backend-serv2",
      "routes": {
        "route-frontend-serv2": {
          "rule": "Path:/user/5678"
        }
      }
    }
  }
}
于 2020-04-11T14:29:52.130 回答