一文带你了解 Istio 流量路由

简介: 当我们尝试在 Kubernetes 中使用 NodePort 或 LoadBalancer 类型的服务设施配置进行通信时,Istio 或许是一个非常流行、新兴的开源服务网格产品,其能够用于通信管理、可观察性、错误处理及安全性等。作为微服务架构体系的一部分,为了无需过多地使用重复的逻辑填充每个微服务代码,我们可以利用 Istio 服务网格在一个地方完成所有这些事情。


    当我们尝试在 Kubernetes 中使用 NodePort 或 LoadBalancer 类型的服务设施配置进行通信时,Istio 或许是一个非常流行、新兴的开源服务网格产品,其能够用于通信管理、可观察性、错误处理及安全性等。作为微服务架构体系的一部分,为了无需过多地使用重复的逻辑填充每个微服务代码,我们可以利用 Istio 服务网格在一个地方完成所有这些事情。

    随着时间的推移,Istio 的各种其他功能以及它在基于微服务的应用程序开发中更具有广泛用途。由于大多数应用程序开发都采用基于微服务的架构,当两个服务之间的网络发生延迟时,将会抛出各种异常,因此,在实际的业务场景中,我们会要求每个微服务能够通过进行故障注入测试来关注其容错性,采用断路器模式或通过对应用程序进行金丝雀部署来安全部署服务,以观察应用程序的响应时间,并在底层微服务中定期更新。 

    在本文中,让我们聚焦基于 Istio 进行流量管理,通过部署一个 Sidecar 来为应用程序开发人员解决所有这些问题,该 Sidecar 负责为任何微服务应用程序执行所有横切功能。


   在下面的内容中,我将讨论使用 Istio VirtualService 资源实现的应用服务流量路由的三种基本场景。在进入本文正题之前,我们先来了解一下 VirtualService 相关概念。

   在 Istio 体系中,VirtualService 指示 Ingress Gateway 如何将允许的请求路由至所建设的容器集群中。

   基于 VirtualServices 配置的路由,其简要拓扑如下所示:


    基于上述拓扑展示,对于我们的应用程序请求,其主要通过 Http-Gateway 必须路由至如下下游 SA-Frontend、SA-Web-App 和 SA-Feedback 微服务。

    我们来简单分解下路由至 SA-Frontend 的相关请求,具体如下所示:

    1、Exact path(根路径)/ 应路由至 SA-Frontend 以获取 Index.html 等文件信息。

    2、Prefix path(前缀路径)/static/* 应路由至 SA-Frontend 以获取前端所需的任何静态文件,例如,级联样式表和 JavaScript 等文件信息。

    3、Paths matching the regex(匹配正则表达式) ^.*\.(ico|png|jpg)$ 的路径应路由到 SA-Frontend,因为它是页面需要显示的图像。

     相关参考配置文件清单,如下所示:


kind: VirtualService
metadata:
  name: external-services
spec:
  hosts:
  - "*"
  gateways:
  - http-gateway                      # 1
  http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*\.(ico|png|jpg)$'
    route:
    - destination:
        host: sa-frontend             # 2
        port:
          number: 8080

基于特定的应用版本

    每当我们想将任何微服务中的所有应用程序流量仅路由到一个特定版本时,可以通过向子集中的版本号添加路由来实现,如下所示,其中 HTTP 请求标头中的值路由所有传入的流量至指定版本的服务。Envoy 则会按照下面 VirtualService 资源中提到的路由规则来进行流量由。


- apiVersion: networking.istio.io/v1beta1
  kind: VirtualService 
  metadata: 
   name: dservice 
   namespace: dev
  spec:     
    hosts:     
     - dservice     
    http:     
    - route:       
      - destination:           
         host: dservice           
         subset: v1

基于加权路由

    在某些场景下,基于业务独特性,我们需要将部分应用程序流量路由至 v1 版本服务,而将其余部分则路由至 v2 版本服务,例如,A/B 测试或金丝雀部署等。那么,此时,可以通过为不同版本的服务分配权重来实现,如下图所示,其中 60% 的流量将转发至 v1 版本服务,其余 40% 则将路由至 v2 版本服务。这样,所流经的请求能够按照特定的百分比路由至指定的服务实例。

    当应用程序团队希望通过发布各种版本的 Web 服务并观察应用程序的 RED 指标来查看性能指标时,RED 方法的一个优点便是可以帮助我们考虑如何构建仪表板,将这三个指标放在每个服务的中心位置,并且错误率表示为请求率的比例。

    此方案有助于进行 A/B 测试。

 RED 方法定义了您应该为架构中的每个微服务测量的三个关键指标:

    1、(Request)Rate - 服务每秒请求数。  

    2、(Request)Errors - 每秒失败的请求数。

    3、(Request)Duration - 每个请求所用时间分布。

   衡量这些指标非常简单,尤其是在使用 Prometheus(或其他云平台所托管的 Prometheus 服务)之类的工具时。 


- apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService 
  metadata: 
   name: dservice 
   namespace: dev
  spec:     
    hosts:     
     - dservice     
    http:
    - route:       
      - destination:           
         host: dservice           
         subset: v1
        weight: 60
      - destination: 
         host: dservice
         subset: v2
        weight: 40

基于用户路由

    然而,除了上述场景外,还有一种场景便是应用程序服务需要先向特定的一组用户公开,然后再面向更大的用户群组发布生产最新版本。此种解决方案可以通过添加自定义 Header “最终用户”并将其映射到用户列表来实现,在下面的配置中,流量将先被路由至 v2 版本服务,而对于剩下的其他用户,流量则将被路由至 v1 版本服务。

    此方案有助于对应用程序进行 Beta 测试。


- apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService 
  metadata: 
   name: dservice
   namespace: dev
  spec:     
    hosts:     
     - dservice     
    http:  
    - match:  
      - headers: 
         end-user:     
           exact: ram
      route: 
      - destination: 
         host: dservice 
         subset: v2
    - route:       
      - destination:           
         host: dservice           
         subset: v1

    综上所述,在实际的项目活动中,Istio 的流量路由功能可帮助开发人员根据特定用户集的需求来自定义配置其微服务迭代策略,并能够允许在生产上线之前在灰度和模拟环境中测试服务的多个版本以降低服务发布风险。当然,除了流量路由之外,Istio 还有其他各种功能,例如,故障注入、断路器、超时和重试等,所有这些功能特性支撑了微服务应用程序的稳定运行,大家若对 Istio 产品感兴趣,可以去官网进行沉浸式体验。

相关文章
|
Kubernetes JavaScript API
如何理解 Istio Ingress, 它与 API Gateway 有什么区别?东西流量?南北流量?
这三者都和流量治理密切相关,那么流量治理在过去和现在有什么区别呢?都是如何做的呢? 在学习istio的时候对流量管理加深了理解。什么是东西流量?什么是南北流量?
291 0
|
Kubernetes 负载均衡 网络协议
全网最细,深度解析 Istio Ambient Mesh 流量路径
本文旨在对 Istio Ambient Mesh 的流量路径进行详细解读,力求尽可能清晰地呈现细节,以帮助读者完全理解 Istio Ambient Mesh 中最为关键的部分。
901 20
|
Kubernetes Shell iOS开发
Istio 网络:深入了解流量和架构
像 Istio 这样的服务网格项目为我们的架构引入了许多功能和优势,包括更安全地管理集群微服务之间的流量、服务发现、请求路由以及服务之间的可靠通信。
251 0
在Istio中实现Redis集群的数据分片读写分离和流量镜像
Redis 是一个高性能的 key-value 存储系统,被广泛用于微服务架构中。如果我们想要使用 Redis 集群模式提供的高级特性,则需要对客户端代码进行改动,这带来了应用升级和维护的一些困难。利用 Istio 和 Envoy ,我们可以在不修改客户端代码的前提下实现客户端无感知的 Redis Cluster 数据分片,并提供读写分离、流量镜像等高级流量管理功能。
|
监控 应用服务中间件 nginx
5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?
5 个 Istio 访问外部服务的流量控制常用例子,强烈建议收藏起来,以备不时之需。
314 0
5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?
|
机器学习/深度学习 JSON 网络协议
Istio IngressGateway 根据流量特征打标并据此路由
在阿里云 ASM 服务网格 Istio ingressgateway上实现根据流量特征(如来源于内外网、用户认证信息)等进行流量打标(染色),并根据流量标签进行路由和灰度发布。
1410 0
|
数据采集 算法 网络协议
基于istio的流量镜像构建真实流量的staging环境
istio 作为一个强大的服务网格工具,除了常见的熔断,限流,故障注入,A/B发布之外还可以用来做流量镜像(traffic mirror)的任务,流量镜像对于调试,测试和数据采集都是非常重要的,这里介绍基于istio的流量镜像构建staging环境。
1998 0
基于istio的流量镜像构建真实流量的staging环境
|
网络协议 测试技术 应用服务中间件
Istio流量管理实践之(3): 基于Istio实现流量对比分析
流量镜像提供一种尽可能低的风险为生产带来变化的强大功能。镜像会将实时流量的副本发送到镜像服务,镜像流量发生在主服务的关键请求路径之外。一旦我们能够可靠地镜像流量,就可以开始做一些有价值的事情,例如通过请求流量对比工具Diffy,可以将引入测试集群的流量与生产集群中的预期行为进行比较。
2197 0
|
1月前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
47 2
|
2月前
|
Kubernetes 安全 微服务
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
使用 Istio 缓解电信 5G IoT 微服务 Pod 架构的安全挑战
63 8