使用外部 HTTPS 代理
配置 Egress Gateway1 示例展示如何通过名为 Egress Gateway 的 Istio 组件将流量从网格引导到外部服务。但是,有些情况下需要一个外部的传统(非 Istio)HTTPS 代理来访问外部服务。例如,您的公司可能已经有了这样的代理,并且可能需要所有应用程序通过代理来引导其流量。
此示例演示如何启用对外部 HTTPS 代理的访问。由于应用程序使用 HTTP CONNECT2 方法与 HTTPS 代理建立连接,因此配置流量到外部 HTTPS 代理不同于将流量配置为外部 HTTP 和 HTTPS 服务。
开始之前
按照安装指南3中的说明安装 Istio。
启动 sleep4 示例,以获取发送请求的测试源。 如果您启用了自动 sidecar 注入,运行以下命令部署示例应用程序:
否则,在使用以下命令部署
sleep
应用程序之前,手动注入 sidecar:为了发送请求,您需要创建
SOURCE_POD
环境变量来存储源 pod 的名称:
部署 HTTPS 代理
本例中为了模拟传统代理,在集群内部署了一个 HTTPS 代理。此外,为了模拟在集群外运行的更真实的代理,通过代理的 IP 地址而不是 Kubernetes 服务的域名来寻址代理的 pod。本例使用的是 squid6,但是您可以使用任何支持 HTTP CONNECT 连接的 HTTPS 代理。
为 HTTPS 代理创建一个命名空间,而不标记为用于 SideCar 注入。如果没有标签,则在新命名空间中 SideCar 注入是不可用的,因此 Istio 将无法控制那里的流量。您需要在集群之外通过这种行为来模拟代理。
为 Squid 代理创建配置文件。
创建 Kubernetes ConfigMap7 以保存代理的配置:
使用 Squid 部署容器:
在
external
命名空间中部署 sleep4 示例,以测试到代理的通信量,而不进行 Istio 流量控制。获取代理 pod 的 IP 地址并定义
PROXY_IP
环境变量来存储它:定义
PROXY_PORT
环境变量以存储代理的端口。本例子中 Squid 使用 3128 端口。从
external
命名空间中的 sleep pod 通过代理向外部服务发送请求:检查您请求的代理的访问日志:
现在,您在没有 Istio 的情况下完成了以下任务:
- 您部署了 HTTPS 代理。
- 您使用 curl 通过代理访问 wikipedia.org 外部服务。
下一步,您必须配置 Istio 启用的 pod 的流量到 HTTPS 代理。
配置流量到外部 HTTPS 代理
为 HTTPS 代理定义 TCP(不是 HTTP!)服务入口。尽管应用程序使用 HTTP CONNECT 方法与 HTTPS 代理建立连接,但必须为 TCP 通信而不是 HTTP 通信配置代理。一旦建立了连接,代理就简单地充当 TCP 隧道。
从
external
命名空间中的 sleep pod 发送请求。因为 sleep pod 有 Sidecar,可以让 Istio 控制其流量。查看您的请求的 Istio SideCar 代理的日志:
查看您请求的代理的访问日志:
理解原理
在本例中,您采取了以下步骤:
- 部署了一个 HTTPS 代理来模拟外部代理。
- 创建了一个 TCP 服务入口,用作引导 Istio 控制的流量 到外部代理。
请注意,您不能为通过外部代理访问的外部服务创建服务入口,例如 wikipedia.org。这是因为从 Istio 的角度来看,请求只发送到外部代理;Istio 并不知道外部代理会进一步转发请求。