当前位置: 首页 > 科技观察

Istio+K8s,微服务两把剑的组合!

时间:2023-03-20 16:19:07 科技观察

【.com原创文章】很多企业将面临从单体应用到微服务架构的转型,也将衍生出更多的分布式场景需求。随着规模和复杂性的不断增长,我们如何才能更好地理解和有效地管理服务网格?图片来自Pexels本节内容较长,主要关注以下几点:什么是服务网格?初步了解Istio核心特性流程架构核心模块Envoy高级解决方案对于很多公司来说,Docker、Kubernetes等工具已经解决了部署问题,或者说几乎解决了部署问题。但是他们并没有解决运行时的问题,这就是服务网格(ServiceMesh)的由来。什么是服务网格?服务网格用于描述构成这些应用程序的微服务网络以及它们之间的交互。它是一个网络代理组件,用于确保服务之间安全、快速、可靠的通信。它是随着微服务和云原生应用的兴起而诞生的基础设施层。它通常作为轻量级网络代理与应用程序一起部署。比如Sidecar的方式,如下图所示:先解释一下上图:ServiceMesh的设计一般分为两个模块,控制平面和数据平面。对于应用程序,所有流量都通过数据平面转发。顺利转发的前提:数据平面需要知道转发的目标地址,而目标地址本身是由一些业务逻辑(比如服务发现)决定的。所以很自然地,我们可以推断出控制平面需要负责管理数据平面正常运行所需的一些配置:需要知道某个请求被转发到哪里:服务发现配置。当外部流量进入时,需要判断服务流量是否达到上限:限流配置。当依赖服务返回错误时,需要能够执行相应的熔断逻辑:熔断配置。SerivceMesh可以看作是TCP/IP之上的网络模型,抽象了服务间可靠通信的机制。但与TCP不同的是,它是面向应用的,为应用提供统一的可见性和可控性。ServiceMesh有以下优势:屏蔽了分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控跟踪、流量控制等),服务只需要关注业务逻辑。真正的语言无关,服务可以用任何语言编写,只需要与ServiceMesh通信即可。对应用程序透明,服务网格组件可以单独升级。ServiceMesh目前面临一些挑战:ServiceMesh组件以代理方式计算和转发请求,这会在一定程度上降低通信系统的性能,增加系统资源开销。ServiceMesh组件接管了网络流量,因此服务的整体稳定性取决于ServiceMesh。同时,额外引入的大量ServiceMesh服务实例的运维和管理也是一个挑战。随着服务网格的规模和复杂性的增长,它变得越来越难以理解和管理。ServiceMesh的需求包括服务发现、负载均衡、故障恢复、测量和监控等,ServiceMesh通常还有更复杂的运维需求,比如A/B测试、金丝雀发布、限速、访问控制和端-端到端的身份验证。ServiceMesh的出现弥补了Kubernetes在微服务的连接、管理和监控方面的不足,为Kubernetes提供更好的应用和服务管理。因此,ServiceMesh的代表Istio一经推出,就被认为是可以与Kubernetes结合形成双剑效应的微服务管理的利器,受到了业界的一致好评。Istio提供了整个服务网格的行为洞察和运行控制能力,以及满足微服务应用各种需求的完整解决方案。Istio主要使用一致的方式来保护、连接和监控微服务,降低管理微服务部署的复杂性。初识IstioIstio读作“Istidio”,重音在脑子里。Istio的官方总结简单明了:Istioletsyouconnect,secure,control,andobserveservices。连接、安全、控制和观察服务。简单来说,Istio为现有的服务网格提供了一种简单的方法,将连接、安全、控制和观察模块与应用程序或服务隔离开来,让开发者可以更专注于核心业务逻辑。以下是Istio的核心特性:HTTP、gRPC、WebSocket和TCP流量的自动负载均衡。通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制。支持访问控制、速率限制和配额的可插拔策略层和配置API。进出集群入口和出口的所有流量的自动度量、日志记录和跟踪。通过基于身份的强大身份验证和授权,实现跨集群的安全服务间通信。在较高层面上,Istio有助于降低这些部署的复杂性并减轻开发团队的压力。它是一个完全开源的服务网格,作为透明层连接到现有的分布式应用程序。它还是一个带有API的平台,可与任何日志记录、遥测和策略系统集成。Istio的多样性使我们能够成功高效地运行分布式微服务架构,并提供统一的方法来保护、连接和监控微服务。核心特性Istio以统一的方式提供了许多跨服务网格的关键功能:①流量管理Istio简单的规则配置和流量路由让我们可以控制服务之间的流量和API调用过程。Istio简化了断路器、超时和重试等服务级别属性的配置,并使执行A/B测试、金丝雀发布和按流量百分比分阶段发布等重要任务变得轻而易举。通过更好地了解流量和开箱即用的故障转移功能,我们可以在问题出现之前发现问题,无论在什么情况下,都可以使呼叫更可靠,网络更稳健。②安全Istio的安全特性让开发者可以只关注应用层的安全。Istio提供底层安全通信通道,并管理大规模服务通信的身份验证、授权和加密。使用Istio,服务通信在默认情况下是安全的,可以跨不同的协议和运行时实现一致的策略实施,所有这些都几乎不需要修改应用程序。Istio独立于平台,可以与Kubernetes(或基础设施)网络策略一起使用。但它更健壮,可以在网络和应用程序级别保护Pod到Pod或服务到服务的通信。③可观察性Istio强大的跟踪、监控和日志功能使我们能够深入了解服务网格部署。通过Istio的监控能力,我们可以真正了解服务的性能如何影响上下游。其自定义仪表板提供了对所有服务性能的可见性,并让我们了解它如何影响其他流程。Istio的Mixer组件负责策略控制和遥测数据收集。它提供后端抽象和中介,将Istio的一部分与后端基础设施实现的细节隔离开来,并为运营商提供对网格与后端基础设施之间交互的细粒度控制。所有这些功能使我们能够更有效地为我们的服务设置、监控和执行SLO。当然,底线是我们可以快速有效地检测和修复问题。④平台支持Istio独立于平台,旨在运行在各种环境中,包括跨云、内部环境、Kubernetes、Mesos等。我们可以使用Consul将Istio部署在Kubernetes或Nomad环境中。Istio目前支持:Kubernetes上的服务部署。基于Consul的服务注册表。服务在单独的虚拟机上运行。⑤集成和定制Istio的策略执行组件可以扩展和定制,与现有的ACL、日志、监控、配额、审查等解决方案集成。流程架构Istio服务网格在逻辑上分为数据平面(ControlPlane)和控制平面(DataPlane)。架构图如下:数据平面(DataPlane)由一组以Sidecar形式部署的智能代理Envoy组成。Envoy作为sidecar部署在与相应服务相同的Kubernetespod中。这使得Istio可以提取大量关于流量行为的信号作为属性,这些信号又可以在Mixer中用于执行策略决策并发送到监控系统以提供有关整个网格行为的信息。这些代理可以调解和控制微服务和Mixer之间的所有网络通信。ControlPlane负责管理和配置代理以路由流量,Mixer负责执行策略和收集遥测数据。主要包括以下几个部分:Mixer:策略和请求跟踪。Pilot:为智能路由(例如A/B测试、金丝雀部署等)和弹性(超时、重试、断路器等)提供服务发现、流量管理。Citadel:将TLS证书分发给智能代理。Sidecar注入器:允许以非侵入方式向应用程序添加功能,避免需要添加额外的代码来满足第三方要求。核心模块上面提到了很多专业术语,我们需要重点解释一下:①什么是Sidecar模式?Sidecar是一种将应用功能与应用本身分离为一个单独进程的设计模式,允许对应用功能进行非侵入式的添加,避免为了满足第三方需求而增加额外的代码。在软件架构上,Sidecar依附于主应用程序或父应用程序,以扩展和增强功能,而Sidecar则与主应用程序松散耦合。Sidecar是一种单节点多容器应用设计形式,提倡用额外的容器扩展或增强主容器。②特使的作用是什么?Envoy是一个独立的进程,旨在与每个应用程序服务器一起运行。所有Envoy形成一个透明的通信网格,每个应用程序都在其中发送和接收来自本地主机的消息,并且不需要知道网络拓扑。与传统的服务到服务通信的库方法相比,进程外架构有两个实质性的好处:Envoy支持用任何编程语言编写的服务。只需部署一个Envoy即可在Java、C++、Go、PHP、Python和其他服务之间形成网格。任何使用过大型面向服务架构的人都知道部署库升级是一件很痛苦的事情。Envoy可以在整个基础设施中快速部署和升级。Envoy以透明的方式使用多种应用程序框架和语言桥接面向服务的架构。③MixerMixer是一个独立于平台的组件,负责在服务网格上执行访问控制和使用策略,并从Envoy代理和其他服务收集遥测数据。代理提取请求级别的属性并将它们发送到Mixer进行评估。有关属性提取和策略评估的更多信息,请参阅混合器配置。Mixer包含一个灵活的插件模型,使其能够插入各种主机环境和基础设施后端,从这些细节中抽象出Envoy代理和Istio管理的服务。④Pilot控制面中负责流量管理的组件是Pilot,为EnvoySidecar提供服务发现、智能路由(如A/B测试、金丝雀部署等)和弹性(超时、重试、熔断等)流量管理功能。它将控制流量行为的高级路由规则转换为特定于Envoy的配置,并在运行时将它们传播到边车。⑤Istio如何保证服务通信的安全?Istio以可扩展的方式管理微服务之间通信的身份验证、授权和加密。Istio提供了一个基本的安全通信通道,允许开发人员专注于应用程序级别的安全性。Istio可以增强微服务及其通信的安全性,包括服务到服务和最终用户到服务的通信,而无需更改服务代码。它为每个服务提供了基于角色的强大身份机制,以实现跨集群、跨云的互操作性。如果我们将Istio与Kubernetes(或基础设施)网络策略结合使用,Pod到Pod或服务到服务的通信将在网络层和应用层都是安全的。Istio建立在谷歌的纵深防御策略之上,以保护微服务通信。当我们在GoogleCloud中使用Istio时,Google的基础架构允许我们构建真正安全的应用程序部署。Istio确保服务通信在默认情况下是安全的,我们可以跨不同的协议和运行时一致地执行安全策略,而无需对应用程序进行很少或没有调整。EnvoyAdvancedIstio使用Envoy代理的扩展版本,这是一种用C++开发的高性能代理,可以调解服务网格中所有服务的所有入站和出站流量。Envoy的很多内置功能都被Istio发扬光大,例如:动态服务发现负载均衡TLS终止HTTP2&gRPC代理熔断健康检查,基于百分比流量拆分的灰度释放故障注入丰富的指标Envoy分为主线程工作线程1、文件刷新线程,其中主线程负责工作线程和文件刷新线程的管理和调度。工作线程主要负责监听、过滤和转发。工作线程将包含一个侦听器。如果收到请求,它将通过过滤链过滤数据。前两个是非阻塞的,唯一阻塞的就是这种IO操作,会不断dump内存中的一些缓存。总结起来,我们可以重点关注以下五个方面:①服务的动态注册和发现Envoy可以选择使用一套分层的动态配置API进行集中管理。这些层为Envoy提供动态更新、后端集群的主机、后端集群本身、HTTP路由、侦听套接字和通信加密。对于更简单的部署,后端主机发现可以通过DNS解析完成(甚至完全跳过),层也可以替换为静态配置文件。②健康检查构建Envoy网格的推荐方式是将服务发现视为一个最终一致的过程。Envoy包括一个健康检查子系统,可以选择对上游服务集群执行主动健康检查。然后,Envoy结合使用服务发现和健康检查信息来确定健康的负载均衡器。Envoy还支持通过异常检测子系统进行被动健康检查。③AdvancedLoadBalancing分布式系统中不同组件之间的负载均衡是一个复杂的问题。因为Envoy是一个独立的代理而不是一个库,所以它在一个地方启用了高级负载平衡技术,并使它们可供任何应用程序访问。目前,Envoy支持自动重试、熔断、通过外部速率限制服务进行全局速率限制、请求隐藏和异常值检测。计划在未来支持RequestRacing。④前端/边缘系统代理支持虽然Envoy主要是为服务通信系统设计的,但它对前端/边缘系统也很有用,例如:可观察性、管理、同服务发现和负载均衡算法等??。Envoy包括足够的功能使其可用作大多数Web应用程序服务用例的边缘代理。这包括成为TLS、HTTP/1.1和HTTP/2支持以及HTTPL7路由的端点。⑤最好的观察和统计能力Envoy的首要目标是让网络变得透明。但这在网络层面和应用层面都是不可避免的,容易出现问题。Envoy包括对所有子系统的强大统计支持。statsd和其他兼容的数据提供程序是当前支持的统计接收器,插入不同的统计接收器并不困难。Envoy可以通过管理端口查看统计信息,也支持通过第三方提供商进行分布式追踪。更多详情请参考:什么是Envoy?https://www.jianshu.com/p/a6f7f46683e1?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendationScheme想象应用以上原则,我们可以有很多针对日常使用的具体解决方案进行开发。方案一:用Istio改造微服务,模仿网上书店的一个类目,展示一本书的信息。该页面将显示书籍的描述、书籍详细信息(ISBN、页数等)以及关于书籍的一些评论。应用程序的端到端架构:Bookinfo应用程序中的几个微服务是用不同的语言编写的。这些服务对Istio没有依赖,但构成了服务网格的代表性示例:它由多个服务、多种语言组成,评论服务有多个版本。使用Istio改造后的架构如下:要在Istio中运行此应用程序,无需对应用程序本身进行任何更改。我们只需要将EnvoySidecar注入到每个服务中。最终的部署结果会如下图所示:所有的微服务都集成了EnvoySidecar,所有集成服务的进出流量都被Sidecar劫持。这样就为外部控制准备了所需的Hooks,然后可以使用Istio控制平面为应用程序提供服务路由、遥测数据收集、策略执行等功能。更多细节请参考官网示例:https://istio.io/latest/zh/docs/examples/bookinfo/方案二:使用Istio改造CI/CD流程简单解释一下上面的流程图:代码通过Docker做容器化。使用Gitlab托管您的代码。Jenkins监听Gitlab下的代码,触发自动构建,执行Kustomize文件。Kustomize通过配置文件设置Istio配置(颜色识别、流量分配),启动K8s部署应用。最后,我们使用Rancher来管理多容器接口。打开浏览器访问。看到这里,相信你也明白了,我们实现了一个前端多容器部署的案例。它的意义何在?首先当然是环境隔离,每个研发人员开发一个容器,互不干扰。其次我们可以做小流量、灰度发布等很多事情。自动化部署,一站式流程体验。如果你对容器化不是很了解,请先阅读前两篇文章:Docker边学边用。本文中关于KubernetesIstio的学习内容还有很多。相信看完后你会有更全面的认识。如果想深入了解,不妨仔细研究一下官方的例子,在实际项目中不断打磨。参考资料:Istio官网什么是EnvoyServiceMeshforMicroservices什么是ServiceMeshIstio如何连接、管理和保护微服务2.0?在MOSN玩dubbo-go技术人员请联系editor@51cto.com【原创稿件,合作站点转载请注明原作者和出处.com】