【51CTO.com原创稿件】伴随着互联网技术的不断发展,各大互联网公司的系统越来越复杂,传统的系统架构越来越不能满足业务的需求,取而代之的是微服务架构。目前比较流行的微服务架构有阿里的Dubbo,Spring Cloud,还有苏宁的RSF框架。
虽然上述的技术比较成熟,并且都能够很好的治理微服务系统,但是使用以上框架管理微服务时,需要在业务代码中添加微服务治理相关的代码,导致了业务人员不能专注于业务开发,还需要考虑微服务治理的解决方案,并且将解决方案融合到其业务系统中。并且伴随着微服务治理解决方案的升级,也需要修改相关的业务代码,会增加相关业务开发人员的工作量。
为了解决上述的问题,Buoyant公司提出了Service Mesh(服务网格)的概念。并且于2016 年 1 月 15 日***发布,业界***个 Service Mesh 项目(Linkerd)。Service Mesh是一个在服务和基础网络之间的专用基础设施层。它可以让业务系统完全不用关心微服务的治理,只需要专注于自身的业务逻辑。
伴随着Service Mesh技术不断发展,越来越多的Service Mesh产品不断的涌现出来,在所有的Service Mesh产品中,Google/IBM 联合开发的开源项目Istio是***秀的Service Mesh产品。接入Istio服务网格之后,现有的业务系统在不需要改变任何代码的情况下,将具备流量管理,路由控制,服务降级等功能。
sito服务网格的架构
stio服务网格逻辑上分为数据面板和控制面板。
- 数据面板由一组智能代理(Envoy)组成,并且作为边车(sidecar)进行部署,调解和控制微服务之间的网络通信。
- 控制面板负责管理和配置代理来路由流量。此外,控制面板配置Mixers来执行策略和收集数据。
下图显示了构成每个面板的不同组件:
- Pilot为Envoy sidecars提供服务发现能力,并且为智能路由提供路由管理能力。Pilot可以将路由规则下发到各个Envoy sidecars中,从而通过Envoy sidecars控制系统路由。并且,Pilot公开了用于服务发现、负载均衡池和路由表的动态更新的 API。这些API将Envoy从平台特有的细微差别中解脱出来,简化了设计并提升了跨平台的可移植性。
- Mixer负责在服务网格上执行访问控制和使用策略,并从Envoy代理和其他服务收集遥测数据。代理提取请求级属性,发送到Mixer进行评估。Mixer包含一个灵活的插件模型,使Istio能够接入到各种主机环境和基础设施后端,从这些细节中抽象出Envoy代理和Istio管理的服务。
- Citadel通过内置身份和证书管理,提供强大的服务间认证和终端用户认证。通过Citadel可以升级服务网格中的未加密流量,并为运维人员提供基于服务身份而不是网络控制来强制执行策略的能力。
- Istio使用Envoy代理的扩展版本,Envoy是用C++开发的高性能代理,在服务网格中控制所有服务的入站和出站流量。Istio利用了Envoy的许多内置功能:
- 动态服务发现
- 负载均衡
- TLS终止
- HTTP/2和gRPC代理
- 熔断器
- 健康检查
- 基于百分比流量拆分
- 故障注入
- 丰富指标
Istio的安装,启动和验证:
- 下载***的Istio安装文件,并且解压。
- 在环境变量PATH中追加,Istio的运行路径。
- 确保所需的镜像已经下载并部署在集群中的机器上,同时安装前需要保证机器已经安装好Docker 环境。并且保证部署文件istio.yaml 或istio-auth.yaml 中的镜像名和下载的镜像一致。
- 通过以下两种方式中任意一种方式启动istio。
启用sidecar 之间的TLS 双向认证(我们采用这种方式):
【运行命令】:kubectl apply -f install/kubernetes/istio-auth.yaml
不启用双向认证:
【运行命令】:kubectl apply -f install/kubernetes/istio.yaml
5. 安装验证
istio 启动成功后,其基本服务组件启动,包括istio-ingress、istio-mixer 和istio-pilot,查看一下已启动的istio 服务:
【运行命令】:kubectl get svc -n istio-system
确认一下对应的pod 已成功部署并且所有的容器都启动并运行:
【运行命令】:kubectl get pods -n istio-system
Isito服务网格的优势
伴随着微服务不断的发展,Istio服务网格的使用场景越来越多,通过Istio服务网格的接入,解决了下述各种问题。
- 随着公司业务的不断发展,公司内部原有大量的Web应用,在不想改造代码的前提下,想加入服务化大家庭,享受各种服务治理的能力。
- 随着新技术的不断涌现,加上公司业务的快速发展,公司内部不同的业务系统会根据不同的场景选择不同的语言进行业务开发,例如Node.js, Go等等。不同的语言都需要接入服务化大家庭,享受各种服务治理的能力。
- 随着业务的发展,微服务架构必然需要不断的升级,基于Istio架构的微服务,业务系统和微服务架构是解耦的,所以在微服务架构升级时,业务部门不需要做任何修正,从而减轻了业务部门的工作量。
- Istio在Pilot配置路由规则,然后将路由规则下发至Envoy,Envoy根据路由规则,可以在不修改应用程序的前提下实现应用的灰度发布,熔断,扩缩容,注入故障等功能。从而减轻了开发和运维的工作量。
- Istio通过Mixer的配置,可以在不修改应用的前提下,为服务添加白名单,ACL的检查,从而控制服务的访问。
- Istio的Citadel通过内置身份和证书管理,来保护服务之间的所有通信安全性,而不会对开发人员造成麻烦的证书管理负担。
Istio服务网格作为一个基础设施层,将微服务的治理完全从业务系统中独立出来了,业务开发人员从此可以完全的专注于业务系统的开发,不需要考虑微服务治理等方面的问题,极大的提高了业务开发人员的生产效率。同时由于Istio作为一个基础设施层,轻量级高性能网络代理,对应用透明,运维人员可以依靠统一的规则进行维护,从而也极大的提高了运维人员的生产效率。同时也降低了业务开发人员与运维人员的沟通成本。
Isito服务网格的不足
虽然istio 降低了应用服务与服务治理之间的耦合度,让用户能够将主要精力放在具体的业务功能实现上,而不需要过多的考虑服务治理(如流量控制、负载均衡、故障处理等)方面的问题,提高了开发效率,并且Istio通过高度的抽象和良好的设计采用一致的方式解决了灰度发布的问题,通过Pilot下发路由,然后Envoy对流量进行了转发,极大的提高了运维的生产性。
但是Istio还是存在一个极大的痛点,即高并发访问时吞吐量不能够达到苏宁大促的需求。利用上图的模型对Istio进行了压力测试,来验证Istio的吞吐量和稳定性。在高并发的情况下Istio顶住了压力,***的保证了访问的正确性,没有发生任何丢包,请求失败,路由混乱的错误。
但是Istio吞吐量并不是很理想,服务间以HTTP 方式访问时吞吐量尤其低下,服务间以GRPC 方式访问时性能虽有提升,但是还是不能够完全满足苏宁大促期间的高并发量的要求。Istio 在微服务治理方面所展现的功能特性和灵活性使得Istio的魅力格外亮眼,目前Istio也是开源社区活跃性居于前列的开源项目,苏宁也会继续为Istio的发展贡献一份力量。相信在不久的将来,Istio 在吞吐量上的痛点能够得到突破,达到苏宁大促的需求。
Isito服务网格的引进
目前苏宁为了适应新技术的发展和提高资源的利用率,正在大力推进公司内部的系统从虚拟机向Kubernetes + Docker的架构化转换。通过Kubernetes + Docker的引入,为Istio提供了所需的基础架构。
因此我们将以此为契机加快在苏宁内部推进Istio系统,先在非大促的系统中进行推广,在社区和我们共同努力下,当性能能够满足大促需求时,再将Istio系统推广到大促系统,从而将全公司全部的系统都纳入到Istio的管理中。通过Istio的接入,集团内部的所有服务在不需要做任何修改的前提下,可以享受各种服务治理的能力。并且通过Istio的推进,在提高集团的开发运维效率的同时,降低了业务上线时发生错误的概率。
【参考文献】
[1] https://istio.io/docs/reference/
作者:林正国,苏宁易购IT总部数据云公司中间件研发中心高级技术经理,一直从事基础中间件的研发工作,拥有着10余年的中间件研发经验。目前主要负责苏宁基础中间件的开发和维护。深知基础中间件的稳定对电商平台的重要性,正在为不断提升苏宁中间件的稳定性和高效性而奋斗。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】