1

我有一个在端口 8080 上运行的服务,它同时接受 http 和 gRPC。我了解 traefik 中的 gRPC 存在一些限制,所以这里是最终目标。

  1. 接受端口 8080 上的 ipWhitelisted 流量
  2. 接受来自 :80 /graphql 的流量并路由到 :8080 /graphql
  • 最终我想在路由 / 和路由到 /graphql 上接受这个
  1. 接受来自 :80 /admin/schema 的 ipWhitelisted 流量并路由到 :8080 /admin/schema
  • 最终我想在路由 /admin 和路由到 /graphql 上接受这个

如果我得到这个工作,我相信我可以完成下一部分:

  1. 使用 letencrypt 启用 https 并接受从 :443 到 /graphql 和 /admin 端点的流量。

对于配置,我使用的是 docker compose 文件。

version: "3.2"
services:
  reverse-proxy:
    image: traefik:v2.2
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.dgraph.address=:8080"
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  # there is another service here `zero` that is not using traefik so I ommitted its config.  
  alpha:
    image: dgraph/dgraph:master
    volumes:
      - /dgraph/data:/dgraph
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.adminIps.ipwhitelist.sourcerange=1.1.1.1" # my ip address instead of 1.1.1.1
      - "traefik.http.routers.alpha.rule=Host(`api.mydomain.com`) && Path(`/graphql`)"
      - "traefik.http.routers.alpha.entrypoints=dgraph"
      - "traefik.http.routers.schema.rule=Host(`api.mydomain.com`) && Path(`/admin/schema`)"
      - "traefik.http.routers.schema.middlewares=adminIps@docker"
      - "traefik.http.routers.schema.entrypoints=dgraph"
      - "traefik.http.routers.all.rule=Host(`api.mydomain.com`)"
      - "traefik.http.routers.all.middlewares=adminIps@docker"
      - "traefik.http.routers.all.entrypoints=dgraph"
    restart: always
    command: dgraph alpha --my=alpha:7080 --zero=zero:5080 --whitelist 172.0.0.0:172.254.254.254

我曾尝试在端口 80 上创建另一个入口点,然后在路由器中使用它并添加一个负载平衡器,但这似乎不起作用。这是修改后的配置:

version: "3.2"
services:
  reverse-proxy:
    image: traefik:v2.2
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.dgraph.address=:8080"
      - "--entrypoints.web.address=:80"
    ports:
      - "8080:8080"
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  # there is another service here `zero` that is not using traefik so I ommitted its config.  
  alpha:
    image: dgraph/dgraph:master
    volumes:
      - /dgraph/data:/dgraph
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.adminIps.ipwhitelist.sourcerange=1.1.1.1" # my ip address instead of 1.1.1.1
      - "traefik.http.routers.alpha.rule=Host(`api.mydomain.com`) && Path(`/graphql`)"
      - "traefik.http.routers.alpha.entrypoints=web"
      - "traefik.http.services.alpha.loadbalancer.server.port=80"
      - "traefik.http.routers.schema.rule=Host(`api.mydomain.com`) && Path(`/admin/schema`)"
      - "traefik.http.routers.schema.middlewares=adminIps@docker"
      - "traefik.http.routers.schema.entrypoints=dgraph"
      - "traefik.http.routers.all.rule=Host(`api.mydomain.com`)"
      - "traefik.http.routers.all.middlewares=adminIps@docker"
      - "traefik.http.routers.all.entrypoints=dgraph"
    restart: always
    command: dgraph alpha --my=alpha:7080 --zero=zero:5080 --whitelist 172.0.0.0:172.254.254.254

上面的第一个 docker-compose.yml 文件有效。所谓工作,我的意思是它在端口 8080 上正确应用了路由、规则和中间件。

上面的第二个 docker-compose.yml 文件我希望打开 80 端口并应用规则将 http api.mydomain.com/graphql 路由到 alpha:8080/graphql。这不会发生。当我推它时我没有收到任何错误,docker-compose up -d但是当我使用 yougetsignal.com 并检查打开的端口 80 时,我得到端口 80 已关闭的响应,并且当我尝试使用之前使用 route all 的端口 8080 时(api.mydomain.com:8080),我在浏览器“坏网关”中得到响应

4

1 回答 1

0

你说你的服务 alpha 正在监听8080,所以你应该使用它loadbalancer

"traefik.http.services.alpha.loadbalancer.server.port=8080"

你可以这样想:entrypoint是传入连接,loadbalancer是 Traefik 重定向请求的地方。

于 2020-07-31T06:41:59.063 回答