各类服务网格的实现在特性上重叠性颇高,他们几乎都具有下列功能

  流量治理

    对哪些流量进行治理

    动态路由:条件式路由,基于权重的流量分发,流量镜像

    韧性:超时 重试 断路器

    策略:访问控制

    测试:故障注入

  安全

    加密:mTLS,证书管理,CA

    严格的身份标识机制

    认证和授权

  可观测性

    指标监控

    分布式链路跟踪

    流量监控

  网格

    运行在kubernetes上

    多集群    

Istio是什么

  Istio是Envoy Data Plance的控制平面实现之一

  Istio是一个开源的独立服务网格,可以用户成功运行分布式微服务架构提供所需的基础设施

 

控制平面主要有三个组件

  Pilot:控制平台核心组件

    管理和配置部署在Istio服务网格中所有的Envoy代理实例

    为Envoy Sidecar提供服务发现、只能撸友的流量管理功能(例如,A/B测试、金丝雀推出等)和弹性(超时、重试、断路器等)

  Citadel

    身份和凭据管理等安全相关的功能,实现强大的服务到服务和最终用户身份验证

  Mixer:遥测和策略

    通过内部插件借口扩展支持第三方组件

    插件的修改或更新,需要重新部署Mixer

  Galley

    Pilot中适配底层平台的功能独立成的组件

    是Istio的配置验证、摄取、处理和分发组件

    负责将其余的Istio组件与从底层平台(例如kubernetes)获取用户配置的细节隔离开来,从而将Pilot与底层平台进行解耦

  Istiod:1.5新增,将Polot、Gitadel、Galley和Sidecar Injector整合为一个单体应用istiod

    Istiod充当控制平面,将配置分发到所有Sidecar代理和网管

    他能够为支持网格的应用实现智能化的负载均衡机制,且相关流量绕过了kube-proxy

 

数据平面Envoy

  基于sidecar模式同网格中的每个服务实例一同部署

  拦截服务流量,强制执行控制平面中定义的策略,并收集要测数据。

istio主要解决什么问题_API

Pilot功能简介

  Pilot管理和配置部署在Istio服务网格中的所有Envoy代理实例,是Istio控制平面的核心组件

  他主要由Platform Adapter、Abstract Model、Envoy API(xDS)和Rules API四个组件构成;

    平台适配器:负责适配底层平台,并完成从平台特有的服务模型到Istio服务模型的转换;

    抽象聚合层:聚合底层不同平台的服务和配置规则并对上提供统一的接口,从而解耦Envoy API和底层平台;

    Envoy API:Pilot通过xDS服务器提供服务发现接口xDS API,而xDS服务器接口并维护Envoy代理的链接,并给予Envoy订阅的资源名称进行配置分发;

    Rules API:高级流量管理规则的API接口,用户通过该API配置流量管理规则并由其转换为低级配置,而后通过discovery API分发到Envoy实例;

Pilot功能:

  服务发现

  配置Sidecar

  流量治理

    A/B testing:Ab测试

    failover:故障转移

    Fault Injection:故障注入

    Canary rollout:金丝雀发布

    Circuit Breaker:断路器

    Retries:重试

    Timeouts:超时

istio主要解决什么问题_Pod_02

Citadel功能简介

  Citadel是Istio控制平面的核心安全组件,负责服务的私钥和梳子证书管理,用于提供自动生成、分发、轮换及撤销私钥和数据证书的功能;

    kubernetes平台上,Citadel的传统工作方式是基于Secret资源将证书私钥注入到Sidecar容器中;

    非容器环境中,首先通过系统上运行的Node Agent生成CSR,而后向Citadel发起证书签署请求,并将接收到的证书和私钥存储于本地文件系统提供给Envoy使用;

    Istio1.1版本起支持基于SDS API动态配置Secret给Envoy;

  另外出了Istio的Citadel之外,还有Vault等其他证书和私钥管理系统可用;

  Istio的安全模型需要多个组件协同工作

    Citadel管理私钥和数字证书

    Sidecar和perimeter proxies执行服务间的安全通信

    Pilot向代理分发认证策略和名称信息

 

Galley功能简介

  Galley负责向Istio控制平面的其它组件提供支撑功能,它核验进入网格的配置信息的格式和内 容的正确性,并将这些配置信息提供给Pilot和Mixer;

    Galley从底层平台接收配置信息并完成分发,从而将其它组件同底层平台解耦

    MCP(Mesh Configuration Protocol)是Istio网格中用于分发配置的传输协议 

      基于gRPC

      与xDS协议类似,一次完整的MCP请求/响应流程包括请求、响应和ACK/NACK;

        MeshConfigRequest

        MeshConfigResponse

         以MeshConfigRequest形式发送的ACK或NACK

      目前尚不支持增量配置分发机制;

从实现上来说,Galley通过Kubernetes的动态Admission Controller(Admission Hook)完成组件 配置的校验;

  在Mutation阶段,实现对请求内容的修改,利用为服务注入Sidecar;

  在Validation阶段实现对请求内容进行校验,Galley对配置的校验即发生在此阶段;

 

