Istio核心组件介绍

2022-12-26  本文已影响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官网-流量管理

05 总结

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

上一篇下一篇

猜你喜欢

热点阅读