华为云云原生钻石集训营 第十三课:Istio数据面架构(Envoy)深度解析

举报
菜鸟级攻城狮 发表于 2021/08/10 21:08:38 2021/08/10
【摘要】 华为云云原生钻石集训营 第十三课:Istio数据面架构(Envoy)深度解析

课程目标:

学完本课程后,您将能够:

1.了解Envoy的基本概念

2.了解Envoy的原理总体架构

3.了解Envoy的基本线程模型

4.了解Envoy的过滤器架构

目录

1.服务网格数据面Envoy介绍

2. Envoy原理及总体架构

3. Envoy启动配置及xDS

4. Envoy网络及线程模型、过滤器架构、HTTP请求流程

5. Envoy问题分析方法

前言:

微服务架构最早由Fred George在2012年的一次技术大会上所提出,他讲到如何通过拆分SOA服务实现服务之间的解耦,这是微服务最早的雏形。

微服务架构通过细粒度的服务解耦拆分,带来缩短开发周期、独立部署、易扩展等好处的同时,同时带来对服务发现、负载均衡、熔断等能力前所未有的诉求。

第一阶段为dubbo、SpringCloud侵入式开发框架,语言强相关。非侵入服务网格最早为2016年Linkerd。

2017年,Google、IBM、Lyft发布lstio。Istio目前为服务网格的事实标准,并且是2019年Github增长最快的TOP10开源项目之一。目前最新为1.10版本。

Envoy介绍

Envoy采用C++实现,本身为四层及七层代理,可以根据用户应用请求内的数据进行高级服务治理能力,包括服务发现、路由、高级负载均衡、动态配置、链路安全及证书更新、目标健康检查、完整的可观测性等。

·目前常见数据面主要有三种: Envoy、Linkerd、Traefic。Envoy由于高性能和扩展能力前在数据面遥遥领先。

. lptables使Pod间出入应用的流量均由Envoy代理,对应用来说完全透明。支持主要常用网路协议Http1/Http2/Tls/gRPC/Tcp等。

Envoy原理及总体架构-说明

. 1.启动阶段

·istiodopod创建请惑.资烈的指家nmepsace则根据configmap配置生成带有Envoy两个容器的创建POD请求,修改过的创建过的创建请求被kubelet接收,并在节点创建POD.

istio-init容器添加用于配置容器网络内iptables规则

. istio-proxy容器启动pilot-agent进程,使用UID=1337GID=1337创建Envoy启动命令行与配置文件

·可以通过自定义deployment内istio注解sidecar.istio.io/inject. “false”跳过自动注入过程,或修改部分启动参数。

·proxy.istio.io/config:"{concurrency: 6}]”#修改工作线程数,默认2

. sidecar.istio.io/proxylmage: “istio/proxyv2new.1.9.0“#修改默认注入镜像

2.控制面通信

 Pilot-agent进程本身创建UDS接收Envoy连接,用于证书更新下发。并且与istiod建立证书更新通道。

 Envoy 通过pilot-agent转发机制与istiod建立长连接,通过xDS协议接收系统下发的监听器、路由、集群节点等更新信息。

3.数据面通信

·客户端请求进入容器网络,并被iptables规则拦截,经过DNAT后进入Envoy virtualOutbound监听器. virtualOutbound经过监听过滤器恢复用于原始目标服务,并找到后端处理器处理新连接。

后端处理器在配置中指定处理协议,根据协议相关的网络过滤器处理读取到的数据。

·如果为http协议,再经过请求过滤器处理http协议头部,如路由选择等功能并创建上游连接池

·将修改及编码后的http消息通过网络发送到对端Envoy的容器网络。

. lptables识别为入流量则进入virtuallnbound端口。

·类似恢复原始目标后,根据virtuallnbound配置的监听过滤器找到对应的本地服务器地址。并发起localhost的请求。

·请求进入本地服务器内进行处理并返回响应。

Envoy启动配置及xDS-cont'(实操)

·分为static_resources及dynamic_resources两种配置,

·两种方式查看Envoy配置

. pilot-agent:访问Envoy 15000端口,指定url获取:

.kubectl exec -it $podname -c istio-proxy -- pilot-agent request

·istioctl:需要根据Istio不同版本下载: https:/github.com/istio/istio/releases/download/1.9.5/istioctl-1.9.5-linux-amd64.tar.gz

. istioctl pc listener $podname#输出LDS

. istioctl pc route $podname #输出RDS

. istioctl pc cluster $podname #输出CDS

. istioctl pc endpoint $podname #输出EDS

. istioctl pc secret $podname #输出SDS

