Istio架构概览
Istio工作机制
Istio主要架构分为控制面和数据面两部分。
数据面: Envoy
控制面: Pilot
、Mixer
、Citadel
工作机制
- 自动注入: k8s中,当有pod创建时候,调用sidecar-injector服务,修改程序描述信息,注入sidecar。主要就是envoy。
- 流量拦截:在pod中用iptables拦截容器的流量
- 服务发现: Envoy调用Pilot的服务发现接口获取目标服务的实例列表
- 负载均衡: 服务发起方的Envoy根据负载均衡策略选择服务实例
- 流量治理: Envoy从Pilot获取流量规则,将流量转发到对应的服务上。
- 访问安全: Envoy之间的通讯进行双向认证和通道加密,并基于服务的身份授权管理。其中证书和密钥主要由Citadel组件维护
- 服务遥测: 服务通讯期间,双方的Envoy都会向Mixer组件上报访问数据。
- 策略执行: 可以用Mixer控制服务间的访问
- 外部访问: 在网格的入口有一个Envoy扮演入口网关的角色。
服务模型
由istio服务、服务版本、服务实例几个对象构成
服务模型约束
- 端口命名:
name: <protocol>[-<suffix>],协议支持常用的服务协议,如mysql、redis,如无指定,默认为tcp协议
- 服务关联:
pod需要关联到服务
- deployment使用app和version标签:
区分版本
istio服务
k8s只要满足上文提到的服务模型约束,就可以转为 istio 的服务并配置规则进行流量治理。如最小的k8s模型加上端口命名
k8s主体是 workload,istio 的对象主体是 service,没有访问方式的workload 不是 istio 治理对象。Kubernetes 的 Service 定义 就是 Istio 服务 的 元 数据。
istio服务版本
通过deployment的app: service-name
来关联服务。 通过version: v<version>
标签来区分服务不同版本。 可以根据这个实现灰度发布等功能。
istio服务实例
Istio 的 ServiceInstance 主要包括 Endpoint、 Service、 Labels、 AvailabilityZone 和 ServiceAccount 等属性, Endpoint 是其中最主要 的属性,表示这个实例对应的网络后端( ip: port), Service 表示这个服务 实例归属的服务。