美文网首页
Istio核心组件介绍

Istio核心组件介绍

作者: 程序员札记 | 来源:发表于2022-12-26 10:22 被阅读0次

    01 架构

    我们先简单回顾下Istio的架构,Istio架构图如下:

    image.png

    Istio架构,来自Istio官网-Architecture

    Istio从逻辑上分数据平面和控制平面两部分。

    数据平面由Envoy代理组成,与控制面进行交互,根据动态更新的配置对代理的微服务进出流量进行拦截处理,另外生成遥测数据,为微服务提供可观测能力。

    控制平面主要指Istiod组件,负责管理及配置数据平面sidecar代理,Istiod由三个子组件( Pilot、Citadel、Galley )组成。其中Pilot组件负责提供服务发现、智能路由(如金丝雀发布)和弹性功能(如超时、重试);Citadel负责安全,管理密钥和证书;Galley负责对配置的验证和处理等功能。

    02 原理

    我们在了解了Istio架构后,再顺着Istio对微服务进行流量管理的关键步骤,了解下Istio的大概原理和组件作用。

    1. 注入sidecar

    在K8s环境中,kube-apiserver会拦截微服务pod的创建请求,生成sidecar容器的描述并插入到微服务pod的定义中,在微服务pod中除了创建微服务容器,还注入了sidecar容器,使pod成为包括多容器的容器组。

    如下图所示,微服务foo的pod注入sidecar后,包括两个容器:微服务容器foo及sidecar容器istio-proxy。

    image.png

    istio-proxy即运行Envoy进程的代理容器。

    image.png

    2. 流量拦截

    在pod初始化过程中,Istio为pod设置了iptables规则,当请求微服务的流量到达pod时,配置的iptables规则拦截微服务的入口和出口流量到sidecar容器中。

    3. 服务发现

    当服务网格中的微服务存在调用和被调用的关系时,如服务A调用服务B,A的sidecar代理需要调用Istio控制面Pilot组件的服务发现接口,获得服务B的实例列表,才能将拦截的出口流量转到正确的目的地址。

    4. 流量治理

    sidecar容器在拦截了微服务的入口和出口流量后,按照从控制面Pilot组件获得的流量管理相关配置对流量进行处理,实现流量治理功能。

    5. 安全访问

    在云化部署环境中,微服务之间安全通信非常重要,数据面Envoy代理向控制面Pilot发起安全相关请求,获得安全相关配置后自动加载证书和密钥,实现Envoy代理组件通信的双向认证。Envoy代理的证书和密钥是由控制面Citadel维护的。

    通过以上介绍,我们大概了解了核心组件的作用,接下来我们分数据面和控制面对组件再做进一步详细介绍。

    03 数据面

    Envoy概述

    Istio的数据面由Envoy代理组成,Envoy是Istio数据面的核心部分,Istio数据面的绝大部分功能是由Envoy提供的。

    Envoy本身是一款采用C++开发,面向云原生的可以独立运行的高性能服务代理,由Lyft开源,后来贡献给了CNCF。Envoy可以简单类比为Nginx,它们都是服务代理组件,但Envoy相比Nginx,除了拥有更高的性能,还拥有更多的特性,包括高级的服务治理功能(重试、断路器、全局限流、流量镜像等)、能够动态管理配置的API、深度的可观测能力。正是由于这些特性,Envoy成为云原生领域服务代理领域明星组件。

    Envoy和Istio并不是强绑定关系。一方面Envoy并不局限于Istio,除了在Istio数据面中应用,以Envoy为基础的项目还有很多,比如K8s的Ingress Controller:AmbassadorContourEnRouteGloo等都是基于Envoy的Ingress控制器。另一方面Istio也不局限于Envoy,Envoy是Istio数据面的默认选择,但不是唯一选择。Istio数据面还可以选如蚂蚁集团开源的MOSN,Nginx提供的nginmesh

    组件详解

    Istio中服务pod的内部组成,可以参见下图:

    image.png

    pod在创建过程中,实际会创建3个容器,istio-init容器、istio-proxy代理容器和微服务容器。istio-init容器是一种Init 容器,在istio-proxy容器和微服务容器启动前运行,进行一些初始化操作后退出,所以在pod创建成功后,只能看到istio-proxy容器和微服务容器。

    istio-proxy容器中运行着两个进程:pilot-agent和envoy,后面我们详细介绍。

    image.png

    istio-init容器

    istio-init容器作为初始化容器,主要用于设置iptables规则,让微服务入口出口流量都转由sidecar容器处理,在完成iptables规则设置后退出。

    我们通过kubectl describe命令看到istio-init容器的相关信息:

    image.png

    istio-proxy容器

    容器中运行着两个进程:pilot-agent和envoy。pilot-agent是istio-proxy容器的1号进程,负责启动envoy进程,启动后的envoy进程进行服务间通信及服务管理。

    pilot-agent

    pilot-agent是istio-proxy的入口进程,负责envoy进程的生命周期管理。pilot-agent会生成启动envoy进程需要加载的静态配置文件,启动envoy进程,监控和管理envoy进程的状态,如envoy出错时重启envoy,或envoy配置变更后reload envoy。

    pilot-agent进程如下:

    
    /usr/local/bin/pilot-agent proxy sidecar --domain foo.svc.cluster.local --proxyLogLevel=warning --proxyComponentLogLevel=misc:error --log_output_level=default:info --concurrency 2
    
    

    我们可以通过查看istio-proxy容器的Dockerfile,看到pilot-agent确实是istio-proxy的入口进程。

    
    # The pilot-agent will bootstrap Envoy.
    ENTRYPOINT ["/usr/local/bin/pilot-agent"]
    
    

    通过kubectl describe命令看到istio-proxy容器的相关信息,看到容器启动参数,包括proxy类型为sidecar、域名、日志等级等。

    image.png

    Envoy

    istio-proxy容器中Envoy进程如下:

    
    /usr/local/bin/envoy -c etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --drain-strategy immediate --parent-shutdown-time-s 60 --local-address-ip-version v4 --file-flush-interval-msec 1000 --disable-hot-restart --log-format %Y-%m-%dT%T.%fZ.%l.envoy %n.%v -l warning --component-log-level misc:error --concurrency 2
    
    

    Envoy启动时读取pilot-agent提供的静态配置文件:etc/istio/proxy/envoy-rev0.json,获得控制面Pilot地址,通过访问Pilot提供的接口,获取动态配置信息(如Cluster信息、Endpoint信息、Route信息等),根据配置信息进行服务间通信及服务管理。

    04 控制面

    控制面Istiod包括Pilot、Citadel、Galley 三个子组件组成。

    Pilot是Istio控制面最核心的组件,下面我们详细介绍。

    Gally是负责配置管理的组件,从底层平台获取配置,验证配置信息的格式和内容的正确性,并将这些配置信息提供给Pilot使用。

    Citadel 是与安全相关的组件,主要负责密钥和证书的管理,可以实现强大的授权和认证等功能。

    Pilot

    Pilot是控制面最重要的组件,提供服务发现、流量路由及服务治理(超时,重试,熔断等)功能,架构图如下:

    image.png

    Pilot架构,来自Istio官网-流量管理

    • 服务发现:Pilot通过插件的形式对接多种服务注册平台(K8s、Mesos、CloudFoundry及Consul等),通过平台适配器(Platform Adapter)将服务注册平台的服务数据填充为标准服务模型(Abstract Model),例如Pilot通过K8s适配器,将K8s中的Service及Pod实例等服务信息,转换为标准模型供Pilot使用。Pilot在得到统一的服务信息后,将服务信息通过Envoy API下发到数据面Envoy代理,实现服务发现功能。不过虽然Pilot提供了集成不同服务注册平台的机制,但支持程度不同,建议使用默认的K8s Service服务注册机制,另外Istio原生支持Consul,但非默认方式,需要在Pilot启动命令中指定参数,并且存在一些坑,其他的服务注册平台更不推荐。
    • 流量路由、服务治理:Pilot可以将各种流量管理规则(Gateway、VirtualService、DestinationRule等)转换为数据面Envoy可以识别的格式,通过Envoy API下发给Envoy,Envoy在得到这些规则后,按照规则进行流量转发及安全认证。

    05 总结

    本文从Istio架构出发,顺着Istio流量管理的关键步骤,对Isito的原理及核心组件做了一些介绍。在了解了这些基础理论后,我们后续文章会逐渐加入实践环节,欢迎大家继续关注,我们一起浅析Istio,使用Istio。

    相关文章

      网友评论

          本文标题:Istio核心组件介绍

          本文链接:https://www.haomeiwen.com/subject/kmlnqdtx.html