【问题标题】:How to expose envoy using docker?如何使用 docker 暴露特使?
【发布时间】:2020-10-28 21:34:33
【问题描述】:

我有在 docker 中运行的微服务容器。我想将特使设置为多个 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. 连接到 envoy 并使用它来路由到人员服务
curl localhost:10000/person

现在在主机上,当我尝试连接到端口 7999 上的网关服务(在 docker compose 中指定映射到 apigateway 端口 10000 )时,我得到一个空响应 - 甚至没有状态代码。似乎有什么东西在听,但它拒绝回答任何请求。

如何将 envoy 暴露给运行 docker 的主机?

【问题讨论】:

    标签: docker microservices envoyproxy


    【解决方案1】:

    您在此处遇到的问题并非特定于 docker,而是与网络接口的工作方式有关。

    在一个不起作用的情况下,您将 Envoy 侦听器绑定到 127.0.0.1。这是loopback interface,您只能从运行它的同一台机器上调用它。在本例中,您需要将docker exec 输入到容器中才能调用此接口。

    在确实有效的那个中,您绑定到0.0.0.0,这是 IPV4 表示“我将接受来自任何地方的连接”的方式。该绑定允许您从 Docker 容器外部寻址 Envoy 侦听器。

    【讨论】:

    • 这应该是公认的答案。这本身并不特定于特使。 0.0.0.0 是任何服务的标准符号,表示它将“绑定到运行该服务的机器/VM 的所有地址”。
    【解决方案2】:

    它在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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多