Istio介绍
架构
Istio 服务网格从逻辑上分为数据平面和控制平面:
- 数据平面:有代理(Envoy)组成,以sidecar方式部署在用户业务pod中,共享pod的网络命名空间,通过iptables redirect的方式将原本进入用户容器的流量转发Envoy 代理;Envoy代理负责控制服务间网络通信
- 控制平面:按需制定流量规则,并下发给代理来实现对流量的控制
Envoy
Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理,负责协调服务网格中所有服务的入站和出站流量
在Istio系统中,Envoy为数据面组件被部署为服务的sidecar,为服务增加了很多内置特性:
- 动态服务发现
- 负载均衡
- TLS 终端
- HTTP/2 与 gRPC 代理
- 熔断器
- 健康检查
- 基于百分比流量分割的分阶段发布
- 故障注入
- 丰富的指标
Pilot
Pilot 组件对服务发现机制进行抽象并分离出抽象模型(Abstract model),通过adapter的方式实现对不同平台(例如:kubernetes,spring eureka,CloudFoundry等)的服务发现功能
同时 Pilot 将服务发现获取到的信息(例如:服务的名称,域名,IP,Endpints等)进行整合处理,通过Envoy API将信息下发给 Envoy,即为Envoy实现服务发现和流量管理提供服务元数据
Mixer
Mixer 负责控制策略及采集监控数据,Mixer适配器支持多种后端服务类型如日志服务,配额服务,认证服务,监控服务等;(在Istio 1.5 版本已废弃)
Citadel
Citadel 通过内置的身份和证书管理,可以支持强大的服务到服务以及最终用户的身份验证。您可以使用 Citadel 来升级服务网格中的未加密流量
Galley
Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来
备注: 在Istio1.5 版本中对Istio架构进行重建,控制平面将使用新的部署模式Istiod,将原有的各个组件整合在一起负责处理配置、证书分发、sidecar 注入等各种功能 参考链接
概念
VirtualService
服务访问路由控制,对满足特定匹配条件的请求进行控制,包括
指定路由目标服务
请求重写
请求重试:提高服务可用性,当请求失败时,Istio默认会重试两次请求
请求超时:默认HTTP超时时间为15秒,Istio支持在不修改代码的情况下,根据实际需要来配置不同服务的请求超时时间
故障注入: 用于验证Istio的故障恢复策略,可在应用层测试多种异常如:http错误码,请求延迟,请求中断等
Istio使用的端口地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| Chain PREROUTING (policy ACCEPT 120K packets, 7172K bytes pkts bytes target prot opt in out source destination 120K 7173K ISTIO_INBOUND tcp -- * * 0.0.0.0/0 0.0.0.0/0 Chain INPUT (policy ACCEPT 120K packets, 7173K bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 122K packets, 11M bytes) pkts bytes target prot opt in out source destination 12320 739K ISTIO_OUTPUT tcp -- * * 0.0.0.0/0 0.0.0.0/0 Chain POSTROUTING (policy ACCEPT 122K packets, 11M bytes) pkts bytes target prot opt in out source destination Chain ISTIO_INBOUND (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 120 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15090 120K 7172K RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15021 0 0 RETURN tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:15020 8 480 ISTIO_IN_REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 Chain ISTIO_IN_REDIRECT (3 references) pkts bytes target prot opt in out source destination 8 480 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 redir ports 15006 Chain ISTIO_OUTPUT (1 references) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * lo 127.0.0.6 0.0.0.0/0 0 0 ISTIO_IN_REDIRECT all -- * lo 0.0.0.0/0 !127.0.0.1 owner UID match 1337 0 0 RETURN all -- * lo 0.0.0.0/0 0.0.0.0/0 ! owner UID match 1337 12320 739K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 owner UID match 1337 0 0 ISTIO_IN_REDIRECT all -- * lo 0.0.0.0/0 !127.0.0.1 owner GID match 1337 0 0 RETURN all -- * lo 0.0.0.0/0 0.0.0.0/0 ! owner GID match 1337 0 0 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 owner GID match 1337 0 0 RETURN all -- * * 0.0.0.0/0 127.0.0.1 0 0 ISTIO_REDIRECT all -- * * 0.0.0.0/0 0.0.0.0/0 Chain ISTIO_REDIRECT (1 references) pkts bytes target prot opt in out source destination 0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 redir ports 15001
|
DestinationRule
- 负载均衡策略,支持轮询,最小连接数等负载策略,可根据服务版本子集单独配置负载策略
- 熔断控制,当节点的请求并发数据或者请求失败次数超过阈值后,则流量不再发往异常的节点
- 设置服务版本子集,根据服务deploy中的version标签定义服务版本子集
Gateway
- 使用Gateway来设置网格中入站和出站流量开放方式如:域名,端口,入站协议等信息
- Istio中提供了两个预先配置好的网关 istio-ingressgateway 和 istio-egreesagteway 分别控制入站和出站的网络流量
ServiceEntry
- 使用ServiceEntry来添加一个入口到 Istio 内部维护的服务注册中心,添加了服务入口后,Envoy代理可以向服务发送流量,就好像它是网格内部的服务一样
- 默认当网格内的服务访问网格外的服务的流量是不受istio控制的,如果希望使用istio的特性控制访问网格外的服务的流量,那么就需要使用ServiceEntry将这个外部服务注册到服务网格中