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

时间:2018-02-19 11:27:00

标签: docker docker-compose amazon-ecs netflix-eureka traefik

Traefik的傻瓜问题。我正在尝试用docker compose建立spring cloud微服务,使用traefik作为反向代理。

我的目标是微服务应该通过服务名称相互交谈(例如: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上运行,我需要做些什么改变?

EDIT1:

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

我是容器和分布式系统的新手,因此我可能会问一些天真的明显问题,因此如果任何一个傻瓜的traefik会非常有帮助的话会很棒。

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

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

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

1 个答案:

答案 0 :(得分:0)

您的容器到容器网络似乎在多个地方被破坏。使用您的traefik撰写文件,您可以定义网络,但不要将其标记为外部网络,这样撰写将创建一个其他项目无法看到的${project}_ana_network网络。通过将其标记为外部来解决此问题:

networks:
  ana_network:
    external:
      name: ana_network

在您的第二个撰写文件中,您定义了一个Web服务,看起来您正在尝试定义一个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"