前言:
对于一个系统来说,有入系统的流量,就有出系统的流量。这两个流量就是我们常说的南北流量。对于入流量来说就用Ingress网关去管理,与之对应的出流量用Egress网关去管理。

1. 访问外部服务的方法?

  • 有个全局配置项 global.outboundTrafficPolicy.mode = ALLOW_ANY (不推荐,不安全)
  • 使用服务入口(ServiceEntry)
  • 配置Sidecar 让流量绕过代理(一般不去使用它,因为相当于没有使用Istio的数据平面)
  • 配置Egress 网关

    2. 何为Egress

    Egress同样也是一个网关,管理出网格内部的流量。他定义了网格的出口点,允许你将监控、路由等这些功能在上面进行配置,统一的管理你的出流量。

    3. Egress适用场景

  • 假设有要求必须所有的出流量都统一经过某一些节点,比如处于一些安全考虑等等,这时候就需要设置一个Egress网关把所有的流量都收敛到这个节点去

  • 可能你的网格内的服务,是没有办法直接访问公网的。相当于需要用Egress给他做一个代理,通过它去访问外部的服务。

    4. 实验:创建Egress网关

    目标:创建Egress网关,让内部服务通过网关去访问外部服务,如下图让sleep服务通过Engress网关去访问httpbin
    image.png
  1. 查看一下Istio默认的egressgateway 组件是否存在,因为要使用他来进行Egress的配置

kubectl get pod -n istio-system
image.png

查看一下服务(Sleep)是否存在(如果不存在需要重新安装下)
kubectl get pod
image.png

  1. 为外部服务定义一个ServiceEntry

服务入口的配置清单如下 se.yaml

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: ServiceEntry
  3. metadata:
  4. name: httpbin
  5. spec:
  6. hosts:
  7. - httpbin.org
  8. ports:
  9. - number: 80
  10. name: http-port
  11. protocol: HTTP
  12. resolution: DNS

安装资源
kubectl apply -f linshi/se.yaml
image.png
查看配置是否成功
kubectl get se
image.png

  1. 定义Egress gateway

主要注意下selector,使用的是Istio默认的gateway

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: Gateway
  3. metadata:
  4. name: istio-egressgateway
  5. spec:
  6. selector:
  7. istio: egressgateway
  8. servers:
  9. - port:
  10. number: 80
  11. name: http
  12. protocol: HTTP
  13. hosts:
  14. - httpbin.org

运行命令 kubectl apply -f linshi/gw.yaml
image.png
查看gateway创建情况
kubectl get gw
image.png

  1. 定义路由,将流量引导到egressgateway

虚拟服务vs2.yaml配置清单如下

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: vs-for-egressgateway
  5. spec:
  6. hosts:
  7. - httpbin.org
  8. gateways:
  9. - istio-egressgateway
  10. - mesh
  11. http:
  12. - match:
  13. - gateways:
  14. - mesh
  15. port: 80
  16. route:
  17. - destination:
  18. host: istio-egressgateway.istio-system.svc.cluster.local
  19. subset: httpbin
  20. port:
  21. number: 80
  22. weight: 100
  23. - match:
  24. - gateways:
  25. - istio-egressgateway
  26. port: 80
  27. route:
  28. - destination:
  29. host: httpbin.org
  30. port:
  31. number: 80
  32. weight: 100
  33. ---
  34. apiVersion: networking.istio.io/v1alpha3
  35. kind: DestinationRule
  36. metadata:
  37. name: dr-for-egressgateway
  38. spec:
  39. host: istio-egressgateway.istio-system.svc.cluster.local
  40. subsets:
  41. - name: httpbin

image.png

运行命令 kubectl apply -f linshi/vs2.yaml
image.png
kubectl get vs
image.png

  1. 查看网关的日志验证即可