赞
踩
Service Mesh(服务网格)是一种用于处理微服务间通信的架构模式。它提供了一种透明且可配置的方式来管理服务之间的网络通信,以解决微服务架构中的一些常见问题。
在传统的微服务架构中,服务之间的通信通常通过HTTP或RPC进行,而这些通信通常需要显式地在代码中编写和管理。这导致了一些挑战,如服务发现、负载均衡、故障恢复、安全性和可观测性等方面的复杂性。
Service Mesh通过在微服务之间插入一个专用的代理(称为Sidecar),来解决这些问题。该代理与每个微服务实例一起部署,并负责处理网络通信。Service Mesh通常使用开源项目(如Istio、Linkerd和Consul)来实现。
Service Mesh提供了以下核心功能:
通过引入Service Mesh,开发人员可以将关注点从网络通信细节转移到业务逻辑上。它提供了一种解耦的方式来处理微服务间的通信,并提供了一些强大的功能来提高可靠性、安全性和可观察性。
以下是几个常见的开源项目,用于实现服务网格:
项目名称 | 数据平面代理 | 控制平面 | 语言 | 社区支持 | 特点和功能 |
---|---|---|---|---|---|
Istio | Envoy | Pilot, Citadel, Galley, Mixer | Go | 非常活跃的社区 | 强大的流量管理、安全性、可观察性和策略控制。 |
Linkerd | Linkerd2-proxy | Linkerd2-controller | Rust, Go | 非常活跃的社区 | 轻量级、易于部署和操作,提供流量管理和故障恢复功能。 |
Consul Connect | Envoy | Consul | Go | 非常活跃的社区 | 集成了服务发现、流量路由和安全通信的功能。 |
Gloo Mesh | Envoy | Gloo Mesh | Go | 活跃的社区 | 提供统一的配置和管理界面,支持多个数据平面代理。 |
Cilium | eBPF | Cilium | Go | 活跃的社区 | 基于eBPF实现的高性能数据平面代理,提供流量管理和安全性等功能。 |
Maistra | Envoy | Maistra | Go | Red Hat支持的社区 | 在Istio的基础上提供增强功能和简化部署体验。 |
Supergloo | Envoy | Supergloo | Go | 活跃的社区 | 提供统一的控制平面,简化多个服务网格的管理和配置。 |
先说说小编实际感受:
- 公司项目上百个以上,缺乏周边服务治理,如监控报警日志等。服务挨个集成成本大
- 上k8s,只用于系统部署,中间件、Jenkins等都单独部署在k8s外,组件没统一管理
- 历史遗漏系统太多,技术人员技术参差不齐,在项目中集成周边服务治理组件不太现实
- 基于上诉问题,需将服务治理组件下沉到基础设施中,istio刚好能解决这些问题
微服务,又叫微服务架构,是一种软件架构方式。它将应用构建成一系列按业务领域划分模块的、小的自治服务。
传统微服务架构面临的挑战:
传统微服务基础设施如服务注册与发现,在工程中需引入三方SDK,代码入侵高,当周边服务治理组件越多,依赖越复杂,技术绑定过紧,语音支持受限、难以维护
思考:上述架构问题,基础设施和业务系统深度耦合,如何剥离?当将基础设施SDK从左下图工程中剥离出到右图,基础设施SDK成为单独的服务,与原来服务如何通信成了一个问题。
因此基础设施SDK既要剥离,也要与原来服务逻辑上为一体,使用与原来一样透明无感,演化出如下边车架构及ServiceMesh架构风格:
Istio是一个开源的服务网格平台,用于管理和连接微服务应用程序。它提供了一组强大的功能,以增强微服务架构的可观察性、可靠性和安全性。
以下是Istio的一些关键特性:
总之,Istio是一个功能强大的服务网格平台,提供了丰富的功能来简化和增强微服务应用程序的管理和通信。它可以帮助您解决微服务架构中的常见问题,并提供更好的可观察性、可靠性和安全性。
Istio的架构主要由以下几个核心组件组成:
下面是对Istio的核心组件进行简要介绍的表格输出:
组件名称 | 描述 |
---|---|
Pilot | 负责流量管理,包括服务发现、负载均衡和请求路由。它将配置信息传递给数据平面代理。 |
Citadel | 提供服务间的安全通信,负责生成和管理服务之间的TLS证书,实现身份验证和加密。 |
Galley | 负责验证和转换用户定义的配置,并将其分发给数据平面代理。它处理Istio配置的验证和转换工作。 |
Mixer | 负责遥测收集、策略控制和访问控制。它收集和分析流量数据,并执行策略和访问控制规则。 |
Sidecar Injector | 自动将Istio的数据平面代理(如Envoy)注入到应用程序的容器中,实现透明的服务网格功能。 |
Istiod | 控制平面的核心组件,集成了Pilot、Citadel、Galley和Mixer等功能,提供统一的管理接口和服务。 |
Gateway | 提供入口流量管理,允许外部流量进入服务网格,并将其路由到正确的服务。 |
VirtualService | 定义流量的路由规则和目标配置,允许进行高级的流量控制和请求转发。 |
DestinationRule | 定义服务的负载均衡策略、连接池设置和其他目标配置,影响请求的行为和处理方式。 |
ServiceEntry | 允许将外部服务引入到服务网格中,使其能够通过服务发现和路由进行访问。 |
Istio 使用 Envoy 代理的扩展版本。Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 代理是唯一与数据平面流量交互的 Istio 组件。
Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:
特性 | 描述 |
---|---|
动态服务发现 | Envoy可以与服务发现系统集成,动态地发现和管理后端服务的实例,使流量能够智能地路由到可用的服务节点。 |
负载均衡 | Envoy支持多种负载均衡算法,如轮询、加权轮询、最少连接和故障感知等,以确保流量在后端服务节点之间均匀分布。 |
TLS 终端 | Envoy可以作为TLS终端,负责处理与客户端之间的TLS握手和加密解密操作,提供安全的通信通道。 |
HTTP/2 与 gRPC 代理 | Envoy支持HTTP/2和gRPC协议,可以代理和转发这些协议的请求和响应,提供高性能的通信能力。 |
熔断器 | Envoy支持熔断器模式,可以根据后端服务的健康状态和负载情况,自动断开或恢复与某个服务节点的连接,以避免级联故障。 |
健康检查 | Envoy可以定期对后端服务进行健康检查,以确保只将流量路由到可用的服务节点,提高服务的可靠性和可用性。 |
基于百分比流量分割的分阶段发布 | Envoy支持基于百分比的流量分割,可以将一部分流量逐步引导到新版本的服务,实现分阶段发布和回滚。 |
故障注入 | Envoy可以模拟故障情况,如延迟、错误响应和超时等,用于测试系统的容错能力和故障恢复策略。 |
丰富的指标 | Envoy提供了丰富的指标和统计信息,可以用于监控和分析流量、延迟、吞吐量和错误率等性能指标。 |
这种 Sidecar 部署允许 Istio 可以执行策略决策,并提取丰富的遥测数据, 接着将这些数据发送到监视系统以提供有关整个网格行为的信息。
Sidecar 代理模型还允许您向现有的部署添加 Istio 功能,而不需要重新设计架构或重写代码。
由 Envoy 代理启用的一些 Istio 的功能和任务包括:
- 流量控制功能:通过丰富的 HTTP、gRPC、WebSocket 和 TCP 流量路由规则来执行细粒度的流量控制。
- 网络弹性特性:重试设置、故障转移、熔断器和故障注入。
- 安全性和身份认证特性:执行安全性策略,并强制实行通过配置 API 定义的访问控制和速率限制。
- 基于 WebAssembly 的可插拔扩展模型,允许通过自定义策略执行和生成网格流量的遥测。
Istiod是Istio服务网格的核心组件之一,它是Istio控制平面的主要部分。作为Istio的控制平面代理,Istiod负责管理和协调整个服务网格中的流量路由、安全策略和监控等功能。
以下是Istiod的主要功能和特点:
总而言之,Istiod是Istio服务网格的核心组件,提供了配置管理、流量管理、安全策略、监控和遥测等功能,帮助用户实现可靠、安全和可观察的服务通信。
组件 | 功能 |
---|---|
Istiod | 管理和协调整个服务网格的流量路由、安全策略和监控等功能 |
Pilot | 服务发现和流量管理,将配置信息下发给Envoy代理实现流量路由和负载均衡 |
Citadel | 服务之间的身份认证和流量加密,生成、管理和分发TLS证书和密钥 |
Galley | 配置管理和验证,解析和转换配置信息,确保配置的合法性和一致性 |
Mixer | 遥测和策略评估,收集和聚合遥测数据,执行配置的策略规则 |
Grafana | 监控和可观察性工具,用于收集和展示服务的指标和性能数据 |
Prometheus | 监控和报警工具,用于收集和存储服务的指标和性能数据 |
官网参考:概念,官网文章很详细,此处小编只做总结。
Istio 的流量路由规则可以让您很容易的控制服务之间的流量和 API 调用。 Istio 简化了服务级别属性的配置,比如熔断器、超时和重试,并且能轻松的设置重要的任务, 如 A/B 测试、金丝雀发布、基于流量百分比切分的分阶段发布等。它还提供了开箱即用的故障恢复特性, 有助于增强应用的健壮性,从而更好地应对被依赖的服务或网络发生故障的情况。
Istio 的流量管理模型源于和服务一起部署的 Envoy 代理。 网格内服务发送和接收的所有 data plane 流量都经由 Envoy 代理, 这让控制网格内的流量变得异常简单,而且不需要对服务做任何的更改。
流量管理包括以下功能:
将单一应用程序分解为微服务可提供各种好处,包括更好的灵活性、 可伸缩性以及服务复用的能力。但是,微服务也有特殊的安全需求:
Istio 安全功能提供了强大的身份、强大的策略、透明的 TLS 加密、 认证/授权/审计(AAA)工具来保护您的服务和数据。Istio 安全的目标是:
主要特点是可以实现零信任网络中的服务之间通讯加密。Istio 通过自动为服务之间的通信提供双向 TLS 加密来增强安全性,同时 Istio 还提供了强大的身份验证、授权和审计功能。
Istio 为网格内所有的服务通信生成详细的遥测数据。这种遥测技术提供了服务行为的可观测性, 使运维人员能够排查故障、维护和优化应用程序,而不会给服务的开发人员带来任何额外的负担。 通过 Istio,运维人员可以全面了解到受监控的服务如何与其他服务以及 Istio 组件进行交互。
Istio 生成以下类型的遥测数据,以提供对整个服务网格的可观测性:
Istio 支持 Jaeger、Zipkin、Skywalking 等链路追踪中间件,支持 Prometheus 收集指标数据,然后日志功能没有上面亮点,只是记录了请求的 HTTP 地址之类。Istio 的可观测性帮助我们了解应用程序的性能和行为,使得故障检测、性能分析和容量规划变得更加简单。
Istio原理是拦截 Kubernetes 部署 Pod 的事件,然后从 Pod 中注入一个名为 Envoy 的容器(如下右图),进出 Pod 的流量会被 “劫持” 到 Envoy 进行处理。由于所有流量都被 Envoy “劫持” 了,所以 Istio 可以对流量进行分析例如收集请求信息,以及一系列的流量管理操作,也可以验证授权信息。当 Envoy 拦截流量并执行一系列操作之后,如果请求没问题,就会转发流量到业务应用的 Pod 中。
总结一下,istio劫持了pod的流量,根据istio相关CRD配置后完成了相关治理,再转发给目的pod,这样就多了一层转发,会导致系统响应速度会有所下降,但是增加的响应时间几乎可以忽略不计。
每个 Pod 都有一个 Envoy 负责拦截、处理和转发进出 Pod 的所有网络流量,这种方式被称为 Sidecar。
以下是 Istio Sidecar 的一些主要功能:
由于 Pod 是通过 Envoy 暴露端口的,所有进出口流量都需要经过 Envoy 的检查,所以很容易判断访问来源,如果请求方不是在 Istio 中的服务,那么 Envoy 便会拒绝访问。
在 Istio 中,Envoy 这一块称为数据平面,而负责管理集群的 istiod 组件称为控制平面。
istio-ingressgateway (Istio Ingress Gateway )类似 Kubernetes 的 Ingress ,是 Istio 控制外部流量进入 Kubernetes 的入口组件,istio-ingressgateway 作为一个入口点,允许从服务网格外部访问服务网格内部的服务,起到了类似 nginx、apisix 等入口网关的作用。
Istio Ingress Gateway 的主要包括以下作用:
istio-ingressgateway 本身包含 Kubernetes Service 、Pod,通过暴露节点端口,外部可以通过节点端口将流量打入 istio-ingressgateway 的 Pod。
流量经过 Istio 分析后,流量通过负载均衡转发到其中一个 Pod。
istio-ingressgateway 并不能直接转发流量到 Pod,它还需要进行一些配置。我们要为 productpage 创建一个站点,绑定对应的域名,这样外部访问 istio-ingressgateway 的端口时,istio-ingressgateway 才知道该将流量转发给谁。在 Istio 中,定义这种绑定关系的资源叫 Gateway。
虽然有了 Istio Gateway,但是我们还不能直接通过网关访问到前面部署的微服务,我们还需要创建 Istio VirtualService 将 Istio Gateway 跟对应的 Kubernetes Service 绑定起来,然后流量才能正式流向 Pod。
请一定要注意这里,流量实际并不会经过 Service 中,但是 VirtualService 需要通过 Service 来发现 Pod。
这里类似 nginx 配置反向代理,配置监听之后,还需要指向将请求映射到哪个地址。
server {
listen 80;
server_name example.org www.example.org;
#...
}
location /some/path/ {
proxy_pass http://A:9080;
}
VirtualService 的主要目标是为服务提供稳定的入口地址,并通过配置一系列的路由规则来控制流量在网格内的行为。
就以最简单的路由区配来说,Kubernetes Service 是不支持路由规则的,而 Istio 可以通过指定路由后缀中;Service 不支持流量分析,负载均衡只有轮询。而 Istio 利用 Service 来发现 Pod,然后直接将流量转发到 Pod 中,可以实现各种功能。
VirtualService 可以用于实现以下功能:
- 请求路由:将请求路由到特定的服务或版本,例如将请求分发到不同版本的服务,以实现灰度发布或金丝雀发布。
- 请求重试:为失败的请求配置重试策略,以提高服务的可用性。
- 请求超时:设置请求的超时时间,以便在特定时间内没有得到响应时中断请求。
- 请求镜像:将请求的副本发送到另一个服务,用于测试新版本的服务,而不影响实际的生产流量。
- 流量分割:将流量按照特定的比例分发到不同的服务或版本,以实现流量控制。
Istio VistualService 中可以限制外部能够访问的路由地址,而 DestinationRule 则可以配置访问的 Pod 策略。可以为 Istio VistualService 绑定一个 Istio DestinationRule,通过 DestinationRule 我们还可以定义版本子集等,通过更加丰富的策略转发流量。将流量转发到指定的版本。
参考内容:
Introduction · istio 服务网格入门与实践
istio资源介绍以及和kubernetes资源扭转关系
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。