前言
这篇文章属于纯理论,所含内容如下,按需阅读:
Istio概念、服务网格、流量管理、istio架构(Envoy、Sidecar 、Istiod)
虚拟服务(VirtualService)、路由规则、目标规则(DestinationRule)
网关(Gateway)、网络弹性和测试(超时、重试、熔断器、故障注入)
Istio是什么?
- Istio是一个开源的
服务网格
,透明的接入到分布式服务
中。它也是一个平台,集成任何日志、遥测和策略系统
的 API 接口。 - Istio 成功高效地运行
分布式微服务架构
,并提供保护、连接和监控
微服务的统一方法。 - Istio 有助于降低
DevOps
压力、开发团队
的压力。
服务网格是什么?
用来描述组成微服务应用程序、微服务网络以及它们之间的交互。
- 组成
微服务网络
- 实现
服务之间的交互
应用场景
服务发现、负载均衡、故障恢复、度量和监控
A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证
为什么使用Istio?
服务网格是通过sidecar
(边车)代理服务实现,控制平面
主要是对sidecar
的配置和管理,这包括:
- 为
HTTP、gRPC、WebSocket
和TCP 流量
自动负载均衡。 - 通过丰富的
路由规则、重试、故障转移和故障注入
对流量行为进行细粒度控制。 - 可插拔的策略层和配置 API,支持
访问控制、速率限制和配额
。 - 集群内(包括集群的入口和出口)所有流量的
自动化度量、日志记录
和追踪
。 - 在具有强大的基于
身份验证和授权
的集群中实现安全的服务间通信。
Istio还支持扩展
,满足你部署需求!
流量管理介绍
- Istio流量路由规则可以很容易的
控制服务之间的流量
和API调用
。能实现A/B测试、金丝雀发布、
基于流量百分比
发布。 - 开箱即用的
故障恢复
特性,有助于增强应用的健壮性
,从而更好地应对被依赖的服务或网络发生故障的情况。 - Istio 的流量管理由
Envoy
代理服务提供。网格内服务发送和接收的所有流量
都由Envoy 代理
处理,让控制网格内的流量变得异常简单,不需要对服务做更改。
为了在网格中导流,Istio 需要知道 endpoint 在哪和属于哪个服务
。为了定位到service registry(服务注册中心)
,Istio 会连接到一个服务发现系统。例如,如果您在 Kubernetes 集群上安装了 Istio,那么它将自动检测该集群中的服务和 endpoint(端点)。
使用此服务注册中心,Envoy 代理
可以将流量定向到相关服务。大多数基于微服务的应用程序
,每个服务的工作负载都有多个实例来处理流量,称为负载均衡池
。默认情况下,Envoy 代理基于轮询调度在服务的负载均衡池内分发流量,按顺序请求发送给池中每个成员,一旦所有服务实例均接收过一次请求后,重新回到第一个池成员。
这些 API 也使用 Kubernetes 的自定义资源定义(CRDs)来声明,可以使用 YAML 进行配置
。
istio架构
Istio 服务网格 逻辑上分为数据平面
(Data plane)和控制平面
(Control plane)
数据平面
:Envoy代理被部署为sidecar
,负责协调和控制微服务
之间的通信,收集和报告所有网格流量的遥测数据。控制平面
:管理并配置Envoy代理
Envoy
C++ 开发
的高性能代理,用于协调服务网格中所有服务的入站和出站流量
。Envoy 代理是唯一与数据平面流量交互
的 Istio 组件。
Envoy 代理被部署为服务的 Sidecar
,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:
动态服务发现
负载均衡
TLS 终端
HTTP/2 与 gRPC 代理
熔断器
健康检查
基于百分比流量分割的分阶段发布
故障注入
丰富的指标
Sidecar
- 允许 Istio 可以执行
策略决策
,提取丰富的遥测数据
,接着将这些数据发送到监视系统
以提供整个网格行为的信息。 - Sidecar 代理还允许
向 Istio 添加功能
,不需要重新设计架构或重写代码。
Istiod
- Istiod 提供
服务发现、配置和证书
管理。 - Istiod 将
控制流量
的高级路由规则
转换为 Envoy 特定的配置,并在运行时传播给 Sidecar。 - Istiod 安全通过内置的
身份和凭证
管理,实现了强大的服务对服务和终端用户
认证。 - Istiod 充当证书
授权(CA)
,生成证书以允许在数据平面中进行mTLS 通信
。
虚拟服务(VirtualService)
- 配置
请求流量
到服务,基于连通性和服务发现
能力。 - 每个虚拟服务包含
一组路由规则
。可以实现负载均衡
、基于不同版本流量百分比
路由。
为什么使用虚拟服务?
虚拟服务在增强 Istio 流量管理方面,发挥着至关重要的作用,通过对客户端请求与真实响应请求
的目标工作负载
进行解耦来实现。
基于不同服务版本的流量百分比
路由,实现A/B 测试、金丝雀发布
。
栗子
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3
hosts
字段
- 虚拟服务的主机,
客户端请求
或路由规则
的目标地址,即客户端访问服务的地址。 - 虚拟服务主机名可以是
IP 地址、DNS 名称
,或者依赖于平台的一个简称
(Kubernetes 服务的短名称)也可以使用通配符(“*”)
前缀
路由规则
http
字段包含虚拟服务的路由规则
,用来描述匹配条件和路由行为
,它们把HTTP/1.1、HTTP2 和 gRPC
等流量发送到hosts
字段指定的目标
一个路由规则包含了请求要流向哪个目标地址,具有 0 或多个匹配条件,取决于您的使用场景。
匹配条件
示例中的第一个路由规则有一个条件,因此以 match
字段开始。在本例中,您希望此路由应用于来自 ”jason“ 用户
的所有请求,所以使用 headers
、end-user
和 exact
字段选择适当的请求。
- match: - headers: end-user: exact: jason
Destination
- route 部分的
destination
字段指符合此条件的流量的实际目标地址。 - 与虚拟服务的
hosts
不同,destination
的 host 必须是存在于Istio 服务注册中心
的实际目标地址,否则 Envoy 不知道该将请求发送到哪里。
route: - destination: host: reviews subset: v2
destination 片段还指定了 Kubernetes 服务的子集,将符合此规则条件的请求转入其中,本例中子集名称是 v2。
路由规则优先级
路由规则按从上到下
的顺序选择,虚拟服务中定义的第一条规则有最高优先级
,不满足第一个路由规则的流量均流向一个默认的目标
。
本例中:第二条规则没有 match 条件,直接将流量导向 v3 子集。
- route: - destination: host: reviews subset: v3
路由规则的更多内容
可以在流量端口、header 字段、URI 等内容上设置匹配条件
匹配条件: