为什么某些服务需要“traefik.docker.network”?

Min*_*ind 5 docker grafana docker-swarm prometheus traefik

我有一个 docker swarm 设置,其中包含 traefik。我添加了带有以下标签的服务(在本例中为 grafana 和 prometheus):

  grafana:
    ...
    labels:
      - "router=inbound"
      - "traefik.http.routers.grafana.entrypoints=http"
      - "traefik.http.routers.grafana.rule=Host(`grafana.localhost`)"
      - "traefik.http.routers.grafana.service=grafana"
      - "traefik.http.services.grafana.loadbalancer.server.port=3000"
      - "traefik.docker.network=inbound"
  networks:
      - inbound

  traefik:
    ...
    command:
      - --providers.docker.constraints=Label(`router`,`inbound`)
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --entryPoints.http.address=:80
    networks:
      - inbound
Run Code Online (Sandbox Code Playgroud)

如果没有"traefik.docker.network=inbound"grafana 标签,我可以访问服务并访问 UI,但它非常不稳定,我经常遇到连接错误。有了这条线,一切都会顺利进行。

我想知道那条线到底是做什么的。当容器本身已配置为与 traefik 路由器位于同一网络内时,为什么在没有该线路的情况下服务会出现连接问题(但并非完全无法访问)。

Jan*_*sky 1

traefik 如何选择服务的 IP 地址

您的示例声明服务grafana标签:

      - "traefik.http.routers.grafana.service=grafana"
      - "traefik.http.services.grafana.loadbalancer.server.port=3000"
Run Code Online (Sandbox Code Playgroud)

这些标签指示traefik将 HTTP 请求转发到服务的端口 3000 grafana

由于docker允许每个服务连接到多个网络,因此服务(例如grafana)可能有多个具有不同IP地址的网络接口。

您的 HTTP 服务可能绑定到所有网络接口,而其他服务可能仅绑定到其中的子集。后续版本将不再在某些接口上提供 HTTP 服务。

traefik没有找到标签时:

      - "traefik.docker.network=inbound"
Run Code Online (Sandbox Code Playgroud)

它会向 swarm 请求服务的 IP 地址grafana,并选择最先出现的内容,而不管网络如何。如果您选择的地址不是由您的服务提供的,您会遇到超时 - 因此您会遇到随机连接问题。

另一方面 - 当标签traefik.docker.network存在时,traefik更加挑剔,并且仅采用绑定到给定网络的服务的 IP 地址。假设grafana始终绑定到该网络接口,您将获得稳定的响应。

治愈 grafana、virtuoso 等服务

许多服务在没有这个标签的情况下也能完美运行,例如whoaminginxPython Web 应用程序使用我们waitressuvicorn为我们工作,没有任何问题。

还有其他服务,例如grafana或,如果不与标签一起使用,virtuoso它们可能会在 docker swarm 中变得不稳定或完全无法使用。traefiktraefik.docker.network

我和我的同事 Milan Holub 花了大约 18 个小时试图解决神秘问题virtuoso(仅响应第一个请求,在 traefik 仪表板中更改其 IP 地址......),标签traefik.docker.network是最终的解决方案。