前言
大家好,我是路由器没有路。
在分布式系统中,服务间的通信是非常常见的,然而这种通信往往面临着很多问题,比如网络异常、超时、重试、并发等等问题。
那么在云原生生态环境下,又是如何做到对这些问题进行监视、发现和追踪的呢?
今天跟大家聊的话题是:什么是 Istio 服务网格?
什么是服务网格
服务网格(Service Mesh)是一种透明管理和调控服务之间通信的基础设施层,其中的基本理念是将服务间的通信和功能与应用本身的核心逻辑分离开来。
服务网格作为服务间通信的基础设施层,负责通过包含现代云原生应用程序的复杂服务拓扑来可靠地传递请求。
实际上,服务网格通常通过一组轻量级网络代理来实现,这些代理与应用程序代码一起部署,而不需要感知应用程序本身。通常用于描述构成这些应用程序的微服务网络以及应用之间的交互。
随着规模和复杂性的增长,服务网格也越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、指标收集、监控以及通常更加复杂的运维需求,例如 A/B 测试、金丝雀发布、限流、访问控制和端到端认证等。
简单来说,服务网格通过一个代理模式工作,把所有的服务间通信经过代理,将网络中的应用流量载入到网格中,并支持复杂的管理和调控操作。
服务网格有什么特点
在服务网格中,代理负责其下所有服务的通信,具有如下特点:
- 并发控制:轻量级网络代理,代理模式能够控制微服务的并发;
- 安全特性:安全基础配置和身份验证等特性,可以加强微服务的安全性。同时还让软件开发者更加安全地部署快速增长的微服务网格;
- 可靠性:服务网格可以保证服务间的调用是无缝的,而且服务之间的通信是可靠的,会更少出现故障;
- 错误处理:服务网格可以处理请求得到的错误,这可以帮助开发者迅速恢复出错的服务;
- 监控:服务网格可以在整个生命周期中,实时地监控服务间的流量,监控流量改进服务间通信的健壮性、安全性和性能;
- 无感解耦:应用程序无感知,作为服务间通信的基础中间层,与应用程序解耦。
目前业界比较流行的服务网格开源软件 Istio 可以直接在 Kubernetes 中集成。
如何理解服务网格
如果用一句话来解释什么是服务网格,可以将它比作是应用程序或者说微服务间的 TCP/IP
,负责服务之间的网络调用、限流、熔断和监控。
对于编写应用程序来说一般无须关心 TCP/IP
这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用服务网格也就无须关心服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给服务网格就可以了。
服务网格的架构如下图所示:
服务网格作为 sidecar
运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在 serivce mesh
中实现。
服务网关的工作原理
在服务网格中,每个微服务都有一个代理,这个代理可以使微服务之间的通信变得更加透明和容易。
服务网格内部的代理可以处理应用程序路由、流量管理、安全控制和监控统计等所有通信所涉及的问题。
Istio
是一个开源的服务网格,它通过 Envoy
和后端应用程序和微服务进行自动化管理和托管。Istio
的网关代理是一个应用程序,部署到网格中的每个主机上,可提供网格边缘的入口点。
然后可以将浏览器发出的 HTTP
请求路由到 Istio
网关代理,网关代理使用规则来确定是否将这个请求带到目标服务或集群的实例。
如果网关代理将请求转化给后端服务,那么代理会将请求和响应流量路由到被选中的目标服务,并以此为一项操作服务。
下面以 Istio
为例说下服务网格在 Kubernetes
中的工作原理:
- Istio 将服务请求路由到目的地址,根据其中的参数判断是到生产环境、测试环境还是 staging 环境中的服务(服务可能同时部署在这三个环境中),是路由到本地环境还是公有云环境?所有的这些路由信息可以动态配置,可以是全局配置也可以为某些服务单独配置。
- 当 Istio 确认了目的地址后,将流量发送到相应服务发现端点,在 Kubernetes 中是 service,然后 service 会将服务转发给后端的实例。
- Istio 根据它观测到最近请求的延迟时间,选择出所有应用程序的实例中响应最快的实例。
- Istio 将请求发送给该实例,同时记录响应类型和延迟数据。
- 如果该实例挂了、不响应了或者进程不工作了,Istio 则把请求发送到其他实例上重试。
- 如果该实例持续返回 error,Istio 会将该实例从负载均衡池中移除,稍后再周期性的重试。
- 如果请求的截止时间已过,Istio 主动以失败的方式结束该请求,而不是再次尝试添加负载。
- Istio 以 metric 和分布式追踪的形式捕获上述行为的各个方面,这些追踪信息将发送到集中 metric 系统中。
服务网格的作用
服务网格并没有给我们带来新功能,它是用于解决其他工具已经解决过的问题,只不过这次是在云原生的 Kubernetes 环境下的实现。
在传统的 MVC 三层 Web 应用程序架构下,服务之间的通讯并不复杂,在应用程序内部自己管理即可。但是在现今的复杂的大型网站或云原生架构下,单体应用被分解为众多的微服务,服务之间的依赖和通讯十分复杂。
而容器的使用给予了异构应用程序的更多可行性,Kubernetes 增强应用的横向扩容能力,用户可以快速的编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过多关心应用程序的监控、扩展性、服务发
现和分布式追踪这些繁琐的事情而专注于程序开发,赋予开发者更多的创造性。
服务网格可以为应用和微服务提供许多有用的功能和服务,以下是服务网格的作用:
- 网络规则:网络规则功能可以对微服务之间的流量进行管理,以期达到服务的可靠性、可扩展性和安全性等目的;
- 服务发现:服务网格可以通过提供服务发现功能,在网格中使微服务之间的通信变得更加透明和容易。同时,此功能还提供了更多的可视化效果,可以帮助开发者更好地监控网格中的所有服务;
- 监视和追踪:服务网格还可以在运行时监视和追踪所有请求。这可以帮助开发者处理应用程序中的任何错误,得以快速恢复功能和服务;
- 可靠性:服务网格可以更好地管理流量,以减少错误和故障,从而提高服务的可靠性;
- 安全性:服务网格中的代理模式可以加强微服务的安全性。通过安全基础配置和身份验证等特性,可以让软件开发者更加安全地部署网格中快速增长的微服务;
总结
以上是对 Istio
服务网格进行简单的讲解,主要从服务网格是什么、有什么特点以及它的作用是什么等这几个方面来进行说明。
后续会进一步对 Istio 服务网格的实现模式进行讲解,由浅到深带你彻底搞懂微服务网格 Istio
。