Istio架构及工作原理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
访问控制,不限时长
简介: 【2月更文挑战第17天】从 Istio 的设计和实现原理可以看出,它是采用模块化设计,并且各个模块之间高度解耦,Proxy 专注于负责服务之间的通信,Pilot 专注于流量控制,Mixer 专注于策略控制以及监控日志功能,而 Citadel 专注于安全。

Istio 的架构可以说由两部分组成,分别是 Proxy 和 Control Plane。

  • Proxy,就是前面提到的 SideCar,与应用程序部署在同一个主机上,应用程序之间的调用都通过 Proxy 来转发,目前支持 HTTP/1.1、HTTP/2、gRPC 以及 TCP 请求。
  • Control Plane,与 Proxy 通信,来实现各种服务治理功能,包括三个基本组件:Pilot、Mixer 以及 Citadel。

image.png

1、Proxy

Istio 的 Proxy 采用的是 Envoy,Envoy 是跟上一期提到的 Linkerd 是同一代的产品,既要作为服务消费者端的正向代理,又要作为服务提供者端的反向代理,一般需要具备服务发现、服务注册、负载均衡、限流降级、超时熔断、动态路由、监控上报和日志推送等功能,它主要包含以下几个特性:


  • 性能损耗低。因为采用了 C++ 语言实现,Envoy 能提供极高的吞吐量和极少的长尾延迟,而且对系统的 CPU 和内存资源占用也不大,所以跟业务进程部署在一起不会对业务进程造成影响。
  • 可扩展性高。Envoy 提供了可插拔过滤器的能力,用户可以开发定制过滤器以满足自己特定的需求。
  • 动态可配置。Envoy 对外提供了统一的 API,包括 CDS(集群发现服务)、RDS(路由发现服务)、LDS(监听器发现服务)、EDS(EndPoint 发现服务)、HDS(健康检查服务)、ADS(聚合发现服务)等。通过调用这些 API,可以实现相应配置的动态变更,而不需要重启 Envoy。Envoy 是 Istio 中最基础的组件,所有其他组件的功能都是通过调用 Envoy 提供的 API,在请求经过 Envoy 转发时,由 Envoy 执行相关的控制逻辑来实现的。


Envoy 是 Istio 中最基础的组件,所有其他组件的功能都是通过调用 Envoy 提供的 API,在请求经过 Envoy 转发时,由 Envoy 执行相关的控制逻辑来实现的。


2、Pilot

Pilot 的作用是实现流量控制,它通过向 Envoy 下发各种指令来实现流量控制,它的架构如下图所示。从架构图里可以看出,Pilot 主要包含以下几个部分:


  • Rules API,对外封装统一的 API,供服务的开发者或者运维人员调用,可以用于流量控制。
  • Envoy API,对内封装统一的 API,供 Envoy 调用以获取注册信息、流量控制信息等。
  • 抽象模型层,对服务的注册信息、流量控制规则等进行抽象,使其描述与平台无关。
  • 平台适配层,用于适配各个平台如 Kubernetes、Mesos、Cloud Foundry 等,把平台特定的注册信息、资源信息等转换成抽象模型层定义的平台无关的描述。

image.png

Pilot 是如何实现流量管理功能的呢?

1)服务发现和负载均衡

服务 B 也就是服务提供者注册到对应平台的注册中心中去,比如 Kubernetes 集群中的 Pod,启动时会注册到注册中心 etcd 中。然后服务 A 也就是服务消费者在调用服务 B 时,请求会被 Proxy 拦截,然后 Proxy 会调用 Pilot 查询可用的服务提供者节点,再以某种负载均衡算法选择一个节点发起调用。


除此之外,Proxy 还会定期检查缓存的服务提供者节点的健康状况,当某个节点连续多次健康检查失败就会被从 Proxy 从缓存的服务提供者节点列表中剔除。

image.png

2)请求路由

Pilot 可以对服务进行版本和环境的细分,服务 B 包含两个版本 v1.5 和 v2.0-alpha,其中 v1.5 是生产环境运行的版本,而 v2.0-alpha 是灰度环境运行的版本。当需要做 A/B 测试时,希望灰度服务 B 的 1% 流量运行 v2.0-alpha 版本,就可以通过调用 Pilot 提供的 Rules API,Pilot 就会向 Proxy 下发路由规则,Proxy 在转发请求时就按照给定的路由规则,把 1% 的流量转发给服务 B 的 v2.0-alpha 版本,99% 的流量转发给服务 B 的 v1.5 版本。

