如何理解 Istio 中的 VirtualService 和 DestinationRule?

标签: 理解 istio virtualservice | 发表时间:2022-10-14 16:18 | 作者:
出处:https://jimmysong.io/blog/

Istio 在刚开源的时候就定义了几十个 CRD,其中用于流量治理的有 RouteRuleDestinationPolicyEgressRule 等,后来推出了 v1alpha3 API 使用 VirtualServiceDestinationRule 等取代了之前的 API。但是这些资源对象的定义,并不像 Kubernetes 中那么直观,反而会有些难以理解,比如 VirtualService,只看名字你可能认为只是第一个了一个“虚拟的服务”,但实际并非如此。

本文将为你通过与实际的交通做类比,直观简要的介绍 Istio 中的两个核心的用于流量治理的对象—— VirtualServiceDestinationRule

流量 vs 交通

很多刚接触 Istio 的人可能对 VirtualServiceDestinationRule 和两个资源对象不是很理解,如果我们将环境仅限定于 Kubernetes 集群,我们可以将路由比喻成现实世界中的交通,有很多车辆在道路上行驶,这就是流量。 DestinationRule 相当于开辟了道路/路径/车道,确保了两点之间可达并控制车道的数量、宽度等。而 VirtualService 就像是红绿灯和道路标线,指挥车辆向哪行驶和如何行驶。也就是说如果你只定义了 DR 将不会对流量产生任何影响,因为你没有指挥流量怎么走,所以你必须定义 VirtualService 才可以控制流量的走向。

一句话来概括:DestinationRule 打通了两地之间的通路,犹如修路架桥通隧道,同时控制车道设路障;VirtualService 做车辆指挥调度。

请看下面这张将流量与交通的对比图,可以帮助你更直观的理解这种比喻。

image 流量与交通对比图

流量治理

下面列举了你分别可以在这两个资源对象上做的流量治理行为。

VirtualService

  • 路由:金丝雀发布、基于用户身、URI、Header 等匹配路由等;
  • 错误注入:HTTP 错误代码注入、HTTP 延时注入;
  • 流量切分:基于百分比的流量切分路由;
  • 流量镜像:将一定百分比的流量镜像发送到其他集群;
  • 超时:设置超时时间,超过设置的时间请求将失败;
  • 重试:设置重试策略,如触发条件、重试次数、间隔时间等;

DestinationRule

  • 负载均衡:设置负载均衡策略,如简单负载均衡、区域感知负载均衡、区域权重负载均衡;
  • 熔断(Circuit Breaking):通过异常点检测(Outlier Detection)和连接池设置将异常节点从负载均衡池中剔除;

总结

本文将抽象的流量治理与现实中的交通管理相类比,帮助你更直观的理解 Istio 中的流量管理对象 VirtualServiceDestinationRule。同时介绍了基于它们可以进行的流量治理功能。 VirtualService 主要用于设置路由规则,而服务弹性(超时、重试、熔断等)需要靠它和 DestinationRule 来共同维持。

参考

相关 [理解 istio virtualservice] 推荐:

如何理解 Istio 中的 VirtualService 和 DestinationRule?

- - Jimmy Song - 专注于探索后 Kubernetes 时代的云原生新范式 – 博客
Istio 在刚开源的时候就定义了几十个 CRD,其中用于流量治理的有 RouteRule、 DestinationPolicy、 EgressRule 等,后来推出了 v1alpha3 API 使用 VirtualService 和 DestinationRule 等取代了之前的 API.

如何理解 Istio Ingress, 它与 API Gateway 有什么区别?

- - Jimmy Song - 云原生|开源|社区 – 博客
API 网关作为客户端访问后端的入口,已经存在很长时间了,它主要是用来管理”南北向“的流量;近几年服务网格开始流行,它主要是管理系统内部,即“东西向”流量,而像 Istio 这样的服务网格还内置了网关,从而将系统内外部的流量纳入了统一管控. 这经常给初次接触 Istio 的人带来困惑——服务网格与 API 网关之间是什么关系.

如何理解 Istio 中的 mTLS 流量加密?

