1. 什么是网关

  • 一个运行在网格边缘的负载均衡器
  • 接收外部请求,转发给网格内的服务(也可以反过来理解,将网格内部服务暴露给外部)
  • 通过网关配置对外的端口、协议 与内部服务的映射关系

Istio里有两种网关
Ingress网关Egress网关
image.png
Ingress网关:用来控制进入的流量
Egress网关:用来控制出口流量

2. 创建网关

目标:创建一个入口网关,然后将进入网络的流量分发到后端的服务上
学习目标:通过网关控制入口流量

从下图可以看到,网关实际上也是需要一个Envoy Sidecar去配合。另外如果要在网关上进行一些流量控制的话,还需要定义一个虚拟服务
image.png

查看集群中目前存在哪些网关
kubectl get gw
image.png
bookinfo-gateway这个网关是部署bookinfo这个应用的时候创建的,作用是作为应用的整体入口

现在的任务是再创建一个网关,将“detail”这个服务暴露出去(当然正常一个应用最好只有一个入口)。

1. 配置清单demo

执行命令创建“网关”和“虚拟服务”
kubectl apply -f linshi/gateway.yaml
kubectl apply -f linshi/virtualservice.yaml
image.png
网关配置清单 gateway.yaml
网关里只配置具体的入口点 而不配置具体的路由,如果希望对进入的流量作一些路由控制就需要定义一个虚拟服务

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: Gateway # 网关资源
  3. metadata:
  4. name: test-gateway # 资源名称是 test-gateway
  5. spec:
  6. selector: # 选择器配置
  7. istio: ingressgateway # 一般指向网关的pod
  8. servers: # 定义可以通过http协议的80端口访问
  9. - port:
  10. number: 80
  11. name: http
  12. protocol: HTTP
  13. hosts:
  14. - "*"

虚拟服务配置清单 virtualservice.yaml
将匹配到的uri请求,打到details服务中

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: test-gateway
  5. spec:
  6. hosts: # 需要指定host
  7. - "*"
  8. gateways: # 和上面定义的网关的字段关联(与网关配置文件中的metadata.name资源一致)
  9. - test-gateway
  10. http:
  11. - match: # 匹配两个uri
  12. - uri:
  13. prefix: /details
  14. - uri:
  15. exact: /health
  16. route:
  17. - destination:
  18. host: details
  19. port:
  20. number: 9080

浏览器验证
(需将Ingress网关的地址暴露出去,映射端口为30759)
image.png
访问网关映射出去的地址 http://192.168.61.199:30759/details/789
image.png
访问网关映射出去的地址 http://192.168.61.199:30759/health
image.png

2. 配置清单参数详解

image.png

3. 网关的应用场景

  • 最主要的就是将网格内的服务暴露给外边
  • 配置访问安全相关的设置(HTTPS、mTLS 等)
    • 比如希望外界是通过Https访问我们内部的,而内部服务本身是http的,这样一来网关就提供了一个安全性
  • 一般来说网关都作为应用的统一入口,或者作一些API 聚合这样的功能

4. Api网关已经很成熟,为什么Servie Mesh或是Istio要提供自己的网关呐?

Service Mesh 最核心的功能就是流量控制,除了网格内部也就是服务间的流量控制外,他希望对进入网格以及出网格的流量也进行统一整体的控制。所以 他也需要在网格的边界也设置上这样的网关产品