一、Istio的定义

Istio是一个与Kubernetes紧密配合的,服务网格形态的,用于云原生场景中服务治理的开放平台和基础设施

二、Istio特征

连接:对网络内部的服务之间的调用所产生的流量进行智能管理,并以此为基础,为微服务的部署、测试和升级等提供有力保障。

安全:为网格内部的服务之间的调用提供认证、加密和鉴权支持,在不侵入代码的情况下,加固现有服务,提高其安全性。

策略:Istio 通过可动态插拔、可扩展的策略实现访问控制、速率限制、配额管理等功能使得资源在消费者之间公平分配。

可观测性:Istio通过非侵入式为服务网格中所有的服务间访问和通信都生成详细的可观测性数据,还提供了调用链,指标监控和访问日志收集和输出的能力

流量管理:Istio通过集中配置的流量规则,控制服务间的流量和API调用,以非侵入的方式在单集群,多集群或虚拟机上提供服务粒度的负载均衡,会话保持,熔断,故障注入,超时,重试,重定向,故障转移等能力。并方便用户实现基于请求或者权重的灰度流量切分的控制。

三、Istio架构

Istio的架构,分为控制平面和数据平面两部分。

数据平面:由一组智能代理(【Envoy】)组成,被部署为sidecar。这些代理通过一个通用的策略和遥测中心传递和控制微服务之间的所有网络通信。

控制平面:管理并配置代理来进行流量路由。此外,控制平面配置Mixer来执行策略和收集遥测数据。

在Istio1.6中,上游为了简化控制面的部署和运维,将原来分离的Istio组件Pilot,Citadel,Mixer,Galley,Sidecar-Injector组件合并为单体应用Istiod

Istio深入学习 一   架构和组件_Istio

Istio深入学习 一   架构和组件_Istio_02

1.自动注入:创建应用程序时,自动注入Sidecar代理和Init容器,Kubernetes创建pod时,Kube-apiserver调用Istio的Sidecar-injector服务,自动修改应用程序的描述信息并注入SideCar代理和Init容器。用户无感知情况下,Sidecar容器内部的Envoy程序伴随着应用程序运行,对进出应用程序的流量进行透明的管理。

2.流量拦截:Istio默认通过注入Init容器进行iptables规则的设置,拦截进入容器的Inbound流量和从应用程序发出的Outbound流量。

3.服务发现:服务发起方的Envoy调用Istiod的服务发现接口,获取目标服务的实例列表。

4.负载均衡:服务发起方Envoy根据配置的负载均衡策略选择服务实例,并将请求分发到对应的目标服务实例上。

5.流量治理:Envoy从Istiod中获取配置的流量治理规则,在拦截到Inbound流量和Outbound流量执行治理逻辑。

6.访问安全:服务间访问时,Envoy可以进行双向认证和通道加密,并基于授权策略的配置对请求进行鉴权。

7.服务监控:服务间通信时,通信双方的Envoy根据请求的信息进行监控指标的统计,访问日志的收集和分布式调用链的埋点等。Istio通过标准的可观测接口各种不同的可观测性后端,接收相关的可观测性数据。

8.策略执行:Envoy原生支持访问限流,通过限流规则控制fronted到forecast的访问速率。

9.访问入口:在服务网格入口处,有一个Envoy扮演入口网关Ingress-gateway的角色。对fronted负载均衡和流量治理。

10.外部访问:出口网关统一接收和管理服务网格访问外部的流量。

Pilot提供服务发现和路由规则

Mixer策略控制,比如:对服务调用限速

Citadel:起安全作用,通信的证书和密钥,比如:可以保证服务跟服务通信安全

Envoy:代理服务的流量

前端Envoy向Pilot获取后台服务的负载均衡配置,然后根据Pilot路由规则,把流量分发给后台指定的版本上面,达到前端和后台的通信。为了保证通信安全,Envoy还需要从控制平面接到Citadel获取证书和密钥,确保Envoy通信安全。最后通信双方的Envoy都会连接到Mixer,上报访问的数据,Mixer达到控制数据,监控数据的目的。

四、Istio与Kubernetes 互相补充

Kubernetes提供的能力大都停留在四层的互访上,只是提供了一种机制能保证服务间可以互相发现,互相访问。但是对于服务化要求高的用户,缺失服务的熔断,限流,动态路由或者调用链埋点这些应用层的能力。无法基于应用层的请求负载均衡,更不会提供应用层的流量管理。

Istio能够提供微服务治理所需要的可观测性,服务韧性,灵活分流,弹性,安全等能力。

服务间访问时,Istio数据平面透明地拦截Pod的Inbound和Outbound流量,接管服务间访问的流量。服务网格数据面代理识别和解析各种应用层协议,根据控制面上该服务对应协议的配置,执行丰富的流量管理动作,包括Kubernetes上无法提供的面向请求的负载均衡,动态修改请求或者应答内容,注入故障、熔断限流,认证授权,调用链埋点,访问日志等可观测行数据收集等。

通过Istio的自动注入机制,在业务pod创建时,自动给指定的负载注入代理容器。基于这种机制,通过Kubernetes的滚动升级可以对服务网格数据面版本进行升级。

Istio的新版本基于Kubernetes CNI机制实现了一个Istio CNI插件,在Pod创建或销毁的时候,执行服务网格拦截流量的规则,将业务流量转发到服务网格数据面代理。

