Istio是目前最热门的服务网格(Service Mesh)实现之一由GoogleIBM和,Lyft联合开发2017年5月开源2018年7月发布了1.0版本正式生产可用。
随着微服务架构的普及服务数量越来越多服务之间,的通信越来越复杂传统的服务治理方式(在应用代码里做负载均衡熔断限流等等)已经难以满足需求,因为不同语言的服务需要各自实现一套维护成本高升级困难。
服务网格(Service Mesh)应运而生它把服务治理的功能从应用代码中抽离出来放到一个独立的代理层(Sidecar)应用只需要关注业务逻辑服务治理由服务网格统一处理和语言无关和应用解耦。
Istio是服务网格的主流实现功能丰富生态完善,但是架构也比较复杂在高可用高并发场景下设计和部署需要注意很多问题。
本文深入探讨了Istio服务网格的架构设计以及如何在高可用高并发场景下设计和,部署Istio。
一、Istio整体架构
Istio的架构分为两个部分:控制平面(Control Plane)和,数据平面(Data Plane)。
数据平面:
数据平面由一系列Sidecar代理组成每个服务实例旁边都部署一个Sidecar代理(Envoy)服务之间,的所有通信都通过Sidecar代理转发Sidecar负责服务发现负载均衡熔断限流重试安全可观测性等等服务治理功能。
应用代码不需要做任何修改只需要把流量指向Sidecar就能享受服务网格的所有功能和,语言无关非常方便。
控制平面:
控制平面负责管理和配置数据平面的所有Sidecar代理让它们按照预期的规则工作。控制平面不直接处理任何业务流量只负责管理和配置。
Istio 1.0的控制平面包括几个组件:
- Pilot:负责流量管理把用户配置的路由规则转换为Envoy能理解的配置分发给所有Sidecar。Pilot也负责服务发现从Kubernetes或者其他服务注册中心获取服务实例信息分发给Sidecar。
- Mixer:负责策略执行和遥测数据收集。Sidecar在处理请求的时候,会调用Mixer检查是否允许请求通过(策略执行)以及上报遥测数据(指标日志追踪等等)。Mixer是可插拔的能对接不同的后端,比如PrometheusStackdriver等等。
- Citadel:负责安全和身份认证管理证书的签发和轮换为服务之间,的通信提供mTLS(双向TLS)加密和认证确保服务之间,的通信安全可信。
- Galley:负责配置管理验证用户提交的配置是否正确把配置分发给其他控制平面组件。Galley在1.0中还是实验性的功能后续版本会逐渐完善。
这就是Istio的整体架构控制平面管理配置数据平面处理流量分工明确解耦彻底。
二、高可用架构设计
在生产环境使用Istio高可用是必须考虑的问题控制平面和,数据平面都要做到高可用不能有单点故障。
控制平面高可用:
控制平面的组件(PilotMixerCitadelGalley)都应该部署多个实例做高可用避免单点故障。
- Pilot高可用:Pilot是无状态的可以部署多个实例前面用Kubernetes Service做负载均衡多个Pilot实例,同时工作分发配置给Sidecar。Pilot的状态都存在Kubernetes API Server里,所以无状态能随意扩容。
- Mixer高可用:Mixer也是无状态的可以部署多个实例前面用Service负载均衡。Mixer处理策略检查和遥测上报请求量大需要根据流量扩容多个实例避免成为瓶颈。
- Citadel高可用:Citadel负责证书管理也是无状态的(证书存在,Kubernetes Secret里)可以部署多个实例做高可用。Citadel的请求量不大一般2个实例就够了。
- Galley高可用:Galley也是无状态的可以部署多个实例。
控制平面的组件都是无状态的能方便地扩容和高可用这是Istio架构的一个优点。
数据平面高可用:
数据平面的Sidecar(Envoy)是和应用一起部署的每个应用实例都有一个Sidecar所以数据平面的高可用和,应用的高可用是一致的应用部署多个实例Sidecar也就有多个实例自然高可用。
但是需要注意Sidecar本身的稳定性Envoy是用C++写的性能好稳定,但是也可能出现崩溃的情况需要配置健康检查和自动重启确保Sidecar崩溃后能自动恢复。
另外Sidecar是应用流量的必经之路,如果Sidecar出问题应用的通信就会受影响,所以需要确保Sidecar的资源足够(CPU内存)不会,因为资源不足而崩溃,或者变慢。
控制平面和数据平面解耦:
Istio的一个重要设计是控制平面和数据平面解耦控制平面出问题不会影响数据平面的正常工作。
如果控制平面(PilotMixerCitadel等等)全部挂了Sidecar还能继续工作用最后一次收到的配置处理流量只是不能更新配置了也不能上报遥测数据了,但是业务流量不受影响这是非常重要的设计确保了控制平面的故障不会影响业务。
当然,如果Mixer挂了策略检查可能会受影响默认配置下Mixer不可用的话Sidecar会fail open(允许请求通过)不会拒绝请求确保业务不受影响这个默认配置是合理的优先保证可用性。
三、高并发架构设计
在高并发场景下Istio的性能是一个需要重点关注的问题,因为Sidecar会增加网络延迟和资源消耗Mixer也可能成为瓶颈。
Sidecar性能优化:
Sidecar(Envoy)是数据平面的核心每个请求都要经过Sidecar转发,所以Sidecar的性能直接影响整个系统的性能。
- 资源配置:给Sidecar分配足够的CPU和内存避免资源不足导致延迟增加,或者崩溃。一般每个Sidecar至少分配0.1 CPU和128MB内存高并发场景需要更多,比如0.5 CPU和512MB内存根据实际流量调整。
- 连接池配置:配置合适的连接池参数,比如最大连接数连接超时等等避免连接数过多,或者过少影响性能。Envoy支持TCP和HTTP连接池配置需要根据业务场景调整。
- 并发配置:配置Envoy的worker数量一般和,CPU核数一致充分利用多核CPU提高并发处理能力。
- 关闭不需要的功能:如果不需要某些功能,比如遥测策略检查等等可以关闭减少Sidecar的开销提高性能。比如,如果不需要Mixer遥测可以关闭Sidecar上报遥测的功能减少Sidecar和Mixer的交互降低延迟。
Mixer性能优化:
Mixer是控制平面中最容易成为瓶颈的组件,因为每个请求Sidecar都会调用Mixer做策略检查和遥测上报请求量非常大。
- 扩容Mixer:部署多个Mixer实例根据流量自动扩容用Kubernetes HPA(Horizontal Pod Autoscaler)根据CPU使用率,或者自定义指标自动扩容Mixer实例数量避免Mixer成为瓶颈。
- 本地缓存:Mixer支持本地缓存策略检查的结果相同的请求不用每次都调用后端直接用缓存的结果减少后端调用提高性能。
- 批量上报:遥测数据不用每个请求都实时上报可以批量上报攒一批再上报减少Mixer和,后端的交互次数提高性能。
- 关闭不需要的适配器:Mixer支持很多适配器(PrometheusStackdriverLogging等等)如果不需要某些适配器可以关闭减少Mixer的开销。
- Sidecar侧缓存:Sidecar也能缓存Mixer的策略检查结果相同的请求不用每次都调用Mixer直接用缓存的结果减少Sidecar和Mixer的交互降低延迟。
延迟优化:
Sidecar会增加网络延迟,因为请求要多经过一跳(应用 -> Sidecar -> 目标Sidecar -> 目标应用)一般会增加几毫秒到几十毫秒的延迟对延迟敏感的业务需要优化。
- 同机房优先:配置路由规则让请求优先转发到同机房的服务实例减少网络延迟避免跨机房调用。
- 就近接入:用Istio的负载均衡配置让请求转发到最近的服务实例减少网络延迟。
- 连接复用:配置HTTP/2连接复用减少连接建立的开销降低延迟。
- 减少Mixer调用:如果对延迟要求很高可以关闭Mixer的策略检查和遥测上报,或者用Sidecar本地缓存减少Mixer调用降低延迟。
四、流量管理设计
Istio的流量管理功能非常强大支持动态路由负载均衡熔断限流重试故障注入等等在,高可用高并发场景下合理配置流量管理规则非常重要。
动态路由:
Istio支持根据各种条件(URLHeaderCookie用户等等)动态路由请求到不同的服务版本,或者服务实例。
比如灰度发布(金丝雀发布)可以把10%的流量转发到新版本90%的流量还在旧版本观察新版本没有,问题再逐步扩大流量比例直到全量发布出了问题也能快速切回旧版本影响小。
负载均衡:
Istio支持多种负载均衡算法轮询随机最少连接一致性哈希等等可以根据业务场景选择合适的算法。
比如有状态的服务(需要会话保持)可以用一致性哈希负载均衡让同一个用户的请求总是,转发到同一个服务实例避免会话丢失。无状态的服务可以用轮询,或者最少连接负载均衡让请求均匀分布。
熔断:
熔断是高可用的重要手段当某个服务实例出现故障(响应慢错误率高)熔断机制会自动把这个实例从负载均衡池中移除不再转发请求给它避免故障扩散影响整个系统。
Istio支持配置熔断规则,比如连续5个请求失败就熔断这个实例30秒后再尝试恢复等等需要根据业务场景配置合适的参数。
限流:
限流是高并发场景下保护系统的重要手段当请求量超过系统能承受的上限限流机制会拒绝多余的请求避免系统被打垮。
Istio支持配置限流规则可以按服务按用户按IP等等维度限流,比如每个用户每秒最多100个请求超过就拒绝等等。
重试:
重试是提高可用性的手段当请求失败(网络抖动临时故障)自动重试请求提高成功率。
但是重试也不能滥用,否则可能会放大故障(下游已经挂了还不断重试打垮下游)需要配置合理的重试次数和重试条件,比如只对网络错误和5xx错误重试最多重试3次每次间隔1秒等等。
故障注入:
故障注入是测试系统韧性的手段可以主动注入故障(延迟错误等等)测试系统在,故障下的表现确保熔断限流重试等机制正常工作。
Istio支持配置故障注入规则,比如给某个服务注入5秒延迟,或者50%的错误率测试上游服务的容错能力等等在上线前做故障注入测试能提高系统的韧性。
五、安全设计
Istio提供了强大的安全功能mTLS认证授权等等在生产环境安全是必须考虑的。
mTLS双向认证:
Istio支持服务之间,的mTLS(双向TLS)认证和加密确保服务之间,的通信安全可信防止中间人攻击和未授权访问。
mTLS由Citadel负责证书管理自动为每个服务签发证书自动轮换不需要应用代码做任何修改Sidecar自动处理TLS握手和,加密解密应用只需要发明文请求Sidecar自动加密转发对应用透明。
mTLS有三种模式:
- STRICT:严格模式只接受mTLS加密的请求明文请求会被拒绝安全性最高。
- PERMISSIVE:宽容模式,同时接受mTLS和明文请求方便逐步迁移到mTLS安全性较低。
- DISABLE:关闭mTLS所有请求都是明文没有安全性。
生产环境建议用STRICT模式确保所有服务之间,的通信都加密认证。
认证和授权:
Istio支持基于JWT的认证和基于RBAC的授权可以控制谁能访问哪个服务哪个接口确保,只有授权的用户,或者服务能访问。
比如可以配置,只有登录用户能访问某个接口,只有管理员能访问管理接口,只有某个服务能调用另一个服务等等细粒度的访问控制。
六、可观测性设计
Istio提供了强大的可观测性功能指标日志分布式追踪等等能帮我们了解系统的运行状态排查问题。
指标:
Istio自动收集服务的请求指标请求量错误率延迟(P50P90P99等等)可以对接Prometheus存储用Grafana展示监控系统的运行状态设置告警及时发现问题。
日志:
Istio自动收集服务的访问日志包括请求方法URL状态码延迟来源目标等等可以对接Elasticsearch或者,Stackdriver存储和查询方便排查问题。
分布式追踪:
Istio自动注入追踪Header(Zipkin/B3格式)支持分布式追踪可以对接Jaeger或者Zipkin查看请求在各个服务之间,的调用链和耗时方便排查性能瓶颈和错误。
需要注意的是Istio只能自动传递追踪Header不能自动在应用代码里创建Span应用需要自己集成追踪客户端(比如Jaeger客户端)创建Span才能看到完整的调用链Istio的Sidecar会自动创建网络层面的Span但是应用内部的调用需要应用自己埋点。
七、部署最佳实践
在生产环境部署Istio有一些最佳实践需要注意。
- 逐步接入:不要一下子把所有服务都接入Istio先从非核心服务开始逐步接入验证稳定性和,性能没问题再接入核心服务降低风险。
- 资源预留:给Istio的组件(控制平面和Sidecar)预留足够的资源CPU内存避免资源不足导致性能问题,或者崩溃。
- 监控告警:部署Istio后要配置完善的监控和告警监控控制平面组件的状态Sidecar的状态请求指标错误率延迟等等及时发现和处理问题。
- 版本管理:Istio迭代快版本更新频繁升级的时候,要小心先在测试环境验证没问题再升级生产环境避免升级导致问题。
- 配置管理:Istio的配置(VirtualServiceDestinationRule等等)要版本控制放到Git里代码审查后再应用避免错误的配置影响生产。
- 故障演练:定期做故障演练(混沌工程)测试Istio和,系统的韧性确保熔断限流重试等机制正常工作提高系统的可用性。
八、写在最后
以上就是我对Istio服务网格架构设计的一些理解和总结包括整体架构高可用设计高并发设计流量管理安全可观测性以及部署最佳实践。
Istio是一个功能强大,但是架构复杂的系统在生产环境使用需要仔细设计和调优特别是高可用和高并发场景需要关注性能和稳定性避免Istio本身成为系统的瓶颈,或者单点故障。
但是Istio带来的好处也是明显的它把服务治理的功能从应用代码中抽离出来统一处理和语言无关和,应用解耦大大降低了微服务治理的复杂度提高了开发效率和系统的可观测性和安全性。
如果你正在考虑使用服务网格Istio是一个值得考虑的选择,但是建议先在测试环境充分验证了解它的架构和特性再逐步在生产环境使用不要盲目上生产。
最后用一句话结束这篇文章:"服务网格是微服务架构的下一个基础设施Istio是其中的佼佼者,但是强大也意味着复杂需要用心设计和调优才能发挥它的威力。"
愿大家都能用好Istio构建高可用高并发的微服务系统。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录