当前位置:科技动态 > Isito 入门:为什么学习 Istio,什么是 Istio

Isito 入门:为什么学习 Istio,什么是 Istio

  • 发布:2023-10-05 16:30

本教程已添加到 Istio 系列中:https://www.sychzs.cn

目录
  • 1、Istio概述
      • 🚩我们来谈谈微服务设计
          • 🥇只使用Kubernetes来部署容器,
          • 🥈开始使用一些中间件并完善基础设施
      • ❓为什么我该学Istio吗
      • 💡那么,Istio是什么
        • Istio三大功能
        • Istio原理

1、Istio 概述

🚩我们来谈谈微服务设计

看来使用Kubernetes就是一个微服务系统。

我遇到过很多盲目崇拜 Kubernetes、口口声声要上 Kubernetes 的人或公司,但他们既没有技术储备,也没有规划计划。我以为使用了Kubernetes之后,就会成为一个分布式、高性能、高质量的微服务系统。

从经验来看,很多公司使用Kubernetes后并不会明显改善旧系统的缺点,而且因为项目中充斥着大量像泥球一样乱七八糟的代码,随意使用数据库事务,数百行代码、功能、过多引用其他项目的接口等等,无论在 Kubernetes 上放置多少应用实例,速度总是无法体现出来。

【图片来源网络】

其实这种情况还挺常见的,比如你们公司的项目和我公司的项目。

在笔者的经历中,我遇到过很多中小型公司开始从独立系统转型为使用Kubernetes设施的系统。然而,Kubernetes 的大部分使用仅限于表面。我们来谈谈一些常见的情况。

🥇只使用Kubernetes来部署容器,

仅使用Kubernetes来部署容器,其他方面几乎没有变化。

此类系统添加Jenkins构建CICD容器,构建后部署到Kubernetes,但没有考虑容错处理、内外部系统通信,没有使用可观察性系统(监控、日志、链路跟踪),并且没有服务。发现和负载平衡。整个系统只是拆分成多个服务部署。服务之间的通信使用固定地址来硬编码配置文件,否则应用程序修改配置非常麻烦。

该类系统唯一的亮点就是使用了Kubernetes,也可能会使用Redis、Mongodb等数据存储系统。

但由于缺乏合理的架构设计,虽然系统进行了拆分,但唯一的好处就是研发团队可以搞一个项目,方便研发工作的管理。

为了应对子服务的通信需求,我们只能不断地在用户中心或者其他服务中添加一大套API,以便子服务能够获取所需的信息。然而,它的分裂带来了更多的弊端。服务拆分导致数据隔离(通常同一数据库引擎使用不同的数据库名称)。每个服务都有自己的数据库。这个时候,他们往往会忽视它。它解决分布式条件下可能出现的数据一致性问题、分布式事务问题等。

由于缺乏足够的基础设施支持,当服务通信出现错误时,排查问题将会非常困难。项目组可能需要与不同的小组协调排查问题,并且可能为了一个问题修改代码十几次。不断重新部署和添加日志以发现问题并修复错误。

🥈开始使用一些中间件并改善基础设施

为了解决微服务系统中的一些问题,研发团队引入了一些中间件。

数据同步:为了解决数据隔离的问题,引入了Canal等数据库同步工具。例如,将用户中心的用户表同步到下游。子服务可以直接加入自己数据库中的数据,聚合信息变得更加容易。为了更方便的查询聚合数据,Mysql数据在消费后也同步到ES、Kafka等系统进行二次处理。

自动化部署和持续集成:微服务部署自动化,减少人工干预和错误。

监控和日志记录:集群中使用分布式监控和日志记录,以便于跟踪和诊断问题。 【Istio可以帮助你】

服务发现与负载均衡:使用Consul等服务注册和发现中间件,解决了服务通信地址的耦合配置问题,无需手动维护服务地址列表,同时还具有诸如如健康检查和负载平衡。 。 【Istio可以帮助你】