Istio Gateway用于将Istio功能(例如,监控和路由规则)应用于进入服务网格的流量

  通过将Envoy代理部署在服务之前,运维人员可以针对面向用户的服务进行A/B测试、金丝雀部署等

  Istio Gateway不同于Kubernetes Ingress

  类似地,有必要时,也可以部署专用的Egress Gateway,运维人员可以为这些服务添加超时控制、重 试、断路器等功能,同时还能从服务连接中获取各种细节指标

程序文件istio-ingressgateway和istio-egressgateway

istio主要解决什么问题_ide_03

Istio Sidecar Injector

Istio服务网格中的每个Pod都必须伴随一个Istio兼容的Sidecar一同运行,常用的将Sidecar注入 Pod中的方法有两种

    手工注入:使用istioctl客户端工具进行注入

    自动注入:使用Istio sidecar injector自动完成注入过程

      利用Kubernets webhook实现sidecar的自动注入

      创建Pod时自动注入过程发生在Admission Controller的Mutation阶段,根据自动注入配置,kube-apiserver拦截到Pod创建请 求时调用自动注入服务istio-sidecar-injector生                    成Sidecar容器的描述并将其插入到Pod的配置清单中

istio主要解决什么问题_ide_04

总结

Istio服务网格:

  控制平面:

    istiod:Pilot,galley,citedal,istio sidecar injector

    Control Plane API

  数据平面:

    工作负载实例:注入Sidecar Envoy

    网关:Istio-IngressGateway,Istio-EngressGateway

    Data Plane API

  附件:

    可观测性:

      Grafana,prometheus

      Jaeger/Zipkin

    WebUI:Kiali

Istio相对于kubernetes是什么?

  特点:

    声明式API,各种资源类型

    控制器,Controller Manager

  就是Kubernetes的系统扩展:增强了Kubernetes平台的功能

    CRD:扩充了Kubernetes的资源类型,这些资源类型用于承载Istio的目标功能

    Operator:Istiod,其实就是CRD定义资源类型的控制器

    生效边界:仅是那些具有数据平面Sidecar的服务

      Sidecar的自动注入功能:以namespace为边界

        在namespace上添加特定的label

  注意:

    Istio目标并非用于管理任何可运行于Kubernetes的应用

    核心功能:治理微服务

 

基于Kubernetes CRD描述规则

  Istio的所有路由规则和控制策略都基于Kubernetes CRD实现,于是,其各种配置策略的定义也 都保存于kube-apiserver后端的存储etcd中;

    这意味着kube-apiserver也就是Istio的APIServer 

    Galley负责从kube-apiserver加载配置并进行分发

  Istio提供了许多的CRD,它们隶属于以下几个功能群组
    Network(networking.istio.io):流量治理,主要包括VirtualService、DestinationRule、Gateway、ServiceEntry、Sidecar、EnvoyFilter、WorkloadEntry 和WorkloadGroup等8个CR;

    Security(security.istio.io):网格安全,主要包括AuthorizationPolicy、 PeerAuthentication和 RequestAuthentication等3个CR;

    Telemetry(telemetry.istio.io):网格遥测,目前仅包括Telemetry这一个CR;

    Extensions(extensions.istio.io):扩展机制,目前仅包括WasmPlugin这一个CR;
    IstioOperator(install.istio.io):IstioOperator,目前包括的一个CR也是IstioOperator;

 

Istio的功能及其相关实现组件

  Istio提供了如下开箱即用(Out Of The Box)的功能

    Service Discovery / Load Balancing(服务发现、负载均衡)              →ServicEntry + DestinationRule

    Secure service-to-service communication (mTLS) (通信加密)              →DestinationRule 

    Traffic control / shaping / shifting (流量控制、流量整形、流量迁移)          →VirtualService

    Policy / Intention based access control (策略、内部访问控制)                →AuthorizationPolicy

    Traffic metric collection  (指标收集)                                 →(built in)

  以下功能不能做到OOTB(开箱即用),在一定程度上,依赖用户自行定义

    Cross-cluster Networking               → EnvoyFilter + ServiceEntry + Gateway 

    External Auth / Rate Limiting                →EnvoyFilter 

    Traffic Failover                      →EnvoyFilter

    WAMS Filters                      →EnvoyFilter

    Access Logging / many unexposed Envoy features   →EnvoyFilter + ?

 

