我在 之前的一篇博客中讲解过 Istio 中 sidecar 的注入、使用 iptables 进行透明流量拦截及流量路由的详细过程,并以 Bookinfo 示例中的 productpage
服务访问 reviews
服务,和 reviews
服务访问 ratings
服务为例绘制了透明流量劫持示意图。在那个示意图中仅展示了 reviews
pod 接收流量和对外访问的路由,实际上 sidecar 内的流量远不止于此。
本文将向你展示 Istio sidecar 中的六种流量类型及其 iptables 规则,并以示意图的形式带你一览其全貌。
Sidecar 中的流量可以划分为以下几类:
下面将依次解释每个场景下 Sidecar 内的 iptables 路由规则。
以下是远程服务、应用或客户端访问数据平面本地 Pod IP 的 iptables 规则。
Remote Pod -> RREROUTING
-> ISTIO_INBOUND
-> ISTIO_IN_REDIRECT
-> Envoy 15006(Inbound)-> OUTPUT
-> ISTIO_OUTPUT
RULE 1 -> POSTROUTING
-> Local Pod
我们看到流量只经过一次 Envoy 15006 Inbound 端口。这种场景下的 iptables 规则的示意图如下。
以下是本地 Pod IP 访问远程服务经过的 iptables 规则。
Local Pod-> OUTPUT
-> ISTIO_OUTPUT
RULE 9 -> ISTIO_REDIRECT -> Envoy 15001(Outbound)-> OUTPUT
-> ISTIO_OUTPUT
RULE 4 -> POSTROUTING
-> Remote Pod
我们看到流量只经过 Envoy 15001 Outbound 端口。这种场景下的 iptables 规则的示意图如下。
以上两种场景中的流量都只经过一次 Envoy,因为该 Pod 中只有发出或接受请求一种场景发生。
Prometheus 抓取数据平面 metrics 的流量不会也无须经过 Envoy 代理。
这些流量通过的 iptables 规则如下。
Prometheus-> RREROUTING
-> ISTIO_INBOUND
(对目的地为 15002、15090 端口流量将转到 INPUT
)-> INPUT
-> OUTPUT
-> ISTIO_OUTPUT
RULE 3 -> POSTROUTING
-> Local Pod
这种场景下的 iptables 规则的示意图如下。
一个 Pod 可能同时存在两个或多个服务,如果 Local Pod 访问的服务也在该当前 Pod 上,流量会依次经过 Envoy 15001 和 Envoy 15006 端口最后到达本地 Pod 的服务端口上。
这些流量通过的 iptables 规则如下。
Local Pod-> OUTPUT
-> ISTIO_OUTPUT
RULE 9 -> ISTIO_REDIRECT
-> Envoy 15001(Outbound)-> OUTPUT
-> ISTIO_OUTPUT
RULE 2 -> ISTIO_IN_REDIRECT
-> Envoy 15006(Inbound)-> OUTPUT
-> ISTIO_OUTPUT
RULE 1 -> POSTROUTING
-> Local Pod
这种场景下的 iptables 规则的示意图如下。
Envoy 内部进程的 UID 和 GID 为 1337,它们之间的流量将使用 lo 网卡,使用 localhost 域名来通信。
这些流量通过的 iptables 规则如下。
Envoy 进程(Localhost) -> OUTPUT
-> ISTIO_OUTPUT
RULE 8 -> POSTROUTING
-> Envoy 进程(Localhost)
这种场景下的 iptables 规则的示意图如下。
Sidecar 需要访问 Istiod 以同步配置,因此 Envoy 会有向 Istiod 发送流量。
这些流量通过的 iptables 规则如下。
Local Pod-> OUTPUT
-> ISTIO_OUTPUT
RULE 4 -> POSTROUTING
-> Istiod
这种场景下的 iptables 规则的示意图如下。
Istio 注入在 Pod 内或虚拟机中安装的所有 sidecar 代理组成了服务网格的数据平面,也是 Istio 的主要工作负载所在地,通过 Istio 中的透明流量劫持 及这篇博客,相信你一定对 sidecar 代理中的流量有了一个深刻的了解,但这还只是管中窥豹,略见一斑,在我的 下一篇博客中,我将带你了解 Envoy 中各个组件的端口及其功能,这样可以让我们对 Istio 中的流量有一个更全面的了解。