配置管理:使用Nacos、Apollo等配置中心,可以动态更改服务的配置。

服务划分不合理:在微服务架构中,将系统拆分为多个独立的服务至关重要。然而,不合理的服务划分可能会导致服务过度拆分或功能耦合。

数据一致性:由于微服务使用独立的数据存储,因此可能会出现数据一致性问题。

高耦合:服务之间的过度耦合可能会导致一项服务的修改影响其他服务,降低系统的可维护性。

难以诊断和监控:由于微服务的分布式特性,当系统出现问题时,可能很难诊断和监控。 【Istio可以帮助你】

安全问题:微服务之间的通信可能会导致安全问题。大多数系统没有考虑外部通信认证和内部系统通信认证的问题。 【Istio可以帮助你】

这样的系统可以解决一些服务通信和服务故障时出现的问题,同时也提供中间件,减轻开发者的负担。

但是这类系统可能仍然存在很多问题。下面笔者就讲讲我遇到过的实际例子。

首先,代码耦合了太多组件。例如,为了支持链接跟踪和日志收集,代码引用了很多相关的类库,需要复杂的配置。

其实这些组件是可以下沉到基础设施中的,这也是作者写Istio教程的原因。

.NET中的ABP框架可能是被诟病的对象之一,因为ABP实在是太“重”了。想想ABP的组件很多,每个模块都需要添加代码配置和使用。光是项目就需要多少代码来配置这些模块和扩展服务,学习成本有多贵。

想一想,项目中有这么多的模块和配置,你能记住多少?每次创建一个新项目的时候,你都要从其他项目中复制一堆配置和代码。不累吗?

此外,微服务通过网络进行通信而没有良好的故障处理方案也是一种常见的情况。微服务通信中可能会出现网络延迟和故障,需要采取设施使用超时、重试、断路器等容错策略来减少网络问题的影响。

在实际情况中,大多数研发团队并不会处理这些问题。子服务直接发出HTTP请求,如果请求失败直接抛出异常,或者采用的方法是在代码中添加一些组件,当请求失败时程序自动处理故障,比如重试、熔断等。

例如,C#可以使用Polly组件来配置HTTP请求的超时、重试等策略。但是,配置是硬编码在代码中的。如果需要改变,就需要修改代码,开发者不一定能够预先配置优秀的参数。多添加一个组件会增加程序的“重量”,并使维护变得更加困难。

所以,设计一个微服务系统并不容易。

❓我为什么要学习 Istio

首先,Ist​​io可以将很多配置下沉到基础设施层面,我们的项目代码可以减少很多组件、代码和配置。

俗话说,架构设计决定系统的上限,而实现细节决定系统的下限。

想一想,如果你使用ABP来开发业务,当你打开项目代码时,你还记得清楚配置吗?每次创建新项目时,都需要从旧项目中复制一堆代码和配置,还需要在各种中间件中添加相当多的配置。笔者见过很多使用ABP编写的项目,里面的配置太多了。而且涉及的依赖包较多,更新不同项目模块时很容易遇到组件版本不一致导致的冲突。

前面提到,微服务通信时需要自动故障修复、自动重试、断路器,以及对服务健康检查和负载均衡的支持。如果这些都用代码来配置,每个项目都需要重复一次工作。

所以,我学习 Istio 的三个主要原因:

  • 将代码中的东西扔到基础设施中,减少代码量和复杂的配置。
  • 可以学到很多微服务设计思想。
  • 更合理地设计Kubernetes上的系统架构。

当然,根据公司规模和业务支持需求,不一定要用Istio。 Istio本身也相当重,学习起来的难度并不比Kubernetes低。

在写这篇文章之前,我和一个大老板聊天。他表示,大多数企业无法使用Istio,能够使用的企业会选择自己开发。其实实用与否并不重要。重要的是,当你学习Isito时,你可以了解很多设计思想,了解Istio的这些组件解决什么样的问题。之后,除了使用Isito之外,我们还可以使用其他方法来解决这些问题。