- - Jimmy Song - 专注于探索后 Kubernetes 时代的云原生新范式 – 博客
Istio 服务网格可以帮助云原生应用实现自动 mTLS,完成网格内的流量加密,有助于缩小云原生部署的攻击面,是构建零信任应用网络的关键框架. 为了理解 Istio 中的 mTLS 流量加密,本文将包括以下内容:. 介绍什么是 TLS、mTLS 和 TLS 终止. 介绍 Istio 中如何实现 TLS 加密.

istio 原理简介

- - 掘金 架构
由于 istio 自 1.5 版本以后架构上有了较大变化,控制面从多组件变成了单体的 istiod 组件,所以下文会先介绍 1.5 之前的架构,再介绍 1.5 之后的,是一个由繁到简的过程. istio 1.5 之前架构. Istio 的架构分为控制平面和数据平面. 数据平面:由一组智能代理(Envoy)以 sidecar 模式部署,协调和控制所有服务之间的网络通信.

Istio 常见的 10 个异常分析

- - DockOne.io
本文总结了使用 Istio 常见的 10 个异常. Istio 支持多平台,不过 Istio 和 Kubernetes 的兼容性是最优的,不管是设计理念,核心团队还是社区, 都有一脉相承的意思. 但 Istio 和 Kubernetes 的适配并非完全没有冲突,一个典型问题就是 Istio 需要 Kubernetes Service 按照协议进行端口命名(Port Naming).

Istio究竟是干嘛的? - 知乎

- -
当微服务架构体系越来越复杂的时候,需要将“业务服务”和“基础设施”解耦,将一个微服务进程一分为二:. 一个进程实现业务逻辑,biz,即上图白色方块. 一个进程实现底层技术体系,proxy,即上图蓝色方块,负载均衡、监控告警、服务发现与治理、调用链…等诸多基础设施,都放到这一层实现. biz不管是调用服务,还是提供服务,都只与本地的proxy进行本地通信.

使用 Istio 进行金丝雀部署

- -
本篇博客最后更新时间 2018 年 5 月 16 号,采用了最新版本的流量管理模型. Istio项目的一大好处就是为服务金丝雀方式部署提供了控制便利. 金丝雀部署(或上线)背后的想法是通过让一小部分用户流量引入的新版本进行测试,如果一切顺利,则可以增加(可能逐渐增加)百分比,逐步替换旧版本. 如在过程中出现任何问题,则可以中止并回滚到旧版本.

实践k8s istio熔断 - fat_girl_spring - 博客园

- -
熔断主要是无感的处理服务异常并保证不会发生级联甚至雪崩的服务异常. 在微服务方面体现是对异常的服务情况进行快速失败,它对已经调用失败的服务不再会继续调用,如果仍需要调用此异常服务,它将立刻返回失败. 与此同时,它一直监控服务的健康状况,一旦服务恢复正常,则立刻恢复对此服务的正常访问. 这样的快速失败策略可以降低服务负载压力,很好地保护服务免受高负载的影响.

知乎落地的 Service Mesh Istio

- -
在知乎,我们很早就进行了非常彻底的容器化部署. 全站在线运行的微服务数量高达两千多个. 这些微服务通过我们自己维护的 RPC 框架和 Kodor 体系来实现服务互联的能力. 在这其中,我们也存在一系列的问题:. 各种基础组件维护成本比较高,单点风险存在. 各语言客户端特性难以统一,熔断、重试等特性实现颇有不同,且不能做到动态线上进行调整.

Istio 中的服务和流量的抽象模型

- - IT瘾-dev
本文介绍了 Istio 和 Kubernetes 中的一些服务和流量的抽象模型. 虽然 Istio 一开始确定的抽象模型与对接的底层平台无关,但目前来看基本绑定 Kubernetes,本文仅以 Kubernetes 说明. 另外在 ServiceMesher 社区中最近有很多关于 Istio、Envoy、Kubernetes 之中的服务模型关系的讨论,本文作为一个开篇说明,Kubernetes 和 Isito 之间有哪些共有的服务模型,Istio 在 Kubernetes 的服务模型之上又增加了什么,为什么说 Kubernetes service 存在的意义仅剩下做服务发现.