网格内部调用,通过自动注入到网格内的iptables规则进行拦截

默认为2个工作线程

默认最大上游连接数1024,最大挂起等待请求数1024

外部请求通过直接访问ingressgateway网关端口进入网格

ingressgateway为envoy相同二进制,不做iptables规则注入,作为外网客户端网格内代理。

ingressgateway不设置工作线程数限制,并且最天上游连接及最大挂起等待请求数请求数默认值不做限制。

分为Envoy主线程及worker线程:

主线程:

·负责初始化Envoy并读取解析配置文件

·启动gRPC监听器,并启动xDS变化监听

·启动日志写入线程,每个目标日志文件有独立线程负责输出

·启动admin RESTful监听,处理运行状态输出,prometheus收集等请求

·定期将工作线程内监控数据stat进行合并

·定期刷新DNS信息,加速域名解析。

.目标cluster内主机列表健康状态判断。

worker线程:

·通过启动配置参数concurrency指定,不支持动态调整。

启动virtualoutbound/virtualinbond网缝监听,每个工作线程都对此监听端口进行监听。由内核随机挑选监听线程处理新连接。

·进行连接负载均衡处理后,选择最终的业务监听器处理新连接。

之后对于此连接的所有处理都在此线程进行,包括下游数据集解码,路由选择、上游数据编码发送等。

同时此工作线程还要处理定期观测信息与主线程同步(通过异步加回调)、线程内配置及集群管理器状态更新等工作。

请求完成后延迟释放内存,解决本次事件处理中回调所引用对象可以被安全访问,并在下次事件处理中安全删除。

Envoy网络及线程模型-共享数据同步

1.调度器通过epoll监控文件事件(网络)及定时器事件进行排队任务处理.

2.线程间通信通过post接口发送任务,此任务通过定时器事件激活。

3.线程间数据交换通过post更新TLS,这样每个线程内代码都不需要加锁处理。

4.每个线程的TLS对象本身只保存真实对象的共享指针进行读操作,减少内存消耗。

5.全局对象更新只发生在主线程,并通过COW方式通知工作线程进行指针修改

每个TLS slot通过allocateSlot分配,在使用前通过set在每个线程中创建一个拷贝并保存。

在主线程中调用此slot的runOnAllThreads在所有线程中延迟执行回调,回调内更新每个线程内拷贝对象状态

Envoy网络及线程模型-集群信息更新

.1.Envoy需要在运行中支持添加集群并监控每个集群内目标主机列表变化.

2.监控到目标主机健康状态变化时,需要通知到工作线程内主机可用状态。

3.当收到节点变化EDS消息时,需要通知到工作线程内新上线、下线主机。·

4.Envoy使用前面提到的TLS方式实现集群状态更新,集群管理器保存TLS slot,类型为ThreadLocalClusterManagerlmpl。

当节点变化、DNS解析更新、健康状态变化时,将调用集群管理器的postThreadLocalClusterUpdate方法

 5.此方法将延迟调用所有线程内ThreadLocalClusterManagerlmpl slot的回调函数。

 6.此函数内将保存新clusterEntry对象的引用。

7.下一轮请求解析时将从头TLS中获取到更新后的集群可用状态。

Envoy网络及线程模型-网络处理

Envoy启动时创建的Listener与工作线程绑定并启动监听(向libevent注册Read回调onSocketEvent),并进入阻塞运行状态,直到进程退出。

当新连接到达时,内核网络协议栈调用回调并创建新连接的Socket。

通过ConnectionHandler调用监听过滤器获得真实访问目标地址

根据目标地址匹配得到业务监听器后创建Connection连接对象

之后Connection对象再次向libevent注册Read/Write回调onFileEvent,并作为L4层过滤管理器处理

onNewConnection, onData数据接收。

对于HTTP协议,将继续经过L7层编解码处理后向上游发送请求。

当请求处理完毕后,将调用deferredDelete删除请求对象并记录统计观测数据。

使用异步I/O方式发送网络数据,降低对线程内其他操作的阻塞。

根据位置及作用类型,分为:

·监听过滤器(Network:.ListenerFilter)

.onAccept接收新连接,判断协议类型,TLS握手,HTTP协议自动识别、提取连接地址信息

. L4网络过滤器

.HTTP、Mysql、Dubbo协议处理、元数据交换,四层限流,开发调试支持等。

onNewConnection新连接建立,可以决定是否拒绝

onData处理连接数据到达

.onWrite处理连接数据发送

.L7 HTTP过滤器

修改HTTP请求头,限流处理,Lua扩展、WASM扩展、开发调试支持、压缩、元数据交换、路由等。

decodeHeaders处理HTTP请求头部