image.png

3)超时重试

缺省状态下,Proxy 转发 HTTP 请求时的超时是 15s,可以通过调用 Pilot 提供的 Rules API 来修改路由规则,覆盖这个限制。比如下面这段路由规则,表达的意思是 ratings 服务的超时时间是 10s。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
    - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    timeout: 10s


除此之外,还可以通过修改路由规则,来指定某些 HTTP 请求的超时重试次数,比如下面这段路由规则,表达的意思就是 ratings 服务的超时重试次数总共是 3 次,每一次的超时时间是 2s。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
    - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s

4)故障注入

Istio 还提供了故障注入的功能,能在不杀死服务节点的情况下,通过修改路由规则,将特定的故障注入到网络中。它的原理是在 TCP 层制造数据包的延迟或者损坏,从而模拟服务超时和调用失败的场景,以此来观察应用是否健壮。比如下面这段路由规则的意思是对 v1 版本的 ratings 服务流量中的 10% 注入 5s 的延迟。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percent: 10
        fixedDelay: 5s
    route:
    - destination:
        host: ratings
        subset: v1


而下面这段路由规则意思是对 v1 版本的 ratings 服务流量中的 10% 注入 HTTP 400 的错误。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      abort:
        percent: 10
        httpStatus: 400
    route:
    - destination:
        host: ratings
        subset: v1


3、Mixer

Mixer 的作用是实现策略控制和监控日志收集等功能,实现方式是每一次 Proxy 转发的请求都要调用 Mixer,它的架构请见下图。而且 Mixer 的实现是可扩展的,通过适配层来适配不同的后端平台,这样的话 Istio 的其他部分就不需要关心各个基础设施比如日志系统、监控系统的实现细节。

image.png

理论上每一次的服务调用 Proxy 都需要调用 Mixer,一方面检查调用的合法性,一方面要上报服务的监控信息和日志信息,所以这就要求 Mixer 必须是高可用和低延迟的,那么 Mixer 是如何做到的呢?下图是它的实现原理,可以看到 Mixer 实现了两级的缓存结构:

  • Proxy 端的本地缓存。为了减少 Proxy 对 Mixer 的调用以尽量降低服务调用的延迟,在 Proxy 这一端会有一层本地缓存,但由于 Proxy 作为 SideCar 与每个服务实例部署在同一个节点上,所以不能对服务节点有太多的内存消耗,所以就限制了 Proxy 本地缓存的大小和命中率。
  • Mixer 的本地缓存。Mixer 是独立运行的,所以可以在 Mixer 这一层使用大容量的本地缓存,从而减少对后端基础设施的调用,一方面可以减少延迟,另一方面也可以最大限度减少后端基础设施故障给服务调用带来的影响。

image.png

Mixer 是如何实现策略控制和监控日志收集功能呢?

1)策略控制

Istio 支持两类的策略控制,一类是对服务的调用进行速率限制,一类是对服务的调用进行访问控制,它们都是通过在 Mixer 中配置规则来实现的。具体来讲,速率限制需要配置速率控制的 yaml 文件,每一次 Proxy 转发请求前都会先调用 Mixer,Mixer 就会根据这个 yaml 文件中的配置,来对调用进行速率限制。比如下面这段配置表达的意思是服务默认访问的速率限制是每秒 5000 次,除此之外还定义了两个特殊限制,第一个是 v3 版本的 reviews 服务请求 ratings 服务的速率限制是每 5 秒 1 次,第二个是其他服务请求 ratings 服务的速率限制是每 10 秒 5 次。

apiVersion: config.istio.io/v1alpha2
kind: memquota
metadata:
  name: handler
  namespace: istio-system
spec:
  quotas:
  - name: requestcount.quota.istio-system
    maxAmount: 5000
    validDuration: 1s
    overrides:
    - dimensions:
        destination: ratings
        source: reviews
        sourceVersion: v3
      maxAmount: 1
      validDuration: 5s
    - dimensions:
        destination: ratings
      maxAmount: 5
      validDuration: 10s


