共计 5828 个字符,预计需要花费 15 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关 istio 是怎么连接、管理和保护微服务 2.0 的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
一、分布式计算的八个谬论
彼得多维奇多年前提出的分布式计算的八个谬论,对于开发人员来说他们往往会忽视这八条。这八条基本上都和网络相关,例如在发起一个网络请求时,会不断地做一些尝试等待,来保障消息投递的有效性。
微服务是一个更为复杂的分布式系统,之前 SOA 或者 B /S,CS 架构,它的颗粒度会更粗一点,但是如果采用微服务,它的颗粒度是更细的。在马丁·富勒博客《微服务的先决条件是什么》一文中提到一条,你必须要成为“高个子”,想成为“高个子”其实并不简单,很多公司,它们都是为了成为“高个子”,做了很多框架、平台。
二、服务治理
1 微服务治理的技术点
要成为“高个子”需要对微服务进行哪些改造,这里是相关服务治理的技术点,其中只是一部分,和服务网格比较相关的技术点,包含服务发现、负载均衡、请求路由、认证与授权、可观测性,还有健康检查、容错等。目前主流的解决方案有众所周知的 Spring Cloud, Dubbo 等,这些都是提供库来把服务治理相关的内容打包,供具体的业务去调用。
2 库或框架的问题
但是库和框架会存在一些问题:
1、学习成本。多一个库对于开发人员而言,意味着要多学一些东西,并且在业务开发过程中,还会受到库或者框架的制约。
2、对业务代码的侵入性。例如用 Spring Cloud 会在代码里面加很多额外的内容,比如每个请求里面加一个注解来表达想引用服务治理的某些功能。
3、基础库的维护、升级和下线。如果是以库的方式来提升到服务里面,库的维护、升级、下线就会造成整个服务的维护、升级、下线。
4、不同语言和技术栈。在提出微服务概念时,它的一个重要好处就是可以使用不同的技术栈来开发微服务,但如果受到框架制约,只能用这个语言,这是我们比较头痛的事情,无法发挥微服务跨语言的能力。
这些问题其实是有严重程度的,从上往下越来越让开发人员觉得不舒服。理想中的服务治理方案是什么?可以先畅想一下,整个服务治理相关的东西,应该是和业务逻辑完全隔离的,并且服务和服务之间的交互是不会考虑服务治理这块内容,最好对于业务开发来说是不可见的。
这时候怎么去做呢?就引出了容器经典部署模式——Sidecar。
3Sidecar 模式
Sidecar 模式通常是和容器一起使用,如果不和容器一起使用也没关系,那就是两个独立的进程,如果和容器使用的话,就基于容器为单位。Sidecar 模式是物理隔离的,并且与语言无关。因为是两个独立的东西,可以独立发布,和微服务理念一样。另外它们是部署在同一个 Host 上面,所以资源之间可以做到相互访问,并且因为在一起所以通信延迟也不会太明显。和业务无关的功能都可以放上去,形成多个 Sidecar。今天 Sidecar 主要是把一些服务治理相关的东西放在里面,做软件设计上的思想就是分离关注点。
基于 Sidecar 模式做服务治理,之后形成连接的具体状况,如图,对于服务 A 来说,服务 A 是不知道和 Sidecar 进行通信,服务 A 还是向服务 B 发消息,照常调用通信接口,但是消息可能会被 Sidecar 捕获到,然后通过 Sidecar 进行转发。
三、服务网格
两个最新的控制面板,一个是 Istio,是由 Google、IBM、Lyft 开发的,而 Conduit 是由 Buoyant 公司开发的,跟刚才所说的性能不太好的数据面板 Linkerd 是同一家公司,Buoyant 在 Linkerd 之后又重新开发了 Conduit,专门来解决性能上的问题,所以在性能上面来看,Conduit 的性能指标已经出来了,就是微秒级,并且是 P99 延迟。但是 Istio 的性能指标现在还没出来,还在功能开发阶段。因为 Istio 需要实现的功能比较多,要支持各种各样的平台和过滤,Istio 整个架构非常灵活,所以 Istio 整个量级是比较重量的,但是 Conduit 只支持 K8S,Conduit 的原则是怎么快怎么来。
从编程语言上来说,控制面板 Istio 和 Conduit 都是使用 Go 语言,但是在数据面板上 Istio 是使用 C ++,Conduit 使用 Rust,可以看出来这两个语言都是那种比较高效的,在数据面板上面必须要使用高效的语言来完成。
四、Istio 架构
一句话定义 Istio:一个用来连接、管理和保护微服务的开放平台。刚才也说了 Istio 是 Google 开发的,所以 Istio 今后的趋势肯定是会越来越火的,并且目前 K8S 已经把它集成到里面了,做成一个可选的组件。
对于连接而言,Istio 它主要包含弹性、服务发现、负载均衡,管理是流量控制、策略增强,监控也有,并且安全这块 Istio 也是有考虑,Istio 是端到端的身份验证和授权,等一下会详细的介绍。
Istio 的关键特性:
1、智能路由和负载均衡。这里的智能路由和负载均衡是属于比较高级的,不是像传统简单的随机负载均衡,而是可以基于一些数据包内部的内容来进行负载均衡。
2、跨语言和平台的弹性。对于平台来说 Istio 是支持各种各样的平台,并且能支持 A / B 测试,金丝雀发布,并使用蓝绿部署运维上的一些高级功能。
3、全面策略执行。Istio 有一个组件是专门负责保障策略能够通过一个组件下发到具体的数据面板。
4、遥测和上报。即具体的测量以及流量的监控等。
这个就是 Istio 整个的系统架构,如图,上面是控制面板,下面是很多数据 Envoy,很多个代理,形成一个数据面板。后面我们会对单个进行详细介绍。
这是在 K8S 下面 Istio 部署的示意图,可以看到它们之间最关键的东西是所有服务和组件都会有一个代理,这代理是必备的,包括控制面板都会有代理。没有画的有两个东西,一个是 Ingress,一个是初始化器,初始化器主要是做代理注入。它们之间相互的交互都是通过加密,由 TLS 协议来完成。
五、Istio 组件
1 数据面板 Envoy
介绍一下 Istio 的核心组件,首先是 Istio 的数据面板 Envoy。
Envoy 的目标是透明地处理集群内服务间、从服务到外部服务之间的出入口流量。Envoy 是用 C ++ 编写的,高并行、非阻塞。并且是可装卸的 L3/ 4 过滤器,以及 L7 的过滤器,最终会形成一个过滤链来对流量进行管理或者控制,Envoy 是通过 xDS 动态配置来进行接口提供。
下面就是一些固有的功能,服务发现、健康检查。Envoy 的健康检查也做的颗粒度比较细,包含主动健康检查和被动健康检查。主动健康检查像常规的健康检查,主动地发一个健康检查的接口调用请求,查询一下。被动的是通过对其他服务的一些请求,从一些返回值进行健康检查。当然还包含高级的负载均衡,监控、跟踪这些功能。
Envoy 最关键的三个点:
高性能。一直在强调的是数据面板必须要高性能,因为是要和业务服务部署在一起的。
可扩展。
可配置。具有动态配置的特性。
Envoy 是如何做到高性能的?
Envoy 的线程模型分为三类线程,如果做过 C ++ 开发,这种单进程多线程的架构是很常见的。Envoy 分为主线程、工作线程、文件刷新线程,其中主线程就是负责工作线程和文件刷新线程的管理和调度。而工作线程主要负责监听、过滤和转发,工作线程里面会包含一个监听器,如果收到一个请求之后会通过刚才所介绍的过滤链来进行数据过滤。前面两个都是非阻塞的,唯一一个阻塞的是这种 IO 操作的,会不断地把内存里面一些缓存进行落盘。
服务网格所强调的另外一个功能,是动态配置不用重启,实际上是重启的,它会启动一个新的进程,然后在这进程之上进行新的策略,还有一些初始化,这时候再请求监听,之前那个进程的 socket 副本。当老的关闭链接以及退出之后,它才会接收新的,这时候就实现了对用户没有感知的重启。
这就是它的 xDS,如图,可以看到它的密度是非常细的,
终端发现服务(EDS),实际上就是服务的发现服务;
集群发现服务(CDS)是为了发现集群;
路由发现服务(RDS)是为了对路由进行一些处理;
监听器(LDS)来动态地添加、更新、删除监听器,包括过滤链的一些管理、维护。
另外还有刚才说到的健康检查(HDS),
还有聚合(ADS)是对于监控指标进行聚合的接口;
另外一个密钥发现(KDS)是和安全相关的。
首先,如果来了一个请求,会到刚才所说的工作线程里面去,工作线程会有监听器,收到之后进行一些处理,然后要往外发,这时会调用路由的发现功能,然后再找到相应的集群,再通过这个集群找到相应的服务,一层一层的往下面调用。
2 控制面板 Pilot
接下来介绍的是控制面板的三大组件,第一个就是 Pilot。
Pilot 是运行时的代理配置,刚才所说的 xDS,就是用 Pilot 来进行调用,负责把相应的一些策略,失败恢复的特性派发下去。Pilot 是负责管理所有的这些代理,代理和管理就通过 Pilot 来完成,是平台无关的一个拓扑模型。目前主要支持的是 K8S。
Pilot 是一层抽象的独立于底层平台的模型,因为这里有个代理,对于多平台或多样性的管理架构,即适配器的架构。平台特定的适配器负责适当填充这些规范,要通过具体平台的适配器形成一些规范,和通用的模型结合,生成必须要往 Envoy 下发的数据,并且配置、推送都是由 Pilot 来完成的。
Pilot 的整个服务发现和负载均衡,如图,Pilot 是 Kubernetes DNS 提供的域名进行访问,首先调用 Service B 的 url,这时候 Envoy 会进行截获并处理,处理完之后会找到相应的负载均衡的池子挑选一个进行流量下发。Pilot 目前支持的这种负载均衡的方法,规划了很多种。但目前只实现了三种,前两种还是随机和轮循,多了一个最小请求的负载均衡算法。它能找到这些 Pilot 里面哪个被调用的最少,然后进行调用。
Pilot 的一些规则配置,可以看到基本是负责规则的管理以及下发。
路由规则。
目的地策略。主要包含负载均衡的算法,以及对于负载均衡算法抽象的策略预演。
出站规则。
把这些规则分了三类,好处是对这三类都会生成一些模板。
流量的拆分可以看到是基于标签的流量拆分,这里配置的如版本,环境,环境类型,它根据这个规则来进行流量的派发。比如说 99% 都发给之前版本,新版本先 1% 先测一下,类似于 A / B 测试。
另外一个比较高级的是基于内容,因为它是 L7 的这种过滤,可以基于内容来过滤,并且支持表达式,这种将 iPhone 的流量全部导到新的服务里面去,并且有标签,版本必须得是金丝雀版本。
3 混合器 Mixer
Mixer 是在应用代码和基础架构之间提供一个中间层,来隔离 Enovy 和后台基础设施,这里的后台是指 Promethus,ELK 这些。
Mixer 有三个核心特性:
先决条件检查。负责白名单以及 ACL 检测;
配额管理。负责这种使用频率上的控制;
遥测报告。
总共分为两类,在生成配置模板的时候它是有两类的,第一类就是负责检查 check,第二类就是负责报告 reporter。
Mixer 是采用通用的插件模型以实现高扩展性,插件被称为适配器。运维人员下发一些配置到这里面,这些模板又是由模板开发人员进行开发的,Istio 提供了很多通用性的模板,上面简单地改造一下就能做出一个模板来。适配器也有很多种,各种后台、平台的都有。
Mixer 是抽象了不同后端的策略,遥测系统的细节,它就对这两个东西进行了抽象,形成了一套抽象的东西。
刚才介绍过适配器,再来介绍一下处理器,它是配置好的适配器,由运维人员进行配置,之后形成最终的处理器,负责真正往后台发东西。
它封装了与后端接口所需的逻辑,指定了配置规格,以及适配器。如果要在后台进行消息交互的话,所需要的操作参数在这里也会定义。而右边就是两个模板,第一个模板是 Prometheus,它是一个处理器,下面是它的一些指标。另外一个是白名单检查的模板,提供 URL,以及它请求的接口返回值。
刚才介绍了整个通路是怎么打通的,包括适配器和处理器都是为了干这个事情,这个通路怎么建立?接下来要介绍的是这个参数怎么生成,它是请求属性到一个模板的映射结果。
Mixer 会收到 Envoy 发过来的很多属性(请求),请求里面包含的数据都称之为属性。通过它的模板来生成相应的具体参数,这边也是刚才两个例子里面对应的模板。上面是度量指标采集用的,下面是白名单。
这里有个遥测报告的示例,当收到一个请求之后会发生什么。它会以属性的形式,这边有个 Zipk,就直接上报了,这是因为 Envoy 原生的就支持 Zipk。Envoy 支持后端监控的东西,就是 Zipk,所以它可以直接发给它。其他的需要通过 Mixer 来进行转发。
首先它收到这个属性之后,会把这个属性生成具体的实例。根据运维人员提供的配置,Mixer 将生成的数据分发到一组适配器,适配器要根据运维人员的配置来生成具体的数据,之后就可以把刚才所生成的实例往下发了。发到后端后可以进行进一步的分析和处理。
4 密钥管理
最后要介绍的就是安全相关的,Certificate Authority 这块,这是整个密钥管理的示意图,可以看到服务和 Envoy 是通过 TCP 进行交互的,但是 Envoy 和 Envoy 之间是通过 MTIS 进行加密,是双向的 TIS 加密。它的好处是,会在内部的每一个服务节点之间做加密,当然这是可选的,根据性能的需求来进行选择。
密钥管理分为四个步骤,这四步就是四个特性,第一,通过服务帐户生成的密钥和证书,然后再将密钥和证书部署到 Envoy 上,它还支持周期性的对这证书进行更新,另外还支持撤销的功能。
这是它的两种部署方式,一种 K8S 的部署方式,另外如果是虚拟机,它会单独有一个节点代理,通过节点代理来发出签名请求给 CA,CA 再生成密钥和证书给代理,代理再来负责部署到 Envoy 上。
具体的运行时它们都有各自的证书,开始进行双向的 TIS,这时候会到名字信息里面去查询,后端有没有权限访问,如果有的话就往下,没有就结束了。
第三步,如果收到一个客户端的请求,会去 Mixer 里面判断一下,它是白名单上的一个判断或者是不是黑名单上的一个判断,会影响“握手”的成功与否。最终它们就形成了安全交互的通道。
上述就是丸趣 TV 小编为大家分享的 istio 是怎么连接、管理和保护微服务 2.0 的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。