Как выставить посланника с помощью докера?

У меня в докере работают контейнеры микросервисов. Я хочу настроить envoy в качестве единого шлюза для ряда API. В моем docker-compose.yml у меня есть определенная служба personapi и следующий раздел, определяющий шлюз:

  apigateway:
    image: ${DOCKER_REGISTRY-}apigateway
    build:
      context: .
      dockerfile: src/envoy/Dockerfile
    ports:
      - "7999:10000"
    depends_on:
      - personapi

Также имеется файл envoy.yaml, который копируется в образ шлюза и содержит следующее:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: some_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: personapi
                port_value: 80

Когда я открываю консоль для службы шлюза, работают эти две команды:

  1. Подключитесь к персональному сервису и загрузите список людей напрямую
curl personapi/person
  1. Подключитесь к посланнику и используйте его для маршрутизации к службе человека
curl localhost:10000/person

Теперь на хост-машине, когда я пытаюсь подключиться к службе шлюза через порт 7999 (указанный в докере, чтобы сопоставить порт 10000 apigateway), я получаю пустой ответ - даже не код состояния. Вроде что-то слушает, но отказывается отвечать на любые запросы.

Как мне открыть посланника на хост-машине, на которой запущен докер?


person jakubiszon    schedule 28.10.2020    source источник


Ответы (2)


Проблема, с которой вы здесь столкнулись, связана не с докером, а с тем, как работают сетевые интерфейсы.

В том, что не сработало, вы привязывали слушателя Envoy к 127.0.0.1. Это интерфейс обратной связи и вы сможете вызвать его только с того же компьютера, на котором он запущен. В этом примере вам нужно docker exec в контейнер, чтобы иметь возможность вызывать этот интерфейс.

В том, что действительно сработало, вы привязаны к 0.0.0.0, что является способом IPV4, чтобы сказать, что я буду принимать соединения отовсюду. Эта привязка позволяет вам обращаться к слушателю Envoy извне контейнера Docker.

person justincely    schedule 29.10.2020
comment
это должен быть принятый ответ. это не относится к посланнику как таковому. 0.0.0.0 - это стандартное обозначение любой службы, обозначающее, что она будет привязана ко всем адресам машины / виртуальной машины, на которой работает служба. - person Dexter Legaspi; 18.02.2021

Он заработал после обновления address в socket_address

# this works:
socket_address: { address: 0.0.0.0, port_value: 10000 }

# this did not:
socket_address: { address: 127.0.0.1, port_value: 10000 }
person jakubiszon    schedule 28.10.2020