1 Istio的工作机制
- 控制面
- Pilot
- Mixer
- Citadel
- 数据面
- Envoy
2 Istio的服务模型
2.1 服务
定义:K8S中的serivce只要满足Istio的约束即可转换为Istio的service并配置规则进行流量治理
约束1:端口命名,且必须是[-]的格式。
- protocol:可以是tcp、http、http2、https、grpc、tls、mongo、mysql、redis等
- 如果端口命名没有基于以上格式,则端口流量会被当做TCP流量处理
约束2:服务关联,pod需要关联到serivce,如果一个pod属于多个service,那么service不能再同一个端口上使用不同的协议。
- 在Istio0.8后,一个pod只能属于一个service
约束3:deployment必须显示包含app和version标签
- app标签用于分布式追踪时补齐上下文信息
- version标签用于遥测数据补齐上下文信息
2.2 服务版本
定义:将一个service关联到多个deployment,每个deployment对应一个服务的版本,实现灰度发布
[本身K8s并不支持灰度发布。但是K8s 可以通过暂停滚动升级实现金丝雀发布,分流小部分流量,等发布一段时间后没有问题再继续滚动升级。但是因为暂停滚动发布无法在一个确切的位置暂停,所以单纯使用K8s进行金丝雀发布,最好还是使用两个不同的deployment,并同时调整它们pod的数量。]
- 保证app标签和service的标签选择器一致,确保service能关联到领两个不同的deployment的pod
- 使用的镜像不同,version标签不同,意味着服务的不同版本,进而可以执行不同的路由规则
2.3 服务实例
定义:真正处理服务请求的后端
- Endpoint
- Service
- Labels
- AvailabilityZone
- ServiceAccount
3 Istio的主要组件
3.1 Istio-pilot
- 服务发现
- 向Envoy下发规则
- 流量治理
- 认证授权
3.2 Istio-telemetry
收集遥测数据的Mixer服务组件
3.3 Istio-policy
Envoy在转发服务的请求前调用Check接口检查是否允许访问
- 配额
- 授权
- 白名单
3.4 Istio-citadel
提供自动生成、分发、轮换与撤销秘钥和证书功能
- 以secret形式存放证书秘钥
- 在pod创建时挂载到pod上
- 实现双向TLS认证、通道加密、访问授权等安全功能
3.5 Istio-galley
- 负责配置管理的组件,验证配置信息的格式和内容的正确性
- 将配置信息提供给Pilot和Mixer服务使用
3.6 Istio-sidecar-injector
自动注入组件,开启后在pod创建时会自动调用在pod中注入sidecar容器
3.7 Istio-proxy
sidecar容器的正式名字
- Envoy
- pilot-agent守护进程
3.8 Istio-ingressgateway
从服务网格外访问服务网格内必须经过这个gateway
3.9 其他组件
服务监控管理
- Jaeger-agent
- Jaeger-conllector
- Jaeger-quer
- Kiali
- Prometheus
- Tracing
- Zipkin