Istio架构概览

Istio工作机制

Istio主要架构分为控制面和数据面两部分。

数据面: Envoy
控制面: PilotMixerCitadel

工作机制

  1. 自动注入: k8s中,当有pod创建时候,调用sidecar-injector服务,修改程序描述信息,注入sidecar。主要就是envoy。
  2. 流量拦截:在pod中用iptables拦截容器的流量
  3. 服务发现: Envoy调用Pilot的服务发现接口获取目标服务的实例列表
  4. 负载均衡: 服务发起方的Envoy根据负载均衡策略选择服务实例
  5. 流量治理: Envoy从Pilot获取流量规则,将流量转发到对应的服务上。
  6. 访问安全: Envoy之间的通讯进行双向认证和通道加密,并基于服务的身份授权管理。其中证书和密钥主要由Citadel组件维护
  7. 服务遥测: 服务通讯期间,双方的Envoy都会向Mixer组件上报访问数据。
  8. 策略执行: 可以用Mixer控制服务间的访问
  9. 外部访问: 在网格的入口有一个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 表示这个服务 实例归属的服务。

istio的主要组件

kubectl get svc -n istio-system 可以查看完整组件列表

istio-pilot

pilot领航员的意思,顾名思义,是istio的控制中枢,向数据平面下发规则。

包括 VirtualServiceDestinationRuleGatewayServiceEntry等一系列的流量治理规则。将规则转换成Envoy规则,通过xDS协议发送给Envoy。Envoy平时通过gRPC流式订阅Pilot的配置资源。

istio-telemetry

Mixer服务组件之一,专门收集遥测数据。服务间交互时,两边的Envoy均会将遥测数据上报给该组件。

istio-policy

Mixer服务组件之一,机制和流程同telemetry。 作用主要是服务间调用时,两边Envoy均会请求istio-policy来检查接口是否允许访问。

istio-citadel

citadel是城堡,象征着安全。是istio平时容易忽视但是又很重要的组件。负责自动生成、分发、轮换、撤销密钥和证书。它会监听apiserver,以secret形式为每个服务生成证书,并在pod创建时挂载到创建的pod上。可以建立双向TLS通道。

istio-galley

galley是战舰。负责配置管理,验证配置信息格式和正确性。并提供这些配置给Pilot和Mixer使用。

istio-sidecar-injector

负责注入组件。只要开启了自动注入。它会监听apiserver,当有Pod创建的时候,讲sidecar容器 istio-proxy(Envoy)注入到原来Pod中,并修改iptables来将请求都经过Envoy。

istio-proxy

istio中的轻量数据代理,默认是用Envoy实现。istio-proxy容器中除了有Envoy,还有pilot-agent的守护进程。

istio-ingressgateway

入口网关。外部访问内部服务都经过它。是一个LoadBalance类型的Service

其它组件

除了以“ istio” 为前缀的以上几个 Istio 自有的组件,在集群中一般还安装 Jaeger- agent、 Jaeger- collector、 Jaeger- query、 Kiali、 Prometheus、 Tracing、Zipkin 组件,这些组件提供了 Istio 的调用链、 监控等功能,可以选择安装来完成完整的服务监控管理功能。

关注公众号 尹安灿