如何使用 docker 公开 envoy?
How to expose envoy using docker?
我在 docker 中有微服务容器 运行。我想将 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
当我打开网关服务的控制台时,这两个命令起作用了:
- 连接人员服务,直接下载人员名单
curl personapi/person
- 连接到 envoy 并使用它路由到个人服务
curl localhost:10000/person
现在在主机上,当我尝试连接到端口 7999 上的网关服务时(在 docker compose 中指定映射到 apigateway 端口 10000)我得到一个空的响应 - 甚至没有状态码。好像有什么东西在听,但它拒绝回答任何请求。
如何向主机公开 Envoy 运行 docker?
它在 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 }
您 运行 在此处遇到的问题并非特定于 docker,而是网络接口的工作方式。
在不起作用的那个中,您将 Envoy 侦听器绑定到 127.0.0.1
。这是 loopback interface,您只能从 运行 所在的同一台机器上调用它。在此示例中,您需要 docker exec
进入容器才能调用此接口。
在有效的那个中,您绑定到 0.0.0.0
,这是 IPV4 表示“我将接受来自任何地方的连接”的方式。该绑定使您可以从 Docker 容器外部处理 Envoy 侦听器。
我在 docker 中有微服务容器 运行。我想将 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
当我打开网关服务的控制台时,这两个命令起作用了:
- 连接人员服务,直接下载人员名单
curl personapi/person
- 连接到 envoy 并使用它路由到个人服务
curl localhost:10000/person
现在在主机上,当我尝试连接到端口 7999 上的网关服务时(在 docker compose 中指定映射到 apigateway 端口 10000)我得到一个空的响应 - 甚至没有状态码。好像有什么东西在听,但它拒绝回答任何请求。
如何向主机公开 Envoy 运行 docker?
它在 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 }
您 运行 在此处遇到的问题并非特定于 docker,而是网络接口的工作方式。
在不起作用的那个中,您将 Envoy 侦听器绑定到 127.0.0.1
。这是 loopback interface,您只能从 运行 所在的同一台机器上调用它。在此示例中,您需要 docker exec
进入容器才能调用此接口。
在有效的那个中,您绑定到 0.0.0.0
,这是 IPV4 表示“我将接受来自任何地方的连接”的方式。该绑定使您可以从 Docker 容器外部处理 Envoy 侦听器。