Istio的服务发现机制完美基于Kubernetes的域名访问机制构建而成,避免了再搭建一个独立的注册中心的麻烦。

Istio控制面都以Kubernetes负载形态部署,对控制面组件也基于Kubernetes Service机制,通过服务名访问。

Istio流量规则和策略配置都是通过Kubernetes CRD实现的,采用了声明式API,各种规则策略对应的数据也被存储在Kube-apiserver中,不需要另外一个单独的配置管理,数据自然也被保存在Kubernetes的Etcd中。

Istio通过非侵入性采集服务的访问指标,基于这些指标配置Kubernetes的HPA策略,基于服务访问情况进行服务实例的扩容和缩容。

容器灰度发布:先调用Kubernetes API对已存在的服务创建一个新的负载,并且标识新的版本,再基于Istio的流量规则对创建的负载实例分配流量,并且控制这个流量的灰度百分比,直到完全100%。

Istio需要管理非Kubernetes服务时,自己提供了基于ServiceEntry和WorkloadEntry的服务定义和服务注册发现机制,可以同时管理和虚拟机的服务实例。

五、Istio的服务

在最通用的Kubernetes容器场景中,Istio服务的存在形式就是Kubernetes的Service, Service是Kubernetes的一个核心资源,提供了域名或者虚拟ip地址访问后端pod的方式。避免向用户暴露具体的pod地址。

在Istio中,服务是管理对象,是Istio中的核心管理实体,提供了对外访问能力。服务也是服务网格Service mesh的管理对象。

六、Istio的服务版本

因为在Kubernetes的语法,不支持在Deployment上定义多个版本,所以Istio中,多个版本的定义是一个服务关联到多个Deployment,每个Deployment都对应服务的一个版本。对Service访问时,根据配置的流量规则,可以将不同的流量转发到不同版本的pod上。

七、Istio的服务实例

服务访问时,Envoy代理根据负载均衡策略将流量转发到其中一个后端处理,Istio的ServiceInstance主要包括EndPoint,Service,服务端口等属性,Endpoint是其中最主要的属性,表示这个实例对应的网络后端ip:port ,Service表示这个服务实例归属的服务。

Istio的服务发现基于Kubernetes的服务发现构建,Istio的Service对应Kubernetes的Service,Istio的服务实例对应Kubernetes的Endpoints

对于非Kubernetes的服务,比如虚拟机,Istio提供了ServiceEntry,WorkloadEntry,WorkloadGroup等对象描述这个模型。

八、Istio的主要组件

控制面的组件 Istiod

Pilot

    Istio的控制中枢,如果把数据面的Envoy看作一种agent,Pilot主要负责服务发现和配置管理。Pilot直接从运行平台提取数据,并将其构造和转换成Istio的服务模型,而且无须为了迁移到Istio进行额外的服务注册。

    另一个功能是构造维护和向数据面下发规则,包括VirtualService,DestinationRule,Gateway等流量规则。也包括RequestAuthentication等安全规则。

    Pilot负责将各种规则转换成Envoy可识别的格式,通过标准的xDS协议发给Envoy,指导Envoy完成工作。

   Pilot内部启动了一个gRPC服务,用来承载数据面SideCar的连接,并处理xDS的订阅请求。

Citadel

  Istio的安全组件:提供了自动生成,分发,轮换与撤销密钥和证书的功能。

  Citadel为工作负载提供了两种证书:

  1.默认双向TLS所使用的证书,无须用户指定,Citadel根据工作负载身份自动为其签发。

  2.用户指定的证书,主要用在服务网格入口网关上,用户为入口网关指定权威机构颁发的证书。

   控制面组件Citadel提供服务网格证书的管理功能,数据面服务代理基于证书和密钥提供透明的服务间安全访问功能。

Galley

服务网格控制面负责配置管理的组件,校验配置信息格式和内容的正确性。在Istio API对象创建阶段对其进行校验,拦截非法的配置。资源对象变化时,通知pilot根据最新API对象生成xDS配置,推送相关的数据面Sidecar

Sidecar-injector

在Kubernetes环境下,根据自动注入配置模板,kube-apiserver在拦截到Pod创建的请求时,会调用Sidecar-injector生成istio-init和istio-proxy容器,并将其插入原Pod的定义中。

数据面的组件

一般指数据面代理 istio-proxy

Istio-proxy

在Istio-proxy容器中除了包括Envoy,还包括一个Pilot-agent的守护进程,将Envoy的启动管理及SDS证书服务统一为单体。

Envoy提供了动态服务发现,负载均衡,TLS,HTTP/2及gRPC代理,熔断器,健康检查,流量拆分,灰度发布,故障注入等功能。

Ingress-gateway

是部署在数据面接收服务网格入口流量的一个网关组件,从Pilot接收流量规则并执行,因为入口处的流量都通过这个网关服务,会有较大的并发并且可能出现流量峰值。包括对匹配流量的重试,重定向,超时,头域操作等。

Egress-gateway 

为了处理服务网格访问外部服务的流量,在Istio数据面中规划一个Egress-gateway组件,将外部访问的出流量转发到这个对外网关上,再经由网关访问外部服务。比如服务网格内部的普通负载均衡部署的节点都不具有连通外部网络的能力,只在Egress-gateway所在节点开放外部网络访问,达到统一管控对外访问的目的。