签名我们了解了位于服务网格内部的应用应如何访问网格外部的 HTTP 和 HTTPS 服务,我们学习了如何通过 ServiceEntry
对象配置 Istio 以受控的方式访问外部服务,这种方式实际上是通过 Sidecar 直接调用的外部服务,但是有时候我们可能需要通过专用的 Egress Gateway 服务来调用外部服务,这种方式可以更好的控制对外部服务的访问。
Istio 使用 Ingress 和 Egress Gateway 配置运行在服务网格边缘的负载均衡,Ingress Gateway 允许定义网格所有入站流量的入口。 Egress Gateway 是一个与 Ingress Gateway 对称的概念,它定义了网格的出口。Egress Gateway 允许我们将 Istio 的功能(例如,监视和路由规则)应用于网格的出站流量。
使用场景
比如有一个对安全要求非常严格的团队,要求服务网格所有的出站流量必须经过一组专用节点。专用节点运行在专门的机器上,与集群中运行应用程序的其他节点隔离,这些专用节点用于实施 Egress 流量的策略,并且受到比其余节点更严密地监控。
另一个使用场景是集群中的应用节点没有公有 IP,所以在该节点上运行的网格服务都无法访问互联网,那么我们就可以通过定义 Egress gateway,将公有 IP 分配给 Egress Gateway 节点,用它引导所有的出站流量,可以使应用节点以受控的方式访问外部服务。
接下来我们就来学习下在 Istio 中如何配置使用 Egress Gateway。
准备工作
如果你使用的 demo 这个配置文件安装 Istio,那么 Egress Gateway 已经默认安装了,可以通过下面的命令来查看:
$ kubectl get pod -l istio=egressgateway -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-556f6f58f4-hkzdd 1/1 Running 0 14d
如果没有 Pod 返回,可以通过下面的步骤来部署 Istio Egress Gateway。如果你使用 IstioOperator
安装 Istio,请在配置中添加以下字段:
spec:
components:
egressGateways:
- name: istio-egressgateway
enabled: true
否则使用如下的 istioctl install 命令来安装:
$ istioctl install
--set components.egressGateways[0].name=istio-egressgateway
--set components.egressGateways[0].enabled=true
同样我们还是使用 sleep 示例做为发送请求的测试源,如果启用了自动 Sidecar 注入,运行以下命令部署示例应用程序:
kubectl apply -f samples/sleep/sleep.yaml
否则,在使用以下命令部署 sleep 应用程序之前,手动注入 Sidecar:
kubectl apply -f