0%

Istio教程02-网关Gateway实践

1. 网关:将流量导入集群

流量首先被路由到一个入口点,该入口点是流量的守门人。

1.1 虚拟IP地址:简化服务访问

  1. 将域名映射到一个虚拟IP地址,该IP地址代表我们的服务,并将流量转发到实际服务实例,为我们提供了更高的可用性和更大的灵活性。

  2. 虚拟IP地址被绑定到一种称为反向代理的入口点类型。反向代理是一个负责将请求分发到后端服务的中间组件,它不对应任何特定的服务。反向代理还可以提供负载均衡等功能,这样请求就不会压垮任何一个后端。

1714556801290

1.2 虚拟主机:来自单个接入点的多个服务

在一个入口点托管多个不同的服务被称为虚拟主机托管。我们需要一种方法来决定将特定请求路由到哪个虚拟主机。

1714556972324

2. Istio 网关

2.1 入口网关

1706181372

创建网关

Gateway资源配置Envoy监听80端口并等待HTTP流量。

1706181641
  1. 运行网关的Pod(无论是默认的istio-ingressgateway,还是自定义网关)必须能够监听集群外部公开的端口或IP地址。
  2. 如果部署在像Google Container Engine(GKE)这样的云服务上,要确保使用LoadBalancer类型的服务,该服务将获得一个外部可路由的IP地址。

2.2 虚拟服务的网关路由

当流量进入网关时,我们需要通过一种方法将流量路由到服务网格中特定的服务,为此,我们将使用VirtualService资源。

1714559058549

正如你在spec.gateways字段中所看到的,这些流量规则仅适用于来自coolstore-gateway网关的流量。

1714559251695

现在应该可以看到一个成功的响应。

45739_108_5 1714559404558

2.3 Istio入口网关与Kubernetes Ingress

  1. Ingress规范只将80端口和443端口视为入口点。这严重限制了集群运营者允许进入服务网格的流量类型。例如,如果有Kafka或NATS.io工作负载,你可能希望向这些消息传递系统公开TCP连接,但Kubernetes Ingress不允许这样做。

  2. Ingress只能支持最基本的HTTP路由,最终导致需要将代理的其他高级功能放入到注解(annotation)中,而注解的方式在多个代理之间是不兼容的,无法移植。如果Istio继续这一趋势,将会有更多的注解用来解释Envoy作为边缘网关的所有能力。

  3. 最终,Istio决定重新构建入口网关,并将第4层(传输层)和第5层(会话层)的属性从第7层(应用层)路由关注点中分离出来。Istio的Gateway处理第4层和第5层的问题,而VirtualService处理第7层的问题。

3. 高级规则

3.1 将HTTP重定向到HTTPS

创建webapp-credential密钥,支持https

45739_112_1

重定向配置

1714560040215 1714560041633

3.2 TCP流量

  1. Istio的网关足够强大,不仅可以服务于HTTP/HTTPS流量,还可以服务于TCP流量。例如,我们可以通过入口网关公开数据库(如MongoDB)或消息队列(如Kafka)。
  2. 纯TCP流量不具备高级特性,例如重试、复杂的路由等。
  3. Kubernetes Ingress 默认不支持TCP or UDP services,Ingress 可以使用--tcp-services-configmap--udp-services-configmap这两个配置达到转发端口的目的。

在默认的istio-ingressgateway上公开31400端口。就像HTTP端口(80和443)一样,TCP端口31400必须作为一个NodePort或作为一个云LoadBalancer。

1706183299

现在已经在入口网关上暴露了一个端口,我们需要将流量路由到echo服务。为此,我们使用VirtualService资源。注意对于TCP流量,必须匹配传入端口——在本例中为31400端口:

1706183340

4. 参考文档

可以加首页作者微信,咨询相关问题!