一.Service Mesh 架构
Service Mesh(服务网格)是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来,放到一个独立的层中进行管理。传统的微服务架构中,服务之间的通信、安全、监控等功能往往是和业务逻辑代码混合在一起的。而 Service Mesh 架构则是在每个微服务实例旁边部署一个代理(通常称为 Sidecar 代理),这些代理组成了服务网格,负责处理服务之间的通信和相关治理功能。
Service Mesh最核心的设计逻辑——通过Sidecar的方式代理微服务进行服务治理逻辑(数据面),通过控制面感知外界环境的变化并通过xDS协议支持各种微服务治理策略规则的集中管理和下发
主要组件
Sidecar代理:
这是 Service Mesh 架构的核心组件之一。Sidecar 代理与微服务实例部署在同一主机或容器中,它和微服务实例是一对一的关系。例如,在一个 Kubernetes 集群中,每个微服务的 Pod 内除了有微服务本身,还会有一个 Sidecar 代理。
它主要负责拦截微服务的入站和出站通信流量。对于入站流量,它可以进行请求验证、限流等操作;对于出站流量,它可以处理服务发现、负载均衡、路由选择等功能。以一个简单的 Web 服务请求为例,当客户端请求到达微服务时,Sidecar 代理会先接收这个请求,进行安全检查等操作后,再将请求转发给微服务本身。
控制平面(Control Plane):
控制平面是 Service Mesh 架构中的管理中心。它主要负责管理和配置所有的 Sidecar 代理。它包含多个组件,如配置管理、服务发现、证书管理等功能组件。
配置管理组件负责向 Sidecar 代理推送各种配置规则,比如流量路由规则、安全策略等。服务发现组件则用于维护服务的注册信息,帮助 Sidecar 代理找到目标服务的位置。证书管理组件负责为服务间通信提供安全证书,用于身份验证和加密通信。
二.Istio是什么
Istio由Google、IBM和Lyft在2017年5月合作推出,它的初始设计目标是在Kubernetes的基础上,以非侵入的方式为运行在集群中的微服务提供流量管理、安全加固、服务监控和策略管理等功能。
Istio是 Service Mesh 架构的一种实现,服务之间的通信会通过代理(默认是 Envoy,面向Service Mesh的高性能网络代理服务)来进行。中间的网络协议支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以说覆盖了主流的通信协议。代理这一层,称之为数据平面。
控制平面做了进一步的细分,分成了 Pilot、Citadel 和 Galley,它们的各自功能如下:
Pilot:为 Envoy 提供了服务发现,流量管理和智能路由,以及错误处理功能。
Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。
Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。数据平面会和控制平面通信,一方面可以获取需要的服务之间的信息,另一方面也可以汇报服务调用的 Metrics 数据。
istio 适用于容器或虚拟机环境(特别是 k8s),兼容异构架构。
istio 使用 sidecar(边车模式)代理服务的网络,不需要对业务代码本身做任何的改动。
HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
istio 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制;支持访问控制、速率限制和配额。
istio 对出入集群入口和出口中所有流量的自动度量指标、日志记录和跟踪。
Istio功能:
连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能
安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。
控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。
观察(Observe):查看服务运行期间的各种数据,了解服务的运行情况。
Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。
Istio有助于降低部署的复杂性,并减轻开发团队的压力。它是一个完全开放源代码的服务网格,透明地分层到现有的分布式应用程序上。它也是一个平台,包括允许它集成到任何日志平台、遥测或策略系统中的api。Istio的多种功能集使我们能够成功、高效地运行分布式微服务体系结构,并提供一种统一的方式来保护、连接和监视微服务。
Istio 确保云原生和分布式系统具有弹性,帮助现代企业跨不同平台维护其工作负载,同时保持连接和保护。它支持安全和监管控制,包括 mTLS 加密、策略管理和访问控制,为 Canary 部署、A/B 测试、负载均衡、故障恢复等网络功能提供支持,并增加对整个资产中流量的可观察性。Istio 并不局限于单个集群、网络或运行时的边界,即在 Kubernetes 或 VM、多云、混合或本地上运行的服务
三.Istio的应用场景
在传统的服务部署中,通常为单个节点搭建一整套服务的架构,例如单节点搭建web服务,数据库服务,但这样就出现了单节点潜在的问题,随着应用的访问量增加,单台服务器的资源(如 CPU 处理能力、内存容量、网络带宽等)会成为限制应用性能的因素。原来的单个应用拆分成了许多分散的微服务,它们之间相互调用才能完成一个任务,而一旦某个过程出错(组件越多,出错的概率也就越大),就非常难以排查。
用户请求出现问题无外乎两个问题:错误和响应慢。如果请求错误,那么我们需要知道那个步骤出错了,这么多的微服务之间的调用怎么确定哪个有调用成功?哪个没有调用成功呢?
如果是请求响应太慢,我们就需要知道到底哪些地方比较慢?整个链路的调用各阶段耗时是多少?这些问题需要我们能非常清楚整个集群的调用以及流量情况。并且微服务拆分成这么多组件,如果单个组件出错的概率不变,那么整体有地方出错的概率就会增大。服务调用的时候如果没有错误处理机制,那么会导致非常多的问题。如果某些节点异常(比如网络中断,或者负载很高),也会导致应用整体的响应时间变长,集群服务应该能自动避开这些节点上的应用。
为了保证整个系统的安全性每个应用都需要实现一套相似的认证、授权、HTTPS、限流等功能。
四.Istio的功能
1.连接
对网格内部的服务之间的调用所产生的流量进行智能管理,并以此为基础,为微服务的部署、测试和升级等操作提供有力保障。微服务错综复杂,要完成其业务目标,连接问题是首要问题。连接存在于所有服务的整个生命周期中,用于维持服务的运行,算得上重中之重。
- 相对于传统的单体应用,微服务的端点数量会急剧增加,现代的应用系统在部分或者全部生命周期中,都存在同一服务的不同版本,为不同的客户、场景或者业务提供不同的服务。同时,同一服务的不同版本也可能有不同的访问要求,甚至产生了在生产环境中进行测试的新方法论。错综复杂的服务关系对开发者来说都是很严峻的考验。
从不同的外部用户的角度来看,他们访问的都是同一服务端口,但实际上会因为不同的用户识别,分别访问服务A的不同版本;在网格内部,服务A的版本1可能会访问服务B的两个版本,服务A的版本2则只会访问服务B的版本2;服务B的版本2需要访问外部的云服务,版本1则无此需求。
在这个简化的模型中,包含了以下诉求:
◎ 网格内部的调用(服务A→服务B);
◎ 出站连接(服务B→外部云服务);
◎ 入站连接(用户→服务A);
◎ 流量分割(A服务跟B服务只负责与自己相关流量请求);
◎ 按调用方的服务版本进行路由(服务A的版本1分别调用了服务B的版本1和版本2);
◎ 按用户身份进行路由。
这里除了这些问题,还存在一些潜在需求,如下所述。
(1)在网格内部的服务之间如何根据实际需要对服务间调用进行路由,条件可能包括:
◎ 调用的源和目的服务;
◎ 调用内容;
◎ 认证身份。
(2)如何应对网络故障或者服务故障。
(3)如何处理不同服务不同版本之间的关系。
(4)怎样对出站连接进行控制。
(5)怎样接收入站连接来启动后续的整个服务链条。
连接是服务网格应用过程中从无到有的最重要的一个环节。
2.安全
为网格内部的服务之间的调用提供认证、加密和鉴权支持,在不侵入代码的情况下,加固现有服务,提高其安全性。Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。Istio 是独立于平台的,可以与 Kubernetes的网络策略一起使用。但它更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。
安全问题在以前并不被经常提及,但容器云时代之后,以下问题出现了。
(1)有大量容器漂浮在容器云中,采用传统的网络策略应对这种浮动的应用是比较吃力的。
(2)在由不同的语言、平台所实现的微服务之间,实施一致的访问控制也经常会因为实现的不一致而困难重重。
(3)如果是共享集群,则服务的认证和加密变得尤为重要,比如:
- 服务之间的通信要防止被其他服务监听;
- 只有提供有效身份的客户端才可以访问指定的服务;
- 服务之间的相互访问应该提供更细粒度的控制功能。
要提供网格内部的安全保障,就应具备服务通信加密、服务身份认证和服务访问控制(授权和鉴权)功能。上述功能通常需要数字证书的支持,这就隐藏了对CA的需求,即需要完成证书的签发、传播和更新业务。除了上述核心要求,还存在对认证失败的处理、外部证书(统一 CA)的接入等相关支撑内容。
3.策略
在控制平面定制策略,并在服务中实施。
Mixer: Mixer 在整个服务网格中执行访问控制和策略执行,并从 Envoy 代理和其他服务收集遥测数据。
Envoy: 在istio框架中使用Envoy作为代理,面向Service Mesh的高性能网络代理服务,用于为服务网格中的所有服务提供所有的入站和出站流量,唯一一个与数据平面打交道的
- Istio 通过可动态插拔、可扩展的策略实现访问控制、速率限制、配额管理等功能使得资源在消费者之间公平分配在Istio中使用Mixer作为策略的执行者,Envoy的每次调用,在逻辑上都会通过Mixer进行事先预检和事后报告,这样Mixer就拥有了对流量的部分控制能力;在Istio中还有为数众多的内部适配器及进程外适配器,可以和外部软件设施一起完成策略的制定和执行。
4.观察
对服务之间的调用进行跟踪和测量,获取服务的状态信息。
随着廉价服务器(相对于传统小型机)的数量越来越多,服务器发生故障的频率也越来越高,人们开始产生争论:我们应该将服务器视为家畜还是宠物?家畜的特点:是有功能、无个性、可替换;而宠物的特点:是有功能、有个性、难替换。
随着时代发展,越来越倾向于将服务器视为无个性、可替换的基础设施,如果主机发生故障,那么直接将其替换即可;并且,我们更加关注的是服务的总体质量。因此,微服务系统监控,除了有传统的主机监控,还更加重视高层次的服务健康监控。
服务的健康情况往往不是非黑即白的离散值,而是一系列连续状态,例如我们经常需要关注服务的调用成功率、响应时间、调用量、传输量等表现。
而且,面对数量众多的服务,能对各种级别和层次的指标进行采样、采集及汇总,获取较为精密、翔实的运行数据,最终通过一定的方法进行归纳总结和展示。服务网格还应提供分布式跟踪功能,对服务的调用链路进行跟踪。
观察性:动态获取服务运行数据和输出,提供强大的调用链、监控和调用日志收集输出的能力。配合可视化工具,可方便运维人员了解服务的运行状况,发现并解决问题。
五.Istio与kubernetes
从场景来看,Kubernetes已经提供了非常强大的应用负载的部署、升级、扩容等运行管理能力。Kubernetes 中的 Service 机制也已经可以做服务注册、服务发现和负载均衡,支持通过服务名访问到服务实例。从微服务的工具集观点来看,Kubernetes本身是支持微服务的架构,在Pod中部署微服务很合适,也已经解决了微服务的互访互通问题,但对服务间访问的管理如服务的熔断、限流、动态路由、调用链追踪等都不在Kubernetes的能力范围内。Istio最大化地利用了Kubernetes这个基础设施,与之叠加在一起形成了一个更强大的用于进行服务运行和治理的基础设施,充分利用了Kubernetes的优点实现Istio的功能
- 数据面Sidecar运行在Kubernetes的Pod里,作为一个Proxy和业务容器部署在一起。在服务网格的定义中要求应用程序在运行的时感知不到Sidecar的存在。而基于Kubernetes的一个 Pod 多个容器的优秀设计使得部署运维对用户透明,用户甚至感知不到部署 Sidecar的过程。用户还是用原有的方式创建负载,通过 Istio 的自动注入服务,可以自动给指定的负载注入Proxy。如果在另一种环境下部署和使用Proxy,则不会有这样的便利。
- Istio的服务发现机制非常完美地基于Kubernetes的域名访问机制构建而成,避免了在 Kubernetes 上运行时服务发现数据不一致的问题。
- Istio的所有路由规则和控制策略都是通过 Kubernetes CRD实现的,因此各种规则策略对应的数据也被存储在 Kube-apiserver 中,不需要另外一个单独的 APIServer 和后端的配置管理。所以,可以说Istio的APIServer就是Kubernetes的APIServer,数据也自然地被存在了对应Kubernetes的etcd中。Kubernetes里已经有的,绝不再自己搞一套,避免了数据不一致和用户使用体验的问题。
Istio和Kubernetes架构的关系,Istio不仅数据面Envoy跑在Kubernetes的Pod里,其控制面也运行在Kubernetes集群中,其控制面组件本身存在的形式也是以Kubernetes Deployment和Service,基于Kubernetes扩展和构建。