Istio服务网格 为忙碌人士而生
我最近为Istio做出了一个小奉献,Istio 是一个开源服务网格名目。我的奉献包括为 Istio CLI 的一个命令参与了一些测试。假设你想检查具体消息,可以在此处找到 pull 恳求。这不是一个渺小的扭转,但它是一个很棒的学习体验。在 Istio 上上班协助我更深化地理解了服务网格。我很快乐能做出更多奉献。在这篇文章中,我将解释什么是 Istio,它为什么有用以及它是如何上班的。
译自The Istio Service Mesh for People Who Have Stuff to Do | Blog,作者 Luca Cavallin。
从实质上讲,Istio 是一个服务网格。服务网格控制微服务之间的通讯,担任处置诸如路由流量、包全通讯和提供可观测性等事项。随着微服务数量的增长,控制这些交互会变得很复杂。Istio 智能口头许多这些义务,因此你可以专一于构建运行程序,而不是控制服务之间的通讯。
为什么要经常使用 Istio?
随着架构变得越来越复杂,你将面临新的应战。服务须要以牢靠、安保和高效的形式启动通讯。Istio 协助你在三个关键畛域做到这一点:
这三个畛域——流量控制、安保性和可观测性——是运转肥壮微服务架构的关键,Istio 可以轻松地处置它们。
经常使用 Istio 控制流量
Istio 的关键性能之一是控制服务之间的流量。在微服务设置中,你或许有多个版本的同一个服务同时运转。例如,你或许正在测试支付服务的最新版本,并宿愿将大局部流量发送到版本 1,但将一些流量路由到版本 2。
以下是如何经常使用 Istio 将流量拆分到服务的两个版本之间的示例:
apiVersion: networkingistioiov1alpha3kind: VirtualServicemetadata:name: paymentsspec:hosts: paymentsmyappcomhttp: route: destination:host: paymentssubset: v1weight: destination:host: paymentssubset: v2weight:
在这个例子中:
这关于金丝雀部署十分有用,在金丝雀部署中,你可以经常使用一小局部用户测试新性能,而后再齐全推出。
Envoy 代理和 Sidecar 容器
Istio 的数据平面依赖于Envoy 代理,Envoy 代理是一个第 7 层代理,它控制服务之间一切流量。网格中的每个服务都有自己的Sidecar 代理,它位于服务旁边,并控制其一切入站和出站流量。
Envoy 准许你运行流量战略,例如重试、超时和断路器,一切这些都无需更改运行程序代码。它还搜集无关流量流的具体目的,有助于监控和调试。
因为 Envoy 作为Sidecar 容器运转,因此它可以在不搅扰运行程序逻辑的状况下口头这些规定并搜集数据。简而言之,Envoy 充任服务网格中一切通讯的“交通警察”。
可观测性:了解系统中出现的事件
运转一个蕴含许多微服务的系统或许会让你难以了解正在出现的事件。Istio 的内置可观测性性能可以协助你跟踪服务之间一切通讯的目的、日志和跟踪。这关于监控系统的运转状况、发现性能疑问和修复失误至关关键。
Istio 的可观测性工具可以让你分明地了解系统的上班形式。你可以及早发现疑问,并使你的服务运转得愈加顺畅。
安保:启用 mTLS 和访问控制
安保是控制微服务时的一大疑问。Istio 使实施双向 TLS (mTLS)变得容易,双向 TLS (mTLS) 会加密服务之间的一切通讯,并确保服务在替换数据之前相互验证身份。
Istio 还准许您设置访问控制战略,以指定哪些服务可以启动通讯。这有助于限度哪些服务可以交互,从而缩小系统的攻打面。
以下是一个 Istio 战略示例,该战略仅准许billing服务与payments服务通讯:
apiVersion: securityistioiov1beta1kind: AuthorizationPolicymetadata:name: paymentsbillingspec:selector:matchLabels:app: paymentsrules: : source:principals:
在此战略中:
此战略限度除billing服务之外的一切服务访问payments服务,从而增强了微服务的安保性。
什么是 SPIFFE?
Istio 经常使用SPIFFE(安保消费身份框架,面向一切人)来控制服务身份。SPIFFE 提供了一种为服务调配安保、可验证身份的方法。网格中的每个服务都会取得一个SPIFFE 可验证身份文档 (SVID),该文档与 mTLS 一同经常使用以确保安保通讯。此身份系统是 Istio 安保模型的基础。
Istio 中的网络
微服务中的网络或许很艰巨,尤其是在控制网分内部和外部的流量时。Istio 提供了几种控制网络流量的工具:
性能示例:网关、服务条目、虚构服务和目的规定
假定您在网格中有一个 API 主机,它经过负载平衡器接纳来自互联网的流量。以下是如何性能网关、服务条目、虚构服务和目的规定来处置此流量。
网关性能
apiVersion: networkingistioiov1alpha3kind: Gatewaymetadata:name: apigatewayspec:selector:istio: ingressgatewayservers: port:number: name: httpprotocol: HTTPhosts:
这里出现了什么?网关在端口 80上监听来自域api.myapp.com的 HTTP 流量。selector字段将此网关衔接到Istio 入口网关,该网关处置进入网格的流量。
服务条目性能
假定您的 API 主机须要调用外部身份验证服务。以下是如何性能服务条目:
apiVersion: networkingistioiov1alpha3kind: ServiceEntrymetadata:name: authserviceentryspec:hosts: location: MESH_EXTERNALports: number: name: httpsprotocol: HTTPSresolution: DNSendpoints: address:
这里出现了什么?服务条目通知 Istio 如何将流量路由到外部服务 (auth.external-service.com),该服务在端口 443(HTTPS)上运转。location: MESH_EXTERNAL批示此服务存在于 Istio 服务网格之外。endpoints字段蕴含外部服务的 IP 地址,准许网格内的 API 主机发送恳求。
虚构服务性能
以下是如何在网格内路由流量:
apiVersion: networkingistioiov1alpha3kind: VirtualServicemetadata:name: apivirtualservicespec:hosts: gateways: apigatewayhttp: : uri:prefix: route: destination:host: apiservicesubset: stable
这里出现了什么?虚构服务定义了流量路由规定。在这种状况下,经过api-gateway抵达api.myapp.com/v1的流量将路由到网格中的api-service。subset: stable指的是api-service的特定版本(您可以领有同一服务的多个版本)。
目的规定性能
最后,以下是一个目的规定,用于运行负载平衡和 mTLS:
apiVersion: networkingistioiov1alpha3kind: DestinationRulemetadata:name: apidestinationspec:host: apiservicetrafficPolicy:loadBalancer:: ROUND_ROBINtls:: ISTIO_MUTUAL
这里出现了什么?目的规定将战略运行于路由到api-service的流量。它经常使用轮询负载平衡将恳求平均地散布到实例中。mTLS经过tls.mode: ISTIO_MUTUAL启用,确保服务之间加密通讯。
弹性:经常使用重试、超时和断路器处置缺点
在散布式系统中,缺点是无法防止的。服务或许会宕机,网络或许会变慢,或许用户或许会遇到提前。Istio 可以协助您经常使用重试、超时和断路器来处置这些疑问。
以下是如何在 Istio 中性能重试和超时的示例:
apiVersion: networkingistioiov1alpha3kind: VirtualServicemetadata:name: myservicespec:hosts: myservicehttp: route: destination:host: myserviceretries:attempts: perTryTimeout: stimeout: s
这里出现了什么?假设对my-service的恳求失败,Istio 将最多重试该恳求3 次。每次重试尝试都有2 秒的限度。恳求的总准许时期为5 秒。在此之后,Istio 将中止期待照应。
关于断路,您可以经常使用相似这样的目的规定:
apiVersion: networkingistioiov1alpha3kind: DestinationRulemetadata:name: myservicespec:host: myservicetrafficPolicy:connectionPool:tcp:maxConnections: http:http1MaxPendingRequests: outlierDetection:consecutive5xxErrors: : sbaseEjectionTime: smaxEjectionPercent:
这里出现了什么?假设my-service在10 秒内前往两个延续的 5xx 失误,Istio 将中止向其发送流量。该服务将从负载平衡池中剔除30 秒,而后从新思索。
总结
Istio 是一个弱小的工具,它简化了微服务的流量控制、安保性和可观测性。为 Istio 做奉献让我了解了它如何协助处置运转散布式系统时遇到的一些复杂应战。
假设您正在运转微服务架构或方案启动裁减,Istio 可以协助您使系统更具弹性和更易于控制。假设您有任何疑问或想了解更多关于 Istio 的消息,请随时咨询我,我很乐意分享我的阅历。