Envoy 边车代理

Envoy sidecar proxy

我正在尝试了解 istio 和 envoy 的行为以及代理的工作原理!

假设我创建了一个应用程序,它不断向 google 搜索 API 发送请求。当我使用 istio 和 envoy 作为边车容器在我的 k8s 集群中部署它时,据说所有请求都是通过 proxy/sidecar 容器路由的。

我的问题是 - 应用程序和 proxy/sidecar 都 运行 在同一个 pod 中并共享同一个 IP。为了使应用程序将请求发送到 sidecar,应将其修改为将请求发送到本地主机(即发送到代理服务器端口),以便它可以转发到 google。但是一个应用程序的出站请求是如何路由到另一个应用程序的。这个配置在哪里维护?

有懂的大神解释一下吗?

istio-init 初始化容器用于 设置 iptables 规则,以便 inbound/outbound 流量将通过边车代理 。 init 容器在以下方面与应用程序容器不同:

它在应用程序容器启动之前运行,并且始终运行到完成。 如果有很多 init 容器,每个都应该在下一个容器启动之前成功完成。

因此,您可以看到这种类型的容器非常适合不需要成为实际应用程序容器一部分的设置或初始化作业。在这种情况下,istio-init 就是这样做的,并设置了 iptables 规则。

istio-proxy 这是实际的 sidecar 代理(基于 Envoy)。

进入应用程序pod并查看配置的iptables。我将展示一个使用 nsenter 的例子。或者,您可以以特权模式进入容器以查看相同的信息。对于无法访问节点的人,使用 exec 进入 sidecar 和 运行 iptables 更实用。

$ docker inspect b8de099d3510 --format '{{ .State.Pid }}'
4125

$ nsenter -t 4215 -n iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N ISTIO_INBOUND
-N ISTIO_IN_REDIRECT
-N ISTIO_OUTPUT
-N ISTIO_REDIRECT
-A PREROUTING -p tcp -j ISTIO_INBOUND
-A OUTPUT -p tcp -j ISTIO_OUTPUT
-A ISTIO_INBOUND -p tcp -m tcp --dport 80 -j ISTIO_IN_REDIRECT
-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15001
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -j ISTIO_REDIRECT
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN
-A ISTIO_OUTPUT -j ISTIO_REDIRECT
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001

上面的输出清楚地表明,所有进入端口 80(应用程序正在侦听的端口)的传入流量现在都重定向到端口 15001,这是 istio-proxy(一个 Envoy 代理)所在的端口听。传出流量也是如此。

更新: 代替 istio-init,现在似乎可以选择使用新的 CNI,这消除了对 init 容器和相关权限的需要。这个 istio-cni 插件设置了 pods' 网络来代替当前的 Istio 注入 pod istio-init 方法来满足这个要求。

https://istio.io/blog/2019/data-plane-setup/#traffic-flow-from-application-container-to-sidecar-proxy