[Istio是什么?] 还不知道你就out了,一文40分钟快速理解

@toc

前言

这篇文章属于纯理论,所含内容如下,按需阅读:

Istio概念、服务网格、流量管理、istio架构(Envoy、Sidecar 、Istiod)虚拟服务(VirtualService)、路由规则、目标规则(DestinationRule)网关(Gateway)、网络弹性和测试(超时、重试、熔断器、故障注入)Istio是什么?Istio是一个开源的服务网格,透明的接入到分布式服务中。它也是一个平台,集成任何日志、遥测和策略系统的 API 接口。Istio 成功高效地运行分布式微服务架构,并提供保护、连接和监控微服务的统一方法。Istio 有助于降低 DevOps 压力、开发团队的压力。服务网格是什么?组成微服务网络实现服务之间的交互应用场景服务发现、负载均衡、故障恢复、度量和监控A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证为什么使用Istio?

服务网格是通过sidecar(边车)代理服务实现,控制平面主要是对sidecar的配置和管理,这包括:

HTTP、gRPC、WebSocketTCP 流量自动负载均衡。通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。可插拔的策略层和配置 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 服务网格 逻辑上分为数据平面控制平面

**数据平面**:Envoy代理被部署为sidecar,负责协调和控制微服务之间的通信,收集和报告所有网格流量的遥测数据。**控制平面**:管理并配置Envoy代理

[Istio是什么?] 还不知道你就out了,一文40分钟快速理解在这里插入图片描述

EnvoyC++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。

Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:

动态服务发现负载均衡TLS 终端HTTP/2 与 gRPC 代理熔断器健康检查基于百分比流量分割的分阶段发布故障注入丰富的指标Sideca允许 Istio 可以执行策略决策,提取丰富的遥测数据,接着将这些数据发送到监视系统以提供整个网格行为的信息。Sidecar 代理还允许向 Istio 添加功能,不需要重新设计架构或重写代码。IstiodIstiod 提供服务发现、配置和证书管理。Istiod 将控制流量高级路由规则转换为 Envoy 特定的配置,并在运行时传播给 Sidecar。Istiod 安全通过内置的身份和凭证管理,实现了强大的服务对服务和终端用户认证。Istiod 充当证书授权(CA),生成证书以允许在数据平面中进行mTLS 通信。虚拟服务(VirtualService)配置请求流量到服务,基于连通性和服务发现能力。每个虚拟服务包含一组路由规则。可以实现负载均衡、基于不同版本流量百分比路由。为什么使用虚拟服务?

虚拟服务在增强 Istio 流量管理方面,发挥着至关重要的作用,通过对客户端请求与真实响应请求目标工作负载进行解耦来实现。

基于不同服务版本的流量百分比路由,实现A/B 测试、金丝雀发布

栗子代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: reviewsspec:  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“ 用户的所有请求,所以使用 headersend-userexact 字段选择适当的请求。

代码语言:shell复制

- match:   - headers:       end-user:         exact: jason

Destinationroute 部分的 destination 字段指符合此条件的流量的实际目标地址。与虚拟服务的 hosts 不同,destination的 host 必须是存在于 Istio 服务注册中心的实际目标地址,否则 Envoy 不知道该将请求发送到哪里。代码语言:shell复制

route:- destination:    host: reviews    subset: v2

destination 片段还指定了 Kubernetes 服务的子集,将符合此规则条件的请求转入其中,本例中子集名称是 v2。

路由规则优先级

路由规则按从上到下的顺序选择,虚拟服务中定义的第一条规则有最高优先级,不满足第一个路由规则的流量均流向一个默认的目标

本例中:第二条规则没有 match 条件,直接将流量导向 v3 子集。

代码语言:shell复制

- route:  - destination:      host: reviews      subset: v3

路由规则的更多内容

可以在流量端口、header 字段、URI 等内容上设置匹配条件

匹配条件:

[Istio是什么?] 还不知道你就out了,一文40分钟快速理解[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标规则(DestinationRule)

可以将虚拟服务视为将流量如何路由到目标地址,然后目标规则来配置该目标的流量。虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。

简单来说:虚拟服务通过目标规则后,到达目标地址(服务)

应用场景:整个目的地服务或特定服务子集时定制 Envoy 的流量策略,负载均衡模型、TLS 安全模式或熔断器设置。

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: my-destination-rulespec:  host: my-svc  trafficPolicy:    loadBalancer:      simple: RANDOM  # 随机负载均衡器  subsets:  - name: v1    labels:      version: v1  - name: v2    labels:      version: v2    trafficPolicy:      loadBalancer:        simple: ROUND_ROBIN   # 轮询负载均衡器  - name: v3    labels:      version: v3

每个子集都是基于一个或多个 labels 定义的,标签应用于kubernetes集群中deployment控制器metadata字段来识别不同版本。

负载均衡选项

Istio 默认使用轮询的负载均衡策略,Istio 同时支持如下的负载均衡模型,可以在 DestinationRule 中为指定:

随机:请求以随机的方式转到池中的实例。权重:请求根据指定的百分比转到实例。最少请求:请求被转到最少被访问的实例。网关(Gateway)管理入站和出站流量,网关配置网格边界的独立 Envoy 代理,而不是服务工作负载的 sidecar 代理。Istio 网关可以配置 4-6 层的负载均衡属性,如对外暴露的端口、TLS 设置等网关主要用于管理进入的流量Istio 提供了预先配置的网关代理(istio-ingressgatewayistio-egressgateway)栗子代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:  name: ext-host-gwyspec:  selector:    istio: ingressgateway  # use istio default controlle  servers:  - port:      number: 443      name: https      protocol: HTTPS    hosts:    - ext-host.example.com    tls:      mode: SIMPLE      serverCertificate: /tmp/tls.crt      privateKey: /tmp/tls.key

这个网关配置让 HTTPS 流量从 ext-host.example.com 通过 443 端口流入网格,但没有为请求指定任何路由规则。为想要工作的网关指定路由,您必须把网关绑定到虚拟服务上。

如下面的示例所示,使用虚拟服务的 gateways 字段进行设置:

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: virtual-svcspec:  hosts:  - ext-host.example.com  gateways:    - ext-host-gwy

然后就可以为出口流量配置带有路由规则的虚拟服务。

Sideca

默认情况下,Istio 让每个 Envoy 代理都可以访问和它关联工作负载的所有端口的请求,然后转发到对应的工作负载。

可以使用 sidecar配置做:

微调Envoy 代理接受的端口和协议集限制Envoy 代理可以访问的服务集合

在较庞大的应用程序中限制 sidecar 可达性,配置每个代理能访问网格中的任意服务,可能会因为高内存使用量而影响网格的性能。

可以指定将 sidecar 配置应用于特定命名空间中的所有工作负载,或者使用 workloadSelector 选择特定的工作负载

例如,下面的 sidecar 配置将 bookinfo 命名空间中的所有服务配置为,仅能访问运行在相同命名空间和 Istio 控制平面中的服务:

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: Sidecametadata:  name: default  namespace: bookinfospec:  egress:  - hosts:    - "./*"    - "istio-system/*"

网络弹性和测试

除了网格导流外,Istio 还提供了故障恢复和故障注入功能,您可以在运行时动态配置这些功能。使用这些特性可以让您的应用程序运行稳定,确保服务网格能够容忍故障节点,并防止局部故障级联影响到其他节点。

超时

超时是 Envoy 代理等待来自给服务答复的时间,确保服务不会因为等待答复而无限期的挂起。HTTP 请求的默认超时时间15 秒,这意味着如果服务在 15 秒内没有响应,调用将失败。

为了找到最佳超时设置,Istio 允许使用虚拟服务,按服务轻松地动态调整超时,而不必修改您的业务代码。

栗子:

一个虚拟服务,对 ratings 服务的 v1 子集的调用,指定 10 秒超时时间

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings  http:  - route:    - destination:        host: ratings        subset: v1    timeout: 10s

重试

服务为初始调用失败Envoy 代理尝试连接服务的最大次数。确保调用不会因为临时过载的服务或网络等问题而永久失败。

重试之间的间隔(25ms+)是可变的,HTTP 请求的默认重试行为是在返回错误之前重试两次

应用场景:与超时一样,Istio 默认的重试行为在延迟方面可能不适合您的应用程序需求(对失败的服务进行过多的重试会降低速度)或可用性。

栗子

配置了在初始调用失败后,最多重试 3 次来连接到服务子集,每个重试都有 2 秒的超时。

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings  http:  - route:    - destination:        host: ratings        subset: v1    retries:      attempts: 3      perTryTimeout: 2s

熔断器

熔断器中,设置一个对服务中单个主机调用的限制,例如并发连接的数量或对该主机调用失败的次数。一旦限制被触发,熔断器就会“跳闸”并停止连接到该主机。

作用:使用熔断模式可以快速失败而不必让客户端尝试连接到过载或有故障的主机。

熔断适用于在负载均衡池中的“真实”网格目标地址,可以在目标规则中配置熔断器阈值,让配置适用于服务中的每个主机。

栗子:

将 v1 子集的reviews服务工作负载的并发连接数限制为 100:

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: DestinationRulemetadata:  name: reviewsspec:  host: reviews  subsets:  - name: v1    labels:      version: v1    trafficPolicy:      connectionPool:        tcp:          maxConnections: 100

故障注入

是什么:可以使用 Istio 的故障注入机制来为整个应用程序测试故障恢复能力

为什么使用:故障注入是一种将错误引入系统以确保系统能够承受并从错误条件中恢复的测试方法。

作用:使用故障注入特别有用,能确保故障恢复策略不至于不兼容或者太严格,这会导致关键服务不可用。

可以注入两种故障,都使用虚拟服务配置:

延迟:延迟是时间故障。它们模拟增加的网络延迟或一个超载的上游服务。终止:终止是崩溃失败。他们模仿上游服务的失败。终止通常以 HTTP 错误码或 TCP 连接失败的形式出现。

栗子:

千分之一访问ratings 服务的请求,配置了一个 5 秒的延迟:

代码语言:shell复制

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:  name: ratingsspec:  hosts:  - ratings  http:  - fault:      delay:        percentage:          value: 0.1        fixedDelay: 5s    route:    - destination:        host: ratings        subset: v1

和您的应用程序一起运行

Istio 故障恢复功能对应用程序来说是完全透明的。在返回响应之前,应用程序不知道 Envoy sidecar 代理是否正在处理被调用服务的故障。这意味着,如果在应用程序代码中设置了故障恢复策略,那么您需要记住这两个策略都是独立工作的,否则会发生冲突。

例如,假设您设置了两个超时,一个在虚拟服务中配置,另一个在应用程序中配置。应用程序为服务的 API 调用设置了 2 秒超时。而您在虚拟服务中配置了一个 3 秒超时和重试。在这种情况下,应用程序的超时会先生效,因此 Envoy 的超时和重试尝试会失效。

虽然 Istio 故障恢复特性提高了网格中服务的可靠性和可用性,但应用程序必须处理故障或错误并采取适当的回退操作。例如,当负载均衡中的所有实例都失败时,Envoy 返回一个HTTP 503代码。应用程序必须实现回退逻辑来处理HTTP 503错误代码。

总结

这篇花费了不少精力,还望博友们支持支持新人!!!

后期会发布一篇实际操作,期待大家持续关注!!!

学习不走弯路,关注v「yeTechLog」

以上就是[Istio是什么?] 还不知道你就out了,一文40分钟快速理解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/28855.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VSCode如何分屏和布局管理 VSCode多窗口编辑的高效方式
上一篇 2025年11月3日 08:55:44
别在做无用功了,抖音1000粉丝现在可以花钱涨了
下一篇 2025年11月3日 08:57:48

相关推荐

  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • c#文件怎么打开

    打开 C# 文件有三种方法:Visual Studio:启动 Visual Studio,通过“文件”菜单打开 C# 文件。文本编辑器:使用文本编辑器打开 C# 文件,将其视为普通文本。.NET Core 命令行工具:使用 csc.exe 命令行工具编译 C# 文件,生成可执行文件。 如何打开 C#…

    2026年5月10日
    000
  • Discord.py 交互按钮超时与持久化解决方案

    本教程旨在解决Discord.py中交互按钮在一段时间后出现“This Interaction Failed”错误的问题。我们将深入探讨视图(View)的超时机制,并提供通过正确设置timeout参数以及利用bot.add_view()方法实现按钮持久化的具体方案,确保您的机器人交互功能稳定可靠,即…

    2026年5月10日
    000
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    100
  • React组件中动态属性值的管理与同步:利用状态实现受控组件

    本教程旨在解决react组件中动态属性值同步使用的问题。我们将探讨如何利用react的`usestate` hook来管理组件内部状态,从而实现一个属性的值动态地影响另一个属性,并构建出可预测、易于维护的受控组件。文章将通过具体代码示例,详细阐述从初始化状态到处理状态更新的完整过程,并强调受控组件在…

    2026年5月10日
    000
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000
  • 函数指针在 C++ 多态中的作用:揭示多态背后的真相

    函数指针在 C++ 多态中的作用:揭示多态背后的真相 简介 多态是面向对象编程的一项强大功能,它允许对象在运行时以不同的方式表现。C++ 中的多态实现依赖于函数指针。本文将深入探讨函数指针在多态中的作用,并通过一个实战案例展示如何利用它们。 函数指针 立即学习“C++免费学习笔记(深入)”; 函数指…

    2026年5月10日
    000
  • C++框架与Java框架在易用性方面的比较

    c++++ 框架的易用性低于 java 框架,具体原因如下:c++ 框架学习曲线陡峭,需要深入理解 c++ 语言。易出错且调试困难。而 java 框架具有以下易用性优势:学习曲线低,尤其适合 java 初学者。提供丰富的库和工具,简化开发。运行时异常处理,简化异常处理。 C++ 框架与 Java 框…

    2026年5月10日
    000
  • c++中头文件和源文件的区别_c++头文件与源文件作用对比

    头文件声明接口,源文件实现逻辑。头文件含类、函数声明及宏定义,通过#include被多文件共享,用include守卫防重;源文件实现具体功能,编译为目标文件后由链接器合并。声明与实现分离提升模块化与编译效率,模板和内联函数因需编译时可见故常置于头文件,命名空间避免符号冲突,整体结构使项目更清晰易维护…

    2026年5月10日
    000
  • HTML文档的基本结构是什么? 3分钟带你了解HTML文档基础框架

    html文档的基础结构由四部分组成:1. 声明,用于告知浏览器以html5标准模式解析页面,避免怪异模式导致的兼容性问题;2. 根元素,包裹整个文档内容,并可通过lang属性指定语言;3. 头部区域,包含元数据如设置字符编码、实现响应式布局、定义页面标题、引入css和favicon、加载脚本等;4.…

    2026年5月10日
    000
  • Android和iOS系统下,HTML+JS代码运行结果差异:为什么input宽度为0时,Android输入方向异常?

    Android和iOS系统HTML+JS代码运行差异分析:input宽度为0引发的Android输入方向异常 开发OTP输入组件时,我们发现一个有趣的现象:当input元素的宽度设置为0 (style=”width: 0;”)时,Android系统下的输入方向会异常,而iOS系统则正常工作。 移除w…

    2026年5月10日
    000
  • C++ 函数重载在事件驱动的编程中的应用

    在事件驱动的编程中,函数重载可创建具有不同参数签名的相似功能,为单一函数名提供多样化功能。它包含以下优点:代码可读性:使用单一函数名表示相关任务。可维护性:避免重复编写类似逻辑。可重用性:跨项目和应用程序 reutilizar。 C++ 函数重载在事件驱动的编程中的应用 在事件驱动的编程中,函数重载…

    2026年5月10日
    000
  • C++ 函数性能优化对系统稳定性的影响

    标题:C++ 函数性能优化对系统稳定性的影响 简介 函数性能优化是 C++ 程序员提高程序效率的关键技术。本文将探讨函数性能优化对系统稳定性的影响,并提供实战案例来证明这一点。 性能优化对稳定性的作用 立即学习“C++免费学习笔记(深入)”; 函数性能优化不仅可以提升程序速度,还可以提高系统的稳定性…

    2026年5月10日
    000
  • WebAssembly中导入JavaScript函数:无胶水代码集成指南

    本文深入探讨了在WebAssembly模块中直接导入和使用JavaScript函数的机制,特别是当使用Emscripten的STANDALONE_WASM和SIDE_MODULE编译模式时。文章详细分析了TypeError: import object field ‘GOT.mem&#8…

    2026年5月10日
    000
  • JavaScript设计原则_JavaScript可维护代码

    每个函数应只做一件事,如拆分数据处理与DOM操作,命名体现功能(如formatDate),长度控制在20行内;2. 使用清晰命名(如currentUser、isValid)减少注释依赖,关键逻辑注明“为什么”;3. 按功能模块化组织代码,如api.js处理请求,utils.js存放工具函数,使用im…

    2026年5月10日
    000
  • C++如何编译和链接_C++从源码到可执行文件的过程解析

    c++kquote>预处理展开宏和头文件,编译生成汇编代码,汇编转为机器码,链接合并目标文件与库生成可执行程序。 当你写完一段C++代码,比如一个简单的hello world程序,最终能运行起来,背后其实经历了一系列步骤:预处理、编译、汇编和链接。这个过程将人类可读的源码转换成机器可以执行的程…

    2026年5月10日
    000
  • c++中sizeof运算符的用法和常见陷阱 _c++ sizeof使用技巧及陷阱解析

    sizeof运算符在编译时计算类型或对象的字节大小,返回size_t类型,常用于获取数据大小、数组元素个数及内存操作;但存在数组传参退化为指针导致失效、对指针无法获知动态内存大小、表达式不求值、结构体因对齐产生填充等常见陷阱;需结合模板、显式传参、对齐控制等方式规避问题,提升代码可移植性和安全性。 …

    2026年5月10日
    000
  • C#如何进行网络编程?Socket与TCP/IP通信编程实例详解

    C#通过Socket类实现TCP通信,首先服务器绑定IP和端口并监听,客户端发起连接,双方通过Send/Receive收发数据,最后关闭连接。 C# 进行网络编程主要依赖于 System.Net 和 System.Net.Sockets 命名空间,其中最核心的是使用 Socket 类实现基于 TCP…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信