您是否正在使用 Istio 来管理微服务架构 (MSA) 中复杂的通信?如果是,那么您一定听说过处理所有流量的核心工作者:Envoy 代理。这个紧密伴随每个服务容器的智能 Sidecar 是如何神奇地处理所有类型流量的呢?
您是否曾想过:“既然是一个代理,那它肯定是通过一个通道(端口)监听并处理所有事情的吧?” 🤔
今天,我们将纠正这个常见的误解,并揭示 Envoy 代理如何精巧高效地管理通信的秘密。

一个代理,一个监听器?🤔 误解与真相
开门见山地说,Envoy 代理绝不只有一只“耳朵”(监听器)。相反,它通常拥有多个监听器,而这正是 Istio 能够提供强大功能的核心秘诀之一。
这就像一个保安同时看守多扇门(Gate),处理不同目的的访客。🚪
- 门 A: 员工专用(内部服务间通信)
- 门 B: 外部访客专用(外部传入通信)
- 门 C: 货物专用(特殊目的通信)
Envoy 的监听器也与此类似。每个监听器都绑定到特定的 IP 地址和端口组合,准备专业地处理指定目的的流量。
为什么需要多个监听器?🚦
Envoy 使用多个监听器的原因很明确:正是为了根据流量的“类型”和“方向”应用不同的策略和规则。
1. 入站流量 (Inbound Traffic) 📥
指从其他服务进入到我的服务的所有流量。
- 作用: Envoy 拦截进入我的应用程序容器的请求。
- 监听器: 存在一个专用的监听器来处理此流量。例如,如果服务使用 8080 端口,Envoy 会检测到进入此端口的流量,执行 mTLS 解密、应用授权策略 (Authorization Policy)、收集各种指标等操作,然后安全地将其转发给应用程序。
2. 出站流量 (Outbound Traffic) 📤
指我的服务调用其他服务时产生的流量。
- 作用: 它拦截应用程序发送到外部的所有请求。
- 监听器: Istio 在这里使用了一种非常巧妙的方法,即“虚拟监听器 (Virtual Listener)”。这个在 0.0.0.0:15001 端口上运行的特殊监听器会首先接收所有出站流量。然后,它会检查请求的目的地 (Host, Port),并根据从 Istio 控制平面 (Control Plane) 获取的服务发现信息,将流量路由到最合适的集群(目标服务)。在此过程中,会应用 mTLS 加密、重试 (Retry)、熔断器 (Circuit Breaker) 等规则。
3. 其他特殊目的监听器 📈
除了入站和出站流量,Envoy 还为各种其他目的拥有额外的监听器。
- 管理和监控: 暴露
/stats/prometheus端点以供 Prometheus 收集指标的监听器(例如:15090 端口)。 - 健康检查 (Health Check): 允许 Istio 检查 Envoy 代理自身健康状况的监听器。
查看实际 Envoy 配置:“百闻不如一见” 💻
光凭文字描述可能不太直观,对吧?让我们通过 istioctl 命令直接查看注入到实际 Pod 中的 Envoy 代理的监听器配置。
以下是为名为 productpage 的 Pod 配置的 Envoy 监听器列表的简化示例。
# istioctl proxy-config listeners productpage-v1-xxxxxxxxxx-xxxxx -n default
ADDRESS PORT TYPE MATCH DESTINATION
0.0.0.0 15001 TCP ALL Route: 15001
0.0.0.0 15006 TCP ALL Route: 15006
0.0.0.0 15090 HTTP ALL Route: 15090
...
# 处理所有出站流量的虚拟监听器
127.0.0.1 15001 HTTP ALL PassthroughCluster
...
# productpage 服务(9080 端口)的入站流量监听器
10.4.1.23 9080 HTTP ALL Route: inbound|9080||
...
# 用于发往 reviews 服务的出站流量的虚拟入站监听器
0.0.0.0 9080 HTTP Transferred from 0.0.0.0:15001 Cluster: outbound|9080||reviews.default.svc.cluster.local
代码解析:
- 0.0.0.0:15001: 这是上面解释的出站虚拟监听器。所有出站流量都通过此监听器被拦截。
- 10.4.1.23:9080: 这是绑定到
productpage服务的 Pod IP 和服务端口 (9080) 的入站监听器。当外部调用productpage时,此监听器接收流量。 - 0.0.0.0:15090: 这是用于 Prometheus 指标收集的监听器。您可以通过访问
http://查看 Envoy 的各种统计信息。:15090/stats/prometheus - 0.0.0.0:9080: 您看到“Transferred from 0.0.0.0:15001”的说明了吗?这是用于发往
reviews服务(同样使用 9080 端口)的出站流量,在被 15001 虚拟监听器捕获后,为了路由到实际目的地reviews服务而内部使用的一部分监听器链。
结论:多才多艺的流量指挥家,Envoy 🚀
现在您应该已经明白,Envoy 代理并非只有一只耳朵,而是一个拥有多只专业化耳朵的精巧流量指挥家。
- 入站监听器像守护我们家园的可靠门卫一样,检查并保护传入的流量。
- 出站虚拟监听器则扮演着万能向导的角色,首先接收所有外部请求,然后智能地找到路径。
- 其他特殊目的监听器则持续报告代理的健康状况和性能。
正是由于这种多监听器架构,Istio 能够透明地拦截服务间的通信,并在无需修改代码的情况下提供 mTLS、流量控制和丰富的可观测性 (Observability) 等强大功能。
下次在 Istio 环境中调试网络问题或分析流量流时,请记住 Envoy 正在打开多只耳朵努力工作!
发表回复