decodeData处理HTP请求数据

decodeTrailers处理HTTP请求结束位置

encodeHeaders发送请求前编码头部

encodeData发送请求前编码数据.、

encodeTrailers消息发送前编码处理

APP发出的请求被iptables拦截,并根据源信息判断为outbound被DNAT后拦截进入Envoy 15001端口

15001上监听器通过ORIGINAL_ DST获取原始目标地址(服务的clusterlp),匹配业务监听器〈不真正监听网络)地址并传递新建下游连接。下游连接过滤器判断TLS,ALPN(业务协议名称),HTTP版本后匹配到L4层http_connection_manager网络过滤器。

http_connection_manager使用http codec解码http协议header/body/tailer等并触发回调函数。

http header/body处理回调中将调用L7层HTTP过滤器处理(可修改http原始请求等)最后调用Router过滤器。Router过滤器负责根据配置中路由部分及请求内url等进行匹配并找到目标cluster。

根据cluster的负载均衡策略及当前可用POD实例信息,选择最适合的目标POD地址,并创建此目标地址的连接池。根据连接池配置的最大可用连接数及允许的最大等待连接数等信息将下游请求与上游连接进行关联。

当连接准备好后对下游请求使用codec进行HTTP编码,并发送到上游连接的L4层网络过滤器。

上游连接的L4层网络过滤器使用metadata exchange传输本Envoy内保存的与调用APP相关的元数据信息,包括POD名称、用户空间、cluster d等信息。之启将待发送请求通过Socket度送到网络,经过iptables时判断发送者为Envoy则不再拦截。

目标POD收到从网络进入的流量,通过iptables拦截后判断为inbound并DNAT处理后,进入Envoy的15006端口。

由于inbound方向流量的目标地址一定为本POD地址,无需再提取后转到不同业务监听器,因此virtualinbound负责TLS、ALPN及HTP协议版本判断。L4层网络过滤器metadata exchance首先解析请求中包含的源POD元数据信息,并同时发送回本Envoy代理POD的元数据信息。之后进入L4层http_connection_manager网络过滤器。

L7层处理流程同outbound方向,区别为inbound通过Router匹配后的目标cluster所指向的上游地址为127.0.0.1。之后创建与本POD内业务容器的服务端口的Socket连接并完成请求发送。

由于请求方向在建立时会保存下游与上游连接的双向对应关系,因此Response匹配的对上游进行L7层过滤器解码、通过Router关联关系找到下游并编码发送HTTP请求(POD1处理类似)。

以上所提到的Envoy L4层网络读取及数据发送为全异步读写模式,采用网络事件触发机制完成响应数据的接收和发送。

由于Router部分请求处理方向需要进行更多路由选择计算及负载均衡计算工作,因此通常outbound方向处理较复杂,CPU消耗比inbound更高。

lstio数据面发展趋势

·现状问题:

引入Sidecar模式,导致端到端时延增加、并随着集群规模增加导致系统资源消耗上升,对大规模lstio集群的实际使用造成影响。

·运维难度增加,透明代理模式无法针对不同业务本身的特点定制监控能力,同时只能从业务容器外面收集应用的运行状态。

·演进方式:

·从Envoy自身V/O及线程模型、容器网络协议栈优化提升端到端性能,降低tp90网络时延。

·通过运行时拉取集群依赖服务及POD实例配置信息,同时考虑配置信息共享的方式,降低每Envoy资源消耗。

·增加更多运维监控维度及探测点,收集更全面的观测信息。同时支持对出现问题的Envoy进行旁路处理。

本课总结:

Envoy:基于C++11,14的高性能服务网格数据面代理

xDS:Envoy与上层控制面如istiod使用的基于gRPC的应用层协议,用于传输配置变更。

自动注入及流量拦截:POD创建时,由istiod进行自动修改deployment并将istio-init, istio-proxy容器注入到新创建POD内;当发生调用时,iptables规则将自动拦截出入流量进入Envoy代理。

线程模型:Envoy采用每个工作线程独立处理网络及定时器事件,线程间无数据共享,提升性能。

过滤器架构:Envoy采用可扩展插件架构实现监听过滤器、L4网络过滤器、L7HTTP过滤器;同时支持基于L4/L7 WASM及L7 Lua过滤器的二次扩展。

参考链接:

相关内容的华为云官网链接: https://support.huaweicloud.com/usermanual-cce/cce_01_0006.html

详细ASM官网资料: https://support.huaweicloud.com/istio/

lstio官方文档: https://istio.io/latest/docs/

envoy官方文档: https://www.envoyproxy.io/docs/envoy/latest/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。