💡那么,什么是 Istio

Istio 是一个与 Kubernetes 紧密集成的服务网格(Service Mesh),用于服务治理

注意,Istio 用于服务治理,主要包括流量管理、服务间安全和可观察性。在微服务系统中,你会遇到很多棘手的问题,而Istio只能解决其中的一小部分。

服务治理有三种方式。第一个是在每个项目中包含单独的治理逻辑,这相对简单;二是将逻辑封装到SDK中,每个项目都可以引用SDK,无需添加或只需要少量的配置或代码;三是下沉到基础设施层。 Istio 是第三种方式。

Istio 对业务无侵入,根本不需要更改项目代码

Istio 三大功能

接下来介绍一下Istio的三大能力。

⏩交通管理

流量管理包括以下功能:

  • 动态服务发现
  • 负载均衡
  • TLS 终端
  • 带有 gRPC 代理的 HTTP/2
  • 保险丝
  • 健康检查
  • 根据流量比例分阶段释放
  • 故障注入
  • 丰富的指标

⏩可观测性

Istio 支持 Jaeger、Zipkin、Skywalking 等链路跟踪中间件,并支持 Prometheus 收集指标数据。日志功能没有上面的亮点,只是记录请求的HTTP地址。 Istio 的可观察性帮助我们了解应用程序的性能和行为,使故障检测、性能分析和容量规划变得更加容易。

⏩安全性能

主要特点是可以实现零信任网络中服务之间的通信加密。 Istio 通过自动为服务之间的通信提供相互 TLS 加密来增强安全性,并且 Istio 还提供强大的身份验证、授权和审计功能。

Istio原理

Istio 的工作原理是拦截 Kubernetes 部署 Pod 事件,然后从 Pod 注入名为 Envoy 的容器。 此容器将拦截业务应用程序的外部流量。由于所有流量都被Envoy“劫持”,Istio可以对流量进行分析,比如收集请求信息、执行一系列流量管理操作、验证授权信息等。 Envoy 拦截流量并执行一系列操作后,如果请求正常,则会将流量转发到业务应用的 Pod。

【左:普通吊舱;伊斯蒂奥;右:入口和出口流量的 Istio 代理】

当然,由于Envoy需要拦截流量,然后转发给业务应用,所以多了一层转发,这会导致系统响应速度下降,但增加的响应时间几乎可以忽略不计

每个Pod都有一个Envoy,负责拦截、处理和转发进出Pod的所有网络流量。这种方法称为 Sidecar。

以下是 Istio Sidecar 的一些主要功能:

  • 流量管理:Envoy代理可以根据Istio配置的路由规则(如VirtualService、DestinationRule)实现流量转发、分段、镜像等功能。

  • 安全通信:Envoy 代理负责在服务之间建立安全的双向 TLS 连接,以确保服务之间通信的安全性。

  • 遥测数据收集:Envoy 代理可以收集有关网络流量的详细遥测数据(例如延迟、成功率等),并将这些数据报告给 Istio 的遥测组件进行监控和分析。

  • 策略执行:Envoy代理可以根据Istio配置的策略规则(例如RateLimit和AuthorizationPolicy)执行限流、访问控制等策略。

由于 Pod 通过 Envoy 暴露端口,所有入站和出站流量都需要 Envoy 检查,因此很容易确定访问来源。 如果请求者不是 Istio 中的服务,那么 Envoy 将拒绝访问。

在 Istio 中,Envoy 部分称为数据平面,负责管理集群的 istiod 组件称为控制平面。

注意,这是 istiod,它是 Istio 的一个组件,负责管理集群。

Istio 的介绍到此结束。在接下来的章节中,我们将通过实际使用 Istio 来进一步了解 Istio 的功能和原理。

相关文章

最新资讯

热门推荐