1. 什么是网关
- 一个运行在网格边缘的负载均衡器
- 接收外部请求,转发给网格内的服务(也可以反过来理解,将网格内部服务暴露给外部)
- 通过网关配置对外的端口、协议 与内部服务的映射关系
Istio里有两种网关
Ingress网关和Egress网关
Ingress网关:用来控制进入的流量
Egress网关:用来控制出口流量
2. 创建网关
目标:创建一个入口网关,然后将进入网络的流量分发到后端的服务上
学习目标:通过网关控制入口流量
从下图可以看到,网关实际上也是需要一个Envoy Sidecar去配合。另外如果要在网关上进行一些流量控制的话,还需要定义一个虚拟服务
查看集群中目前存在哪些网关
kubectl get gw
bookinfo-gateway这个网关是部署bookinfo这个应用的时候创建的,作用是作为应用的整体入口
现在的任务是再创建一个网关,将“detail”这个服务暴露出去(当然正常一个应用最好只有一个入口)。
1. 配置清单demo
执行命令创建“网关”和“虚拟服务”
kubectl apply -f linshi/gateway.yaml
kubectl apply -f linshi/virtualservice.yaml
网关配置清单 gateway.yaml
网关里只配置具体的入口点 而不配置具体的路由,如果希望对进入的流量作一些路由控制就需要定义一个虚拟服务
apiVersion: networking.istio.io/v1alpha3
kind: Gateway # 网关资源
metadata:
name: test-gateway # 资源名称是 test-gateway
spec:
selector: # 选择器配置
istio: ingressgateway # 一般指向网关的pod
servers: # 定义可以通过http协议的80端口访问
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
虚拟服务配置清单 virtualservice.yaml
将匹配到的uri请求,打到details服务中
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-gateway
spec:
hosts: # 需要指定host
- "*"
gateways: # 和上面定义的网关的字段关联(与网关配置文件中的metadata.name资源一致)
- test-gateway
http:
- match: # 匹配两个uri
- uri:
prefix: /details
- uri:
exact: /health
route:
- destination:
host: details
port:
number: 9080
浏览器验证
(需将Ingress网关的地址暴露出去,映射端口为30759)
访问网关映射出去的地址 http://192.168.61.199:30759/details/789
访问网关映射出去的地址 http://192.168.61.199:30759/health
2. 配置清单参数详解
3. 网关的应用场景
- 最主要的就是将网格内的服务暴露给外边
- 配置访问安全相关的设置(HTTPS、mTLS 等)
- 比如希望外界是通过Https访问我们内部的,而内部服务本身是http的,这样一来网关就提供了一个安全性
- 一般来说网关都作为应用的统一入口,或者作一些API 聚合这样的功能
4. Api网关已经很成熟,为什么Servie Mesh或是Istio要提供自己的网关呐?
Service Mesh 最核心的功能就是流量控制,除了网格内部也就是服务间的流量控制外,他希望对进入网格以及出网格的流量也进行统一整体的控制。所以 他也需要在网格的边界也设置上这样的网关产品