Istio流量治理的关键配置

 Virtual Services和Destination Rules是Istio流量路由功能的核心组件

  Virtual Services用于将分类流量并将其路由到指定的目的地(Destination),而Destination Rules则用于配置那个指定Destination如何处理流量

    Virtual Services

      用于在Istio及其底层平台(例如Kubernetes)的基础上配置如何将请求路由到网格中的各Service之上

      通常由一组路由规则(routing rules )组成,这些路由规则按顺序进行评估,从而使Istio能够将那些对Virtual Service的 每个给定请求匹配到网格内特定的目标之上

      事实上,其定义的是分发给网格内各Envoy的VirtualHost和Route的相关配置 

    Destination Rules

      定义流量在“目标”内部的各端点之间的分发机制,例如将各端点进行分组,分组内端点间的流量均衡机制,异常 探测等

      事实上,其定义的是分发给网格内各Envoy的Cluster的相关配置

  VirtualService定义虚拟机及相关的路由规则,包括路由至哪个目标(集群或子集)

  DestinationRule定义集群或子集内部的流量分发机制

  流量治理的相关资源:

    Gateway:生效在istio-ingressgateway上,用于配制接入哪一类型的外部流量,生成一个Listener,若Listener已经存在,则在该Listener之上生成一个VirtualHost,但该VirtualHost接收到的流量,发往何处(流量目标)并不会自动生成;

    VirtualService:配置流量的具体路由路径

      存在两种生效逻辑:

        生效在istio-ingressgateway上:作为Ingress Listener存在

        生效在mesh上(配置在网格内的所有Sidecar Envoy上):作为Egress Listener存在

    DestinationRule:配置集群内部的流量分发逻辑

      负载均衡算法

      连接池

istio主要解决什么问题_ide_05

网格内部通信:

  将任何一个Service自动配置为每个Sidecar Envoy上的:

    Listener:由Service Port指定;80会被自动处理为8080

      额外生成一个VirtualHost的定义,主机头的名称为该Service的名称;

    Route:由一个Service的Listener进入的所有流量(match /*)全部路由给该Service的各Pod生成的Cluster

    Cluster:由Service基于各名称生成,并通过EDS下发给每个Sidecar,所有集群名称同Service的名称;

    Endpoint:由Service基于Label Selector发现的各Pod的IP生成

  流程:

  Client --> Envoy Sidecar 自己的 (outbound:egress listener --> route --> cluster(目标集群) --> endpoint(目标端点))--> Server Pod Envoy Sidecar (inbound:ingress listener --> route --> local cluster --> localhost(业务容器)(由所属的服务生成))

  网格外部的流量:

    流量必须经由某个IngressGateway进入

      因而,接入流量的前提是在某个IngressGateway上自行开启一个Listener,开启Listener的方法,就是该IngressGateway定义一个Gateway CRD资源;

      在该Listener基于目标Host匹配流量

      匹配到的流量,需要经由VirtualService定义其路由目标(网格内的某个服务)

  流程:

   External Client --> IngressGateway Service --> Ingress Gateway Pod(Listener(由Gateway定义) --> Route(由VirtualService定义)--> Cluster(可由控制平面通过发现的Service自动配置)--> endpoint)

  

  小结:

    gateway:若Listener已经存在,于IngressGateway上基于指定的端口启用一个Listener,并在该Listener上配置一个Virtual Host;

    VirtualService:在Listener上,为某Host(通常会由VirtualHost的定义所匹配)定制高级路由

      如何匹配Listener?

        由关联的Gateway CRD资源所定义

        由关联的Service (通过hosts指定)的端口生成的Listener

      默认的路由配置:/* --> 由同一Service生成的Cluster

    DestinationRule:在Cluster上,为Cluster定义高级配置

      默认的配置:把Service Name定义成集群,该Service匹配到的Pod,定义为集群端点

      高级配置:lbPolicy,Connection Pool

  Istio:

    基于某个Service Registry(API Server)发现Service

    所有Service都会被纳入网格治理体系:配置在Sidecar和Gateway

      非网格治理下的Service,只要能够被Istio发现,而且只要客户端在网格内部,就同样支持经VS和DR定义高级配置;原因在于:客户端自身的Sidecar上listener发挥了作用;但是,网格外部的服务没有Sidecar,某些功能就无法支持,例如双向tls

    支持经由Gateway,将特定的Service暴露至网格外部;

 

Sidecar Envoy使用的端口

Port

  Protocol

  Description

  Pod-internal only

15000

TCP

Envoy admin port

YES

15001

TCP

出向流量端口

NO

15004

HTTP

Debug port

YES

15006

TCP

入向流量端口

NO

15008

H2

mTLS 隧道端口 被放行的端口

NO

15009

H2C

HBONE port for secure networks

NO

15020

HTTP

Prometheus采集聚合指标

NO

15021

HTTP

健康状态检测的端口,检测sidecar是否健康

NO

15053

DNS

DNS端口

YES

15090

HTTP

暴露Prometheus指标的端口,采集Envoy指标

NO

控制平面使用的端口

Port

  Protocol

  Description

  Local host only

443

HTTPS

Webhook service

NO

8080

HTTP

Debug interface

NO

15010

GPRC

下发配置和CA的 明文的

NO

15012

GPRC

下发配置和CA的 加密的

NO

15014

HTTP

指标监控

NO

15017

HTTPS

接收从443转发进来的与webhook功能相关的接口

NO