使用 Eureka 和 traefik 和 docker compose 的微服务服务发现

Posted

技术标签:

【中文标题】使用 Eureka 和 traefik 和 docker compose 的微服务服务发现【英文标题】:Micro services Service discovery using Eureka and traefik with docker compose 【发布时间】:2018-07-29 15:07:42 【问题描述】:

Traefik 的傻瓜问题。我正在尝试使用 traefik 作为反向代理使用 docker compose 设置 Spring Cloud 微服务。

我的目标是微服务应该通过服务名称(例如:service-registry-app)相互通信,并且 traefik 应该将其解析为 IP 地址。一旦这在本地机器中运行,我想将其扩展为在 AWS ECS 上运行。

我使用

创建了 ana_network
docker network create ana_network

traefik 配置:

文件:docker-compose.yml

version: '2'

services:
  proxy:
    image: traefik
    command: --api --docker --docker.domain=docker.localhost --logLevel=DEBUG
    networks:
      - ana_network
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /dev/null:/traefik.toml

networks:
  ana_network:
    driver: bridge

微服务配置:

文件:docker-compose.yml

version: '2'

services:
  service-registry:
    image: sqshq/piggymetrics-registry
    restart: always
    networks:
      - web
    expose:
      - "8761"
    labels:
      - "traefik.backend=service-registry-app"
      - "traefik.frontend.rule=Host:service-registry-app.example.com"
    environment:
      CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD    
  config-server:
    image: sqshq/piggymetrics-config
    restart: always
    networks:
      - web
    expose:
      - "8888"
    depends_on:
      - service-registry
    environment:
       EUREKA_HOST: service-registry-app.example.com
       EUREKA_PORT: 8761
       CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

    labels:
      - "traefik.backend=config-server-app"
      - "traefik.frontend.rule=Host:config-server-app.example.com"    
networks:
  web:
    external:
      name: ana_network

我可以使用 curl 访问服务注册表应用程序

curl -H Host:service-registry-app.example.com http://172.21.0.2:8761

但配置服务器和 api 网关无法通过 docker compose 和 traefik 访问上述配置的服务注册表。

为了使所有微服务能够相互发现,我需要做哪些更改以及如何扩展它以使其在 ECS 上工作?

编辑1:

更正了将网络部分从服务移动到网络的缩进,这是一个错字。

我是容器和分布式系统的新手,因此我可能会问一些幼稚的明显问题,因此如果任何 traefik for dummies 会非常有帮助,那就太好了。

以下是我目前面临的两个问题,

1) 容器到容器的通信 - 示例,容器 2(本例中的配置服务器)应如何通过服务名称(如服务注册表)或任何其他方式与容器 1(服务注册表)进行通信以及如何访问这些来自外部世界的容器(在这种情况下是服务注册表)?

2) 扩展它以使其在 ECS 中工作,因此每个都将有自己的任务定义并在 ECS 集群内作为服务运行 - 在这种情况下,容器应如何使用 traefik 相互通信?

【问题讨论】:

第二个撰写文件末尾的网页部分是什么?看起来您想定义一个网络,但定义了一个服务。 谢谢指出。在这里输入时输入错误。仍然面临同样的问题,我已经更新了我的问题。 【参考方案1】:

您的容器到容器网络似乎在多个地方出现故障。使用您的 traefik compose 文件,您定义了一个网络,但不将其标记为外部,因此 compose 将创建一个其他项目看不到的 $project_ana_network 网络。通过将其标记为外部来解决此问题:

networks:
  ana_network:
    external:
      name: ana_network

在您的第二个撰写文件中,您定义了一个 Web 服务,看起来您正在尝试定义一个 Web 网络,这似乎是由于“网络”缩进不正确造成的。老实说,我什至不知道它会如何运行,因为“网络”网络不存在供您的其他服务使用。

对于 traefik 集成,我更喜欢不定义后端名称,而是指定网络名称和端口,以便 traefik 知道如何连接到容器,以防您在容器上定义多个网络或端口。

结果如下:

version: '2'

services:
  service-registry:
    image: sqshq/piggymetrics-registry
    restart: always
    networks:
      - web
    expose:
      - "8761"
    labels:
      - "traefik.frontend.rule=Host:service-registry-app.example.com"
      - "traefik.docker.network=ana_network"
      - "traefik.port=8761"
    environment:
      CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD    
  config-server:
    image: sqshq/piggymetrics-config
    restart: always
    networks:
      - web
    expose:
      - "8888"
    depends_on:
      - service-registry
    environment:
       EUREKA_HOST: service-registry-app.example.com
       EUREKA_PORT: 8761
       CONFIG_SERVICE_PASSWORD: $CONFIG_SERVICE_PASSWORD

    labels:
      - "traefik.backend=config-server-app"
      - "traefik.frontend.rule=Host:config-server-app.example.com"    

networks:
  web:
    external:
      name: ana_network

最后,我还没有设置 Eureka 安装,但如果您希望容器直接通过容器网络进行通信,我建议您使用:

EUREKA_HOST: service-registry

指定使用 traefik 列出的地址会将请求从 docker 发送出去,通过 traefik 返回,添加不必要的跃点。

如果您需要将 EUREKA_HOST 设置为外部名称,但仍想使用容器到容器网络,那么您可以配置网络别名:

services:
  service-registry:
    ...
    networks:
      web:
        aliases:
        - "service-registry-app.example.com"

【讨论】:

更正了缩进并更新了更多细节问题。仍然无法访问其他容器服务,请帮助。 上面的答案推荐的不仅仅是错字更正。

以上是关于使用 Eureka 和 traefik 和 docker compose 的微服务服务发现的主要内容,如果未能解决你的问题,请参考以下文章

k8s ingress-controller 之 traefik 2.X

k8s ingress-controller 之 traefik 2.X

对于 k3s 中的 Traefik Ingress Controller,禁用 TLS 验证

为 Traefik 定义主机和路径前端规则

使用 Traefik 时如何使用 Nginx 和 Django Gunicorn 提供静态内容

使用 docker-compose 和 traefik 实现微服务之间的通信