前言:
对于一个系统来说,有入系统的流量,就有出系统的流量。这两个流量就是我们常说的南北流量。对于入流量来说就用Ingress网关去管理,与之对应的出流量用Egress网关去管理。
1. 访问外部服务的方法?
- 有个全局配置项 global.outboundTrafficPolicy.mode = ALLOW_ANY (不推荐,不安全)
- 使用服务入口(ServiceEntry)
- 配置Sidecar 让流量绕过代理(一般不去使用它,因为相当于没有使用Istio的数据平面)
-
2. 何为Egress
Egress同样也是一个网关,管理出网格内部的流量。他定义了网格的出口点,允许你将监控、路由等这些功能在上面进行配置,统一的管理你的出流量。
3. Egress适用场景
假设有要求必须所有的出流量都统一经过某一些节点,比如处于一些安全考虑等等,这时候就需要设置一个Egress网关把所有的流量都收敛到这个节点去
- 可能你的网格内的服务,是没有办法直接访问公网的。相当于需要用Egress给他做一个代理,通过它去访问外部的服务。
4. 实验:创建Egress网关
目标:创建Egress网关,让内部服务通过网关去访问外部服务,如下图让sleep服务通过Engress网关去访问httpbin
- 查看一下Istio默认的egressgateway 组件是否存在,因为要使用他来进行Egress的配置
kubectl get pod -n istio-system
查看一下服务(Sleep)是否存在(如果不存在需要重新安装下)
kubectl get pod
- 为外部服务定义一个ServiceEntry
服务入口的配置清单如下 se.yaml
apiVersion: networking.istio.io/v1alpha3kind: ServiceEntrymetadata:name: httpbinspec:hosts:- httpbin.orgports:- number: 80name: http-portprotocol: HTTPresolution: DNS
安装资源
kubectl apply -f linshi/se.yaml
查看配置是否成功
kubectl get se
- 定义Egress gateway
主要注意下selector,使用的是Istio默认的gateway
apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:name: istio-egressgatewayspec:selector:istio: egressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- httpbin.org
运行命令 kubectl apply -f linshi/gw.yaml
查看gateway创建情况
kubectl get gw
- 定义路由,将流量引导到egressgateway
虚拟服务vs2.yaml配置清单如下
apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:name: vs-for-egressgatewayspec:hosts:- httpbin.orggateways:- istio-egressgateway- meshhttp:- match:- gateways:- meshport: 80route:- destination:host: istio-egressgateway.istio-system.svc.cluster.localsubset: httpbinport:number: 80weight: 100- match:- gateways:- istio-egressgatewayport: 80route:- destination:host: httpbin.orgport:number: 80weight: 100---apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:name: dr-for-egressgatewayspec:host: istio-egressgateway.istio-system.svc.cluster.localsubsets:- name: httpbin

运行命令 kubectl apply -f linshi/vs2.yaml
kubectl get vs
- 查看网关的日志验证即可