而访问控制需要配置访问控制的 yaml 文件,每一次 Proxy 转发请求前都会先调用 Mixer,Mixer 就会根据这个 yaml 文件中的配置,来对调用进行访问控制。比如下面这段配置表达的意思是 v3 版本的 reviews 服务调用 ratings 服务就会被拒绝。

apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
  name: denyreviewsv3
spec:
  match: destination.labels["app"] == "ratings" && source.labels["app"]=="reviews" && source.labels["version"] == "v3"
  actions:
  - handler: denyreviewsv3handler.denier
    instances: [ denyreviewsv3request.checknothing ]


2)监控和日志收集

跟策略控制的实现原理类似,Mixer 的监控、日志收集功能也是通过配置监控 yaml 文件来实现的,Proxy 发起的每一次服务调用都会先调用 Mixer,把监控信息发给 Mixer,Mixer 再根据配置的 yaml 文件来决定监控信息该发到哪。


4、Citadel

Citadel 的作用是保证服务之间访问的安全,它的工作原理见下图,可见实际的安全保障并不是 Citadel 独立完成的,而是需要 Proxy、Pilot 以及 Mixer 的配合,具体来讲,

  • Citadel 里存储了密钥和证书。
  • 通过 Pilot 把授权策略和安全命名信息分发给 Proxy。
  • Proxy 与 Proxy 之间的调用使用双向 TLS 认证来保证服务调用的安全。
  • 最后由 Mixer 来管理授权和审计。

image.png

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
19天前
|
机器学习/深度学习 缓存 自然语言处理
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
56 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
|
2月前
|
Java Linux C语言
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
534 90
|
1月前
|
存储 SQL 缓存
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。
|
2月前
|
存储 缓存 监控
ClickHouse 架构原理及核心特性详解
ClickHouse 是由 Yandex 开发的开源列式数据库,专为 OLAP 场景设计,支持高效的大数据分析。其核心特性包括列式存储、字段压缩、丰富的数据类型、向量化执行和分布式查询。ClickHouse 通过多种表引擎(如 MergeTree、ReplacingMergeTree、SummingMergeTree)优化了数据写入和查询性能,适用于电商数据分析、日志分析等场景。然而,它在事务处理、单条数据更新删除及内存占用方面存在不足。
670 21
|
2月前
|
存储 消息中间件 druid
Druid 架构原理及核心特性详解
Druid 是一个分布式、支持实时多维OLAP分析的列式存储数据处理系统,适用于高速实时数据读取和灵活的多维数据分析。它通过Segment、Datasource等元数据概念管理数据,并依赖Zookeeper、Hadoop和Kafka等组件实现高可用性和扩展性。Druid采用列式存储、并行计算和预计算等技术优化查询性能,支持离线和实时数据分析。尽管其存储成本较高且查询语言功能有限,但在大数据实时分析领域表现出色。
272 19
|
2月前
|
存储 SQL NoSQL
Doris 架构原理及核心特性详解
Doris 是百度内部孵化的OLAP项目,现已开源并广泛应用。它采用MPP架构、向量化执行引擎和列存储技术,提供高性能、易用性和实时数据处理能力。系统由FE(管理节点)和BE(计算与存储节点)组成,支持水平扩展和高可用性。Doris 适用于海量数据分析,尤其在电商、游戏等行业表现出色,但资源消耗较大,复杂查询优化有局限性,生态集成度有待提高。
233 15
|
2月前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
447 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
2月前
|
Java 网络安全 开发工具
Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
通过本文,读者可以深入了解Git的核心概念和实际操作技巧,提升版本管理能力。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
一文彻底讲透GPT架构及推理原理
本篇是作者从开发人员的视角,围绕着大模型正向推理过程,对大模型的原理的系统性总结,希望对初学者有所帮助。
|
2月前
|
数据采集 存储 NoSQL
AArch64架构调用链性能数据采集原理
本次分享的主题是AArch64架构调用链性能数据采集原理,由阿里云苏轩楠分享。主要分为五个部分: 1. 术语解释 2. Frame Pointer RegisterStack Unwind 3. Dwarf-based Stack Unwind 4. /BRBE/CSRE Stack Unwind 5. Kernel-space Stack Unwind&eBPF Unwinders

热门文章

最新文章