前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Istio系列二:Envoy组件分析

Istio系列二:Envoy组件分析

作者头像
绿盟科技研究通讯
发布于 2019-12-11 07:05:00
发布于 2019-12-11 07:05:00
4.1K00
代码可运行
举报
运行总次数:0
代码可运行

Envoy是Istio数据平面核心组件,在Istio架构中起着非常重要的作用,本文首先介绍Envoy的基本概念及工作流程,再从Istio的设计角度出发,对Envoy在Istio中如何部署及如何对入站出站流量进行代理转发及流量劫持进行具体分析,最后通过实验加以验证。

Envoy概述

Envoy 是以 C++ 开发的高性能代理,其内置服务发现、负载均衡、TLS终止、HTTP/2、GRPC代理、熔断器、健康检查,基于百分比流量拆分的灰度发布、故障注入等功能。

Envoy主要面向SOA(面向服务的架构)的网络代理,所以非常适用于微服务,其主要是用来调解Service Mesh中所有服务的入站和出站流量。架构如下图所示。

图1 Envoy架构图

下面首先介绍Envoy架构中的一些重要概念:

Downstream:下游主机,指连接到Envoy的主机,这些主机用来发送请求并接受响应。

Upstream:上游主机,指接收来自Envoy连接和请求的主机,并返回响应。

Listener:服务或程序的监听器, Envoy暴露一个或多个监听器监听下游主机的请求,当监听到请求时,通过Filter Chain把对请求的处理全部抽象为Filter, 例如ReadFilter、WriteFilter、HttpFilter等。

Cluster:服务提供集群,指Envoy连接的一组逻辑相同的上游主机。Envoy通过服务发现功能来发现集群内的成员,通过负载均衡功能将流量路由到集群的各个成员。

xDS:xDS中的x是一个代词,类似云计算里的XaaS可以指代IaaSPaaSSaaS等。DS为Discovery Service,即发现服务的意思。xDS包括cds (cluster discovery service)、rds (route discovery service)、eds (endpoint discovery service)、ads (aggregated discovery service),其中ads称为聚合的发现服务,是对cds、rds、lds、eds服务的统一封装,解决cds、rds、lds、eds信息更新顺序依赖的问题,从而保证以一定的顺序同步各类配置信息。以上endpoint、cluster、route的概念介绍如下:

  • endpoint:一个具体的“应用实例”,类似于k8s中的一个Pod;
  • cluster:可以理解“应用集群”,对应提供相同服务的一个或多个endpoint, 类似k8s中Service概念,即一个Service提供多个相同服务的Pod;
  • route:当我们做金丝雀发布部署时,同一个服务会有多个版本,这时需要route规则规定请求如何路由到其中的某个版本上。

xDS模块的功能是通过Envoy API V1(基于HTTP)或V2(基于gRPC)实现一个服务端将配置信息暴露给上游主机,等待上游主机的拉取。

Envoy正常的工作流程为Host A(下游主机)发送请求至上游主机(Host B、Host C、Host D等),Envoy通过Listener监听到有下游主机的请求,收到请求后的Envoy将所有请求流量劫持至Envoy内部,并将请求内容抽象为Filter Chains路由至某个上游主机中从而实现路由转发及负载均衡能力。

Envoy为了实现流量代理能力通常需要一个统一的配置文件来记录信息以便启动时加载,在Envoy中启动配置文件有静态配置和动态配置两种方式。静态配置是将配置信息写入文件中,启动时直接加载,动态配置通过xDS实现一个Envoy的服务端(可以理解为以API接口对外实现服务发现能力)。

Envoy组件解析

为了便于理解Istio中Envoy与服务的关系,下图为Envoy的拓扑图,如图所示:

图2 Envoy拓扑图

Envoy和Service A同属于一个Pod,共享网络和命名空间,Envoy代理进出Pod A的流量,并将流量按照外部请求的规则作用于Service A中。

理解Istio中Envoy代理注入及流量劫持

以下以Istio中的Bookinfo demo说明Envoy在Istio中流量劫持和代理注入的过程:

首先通过kubectl get pods查看目前部署的Bookinfo微服务程序:

图3 bookinfo demo Pod信息

图4 bookinfo架构图

由Bookinfo的架构图可以看出服务间的请求调用关系,我们以Productpage举例,通过kubectl describe pod productpage-v1-54b8b9f55-8lt67 可以查看Productpage服务的信息,从中可以看到有容器相关的两个部分,分别为Init Containers和Containers。

Init Containers为初始化容器,下文统一称作Init容器,通常在应用容器和Envoy代理容器启动之前运行,并在初始化成功后退出。一个Pod可具有多个Init Containers,如果指定了多个,那么按照顺序依次运行,并且只有当前面的Init Containers运行成功后才可以运行下一个Init Containers,否则会根据Pod的RestartPolicy策略进行重试。

Containers主要分为Envoy代理容器和应用容器两部分。

Init容器都做了哪些事情呢?以下截图为Init相关信息

图5 Init容器相关信息

我们查看Init容器的dockerfile,如下图所示:

图6 Init Containers dockerfile

由以上dockerfile可以看出Init容器入口为/usr/local/bin/istio-iptables.sh脚本,我们可以在Istio github中查看istio-iptables.sh的内容,该脚本主要是用于给Envoy代理容器做前期的初始化工作,具体设置了iptables端口转发规则。

由istio-iptables.sh的使用方法结合Init容器相关信息图中红框部分,即-p 15001 -u 1337 -m REDIRECT -i '*' -x "" -b 9080 -d "",执行的启动脚本为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/local/bin/istio-iptables.sh -p 15001 -u 1337 -m REDIRECT -i '*' -x "" -b 9080 -d ""

可以cd到istio-iptables.sh目录下,执行命令istio-iptables.sh --help查看参数含义,如下图所示:

图7 istio-iptables.sh使用方法

这条启动命令的作用为:

  • 将容器所有流量都转发到Envoy的15001端口。
  • 使用istio-proxy用户身份运行,UID 1337。
  • 使用默认的REDIRECT模式来重定向流量。
  • 将所有出站流量都重定向至Envoy代理。
  • 将所有9080端口的流量重定向到Envoy代理。

所以总结Init容器的作用及存在的意义就是让Envoy代理可以拦截所有进出Pod的流量,即将入站流量重定向到Envoy代理,再拦截出站流量经过Envoy处理后再出站。

因为Init容器在运行完毕后就会自动退出,所以我们无法直接进入Init容器中查看iptables信息,不过Init容器会将结果保留到Envoy代理容器中,我们以特权模式进入Productpage服务的Envoy容器,并执行iptables命令, 过程如下图所示:

图8 Envoy代理容器中iptables NAT表中链信息

由上图可以看出,Init容器通过为Envoy代理容器iptables中NAT表注入ISTIO_INBOUND、ISTIO_IN_REDIRECT、ISTIO_OUTPUT、ISTIO_REDIRECT四条链路来对流量进行劫持。

具体的劫持过程可以参考下图,图片来自https://jimmysong.io :

图9 Envoy代理容器劫持过程图

Envoy代理注入过程

通过命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl describe pod productpage-v1-54b8b9f55-8lt67

可以看出Envoy代理容器的启动参数为下图红框所示:

图10 Envoy代理容器启动参数

Envoy容器的dockerfile如下图所示:

图11 Envoy代理容器dockerfile

结合图10,图11可看出Envoy代理容器入口为/usr/local/bin/pilot-agent,传递参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
proxy sidecar --configPath /etc/istio/proxy --binaryPath /usr/local/bin/envoy --
serviceCluster productpage --drainDuration 45s --parentShutdownDuration 1m0s --
discoveryAddress istio-pilot.istio-system:15007 --discoveryRefreshDelay 1s --zipkinAddress 
zipkin.istio-system:9411 --connectTimeout 10s --statsdUdpAddress istio-statsd-prom-
bridge.istio-system:9125 --proxyAdminPort 15000 --controlPlaneAuthPolicy NONE

这些参数主要配置了Envoy 二进制文件的位置(/usr/local/bin/envoy)、服务发现地址(istio-pilot.istio-system:15007)、服务集群名(-- istio-pilot.istio-system:15007)、监控指标上报地址( istio-statsd-prom-bridge.istio-system:9125)、Envoy 的管理端口(15000)、热重启时间(10s)等。

Envoy代理容器中PID为1的进程为pilot-agent,它启动时又创建了一个Envoy进程。启动命令为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/local/bin/envoy -c /etc/istio/proxy/envoy-rev0.json --restart-epoch 0 --drain-time-s 45 --parent-shutdown-time-s 60 --service-cluster productpage --service-node sidecar~172.33.78.10~productpage-v1-745ffc55b7-2l2lw.default~default.svc.cluster.local --max-obj-name-len 189 -l warn --v2-config-only

由Envoy进程启动的命令参数可以看出有一个配置文件为/etc/istio/proxy/envoy-rev0.json,这是其它一切配置的根本来源,在Envoy注入到Pod时会通过此配置文件加载bootstrap静态配置,说起bootstrap配置,它是Envoy整个配置中的静态配置,当然我们可以通过命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl -n default exec -it ratings-v1-7bc85949-89tm5 -c istio-proxy curl http://localhost:15000/config_dump如

进入到容器中查看所有配置,因为json文件很长,大概6000行,在此不贴出来了。关于该配置内容可参照下图:

图12 Envoy Config

除了Bootstrap配置以外,剩下的基于xDS(listener DS /Clusters DS/routes DS)的动态配置则是从Pilot的Envoy API获取。有了配置文件,Envoy就可以进行转发了,可以进入Envoy容器中/etc查看/etc/istio/proxy/envoy-rev0.json文件,内容如下:

图13 Envoy代理容器中Envoy配置文件内容

Envoy就是通过以上配置在各个服务中进行规则的动态转发。

可以进到Envoy容器中查看Envoy和Pilot-agent进程, 如下图所示:

图14 Envoy中运行的主要进程

Envoy: 可以进到对应目录中(/etc/istio/proxy/envoy-rev0.json)查看Envoy的配置,这些配置一部分由用户通过Rules API提供,一部分由Kubernetes服务发现功能提供。Envoy进程由Pilot-agent进程启动,启动后,Envoy读取pilot-agent为它生成的配置文件,然后根据该文件的配置获取到Pilot的地址,通过Envoy API的xDS接口从Pilot拉取动态配置信息,包括路由(route),监听器(listener),服务集群(cluster)和服务端点(endpoint)。Envoy初始化完成后,就根据这些配置信息对服务间的通信进行寻址和路由。

Pilot-agent:负责Envoy的生命周期管理,可对Envoy静态配置进行热重启,比如TLS证书,Envoy还不支持动态下发,所以要先重新配置静态文件,再使用Pilot-agent负责将Envoy进行热重启加载。

总结

Envoy的核心在于对业务透明的请求拦截;将拦截请求进行一定的规则校验,认证,流量调度;承担所有的微服务间的网络通信职责。Envoy作为Sidecar容器与服务部署在一起这种方式在给运维人员带来便利的同时,也必不可少的带来了一些性能问题,试想当服务数量到达千级时,业务复杂程度与性能呈相关性,此时由于Envoy要接管所有服务的出入流量,对于每一个请求的转发都需要与控制面板Mixer组件通信,这必然带来IO性能瓶颈问题,所以请求转发性能的高低成为了Istio针对Envoy需要考虑的问题,目前官方的解决方案是在Istio控制平面Mixer侧和数据平面Envoy侧分别添加两个缓存以降低大规模服务下的请求次数。

内容编辑:星云实验室 浦明 责任编辑:肖晴

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 绿盟科技研究通讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Istio: 服务网格领域的新王者
Istio 是当前 Service Mesh 领域最完善的解决方案,同源自 kubernetes 项目团队。
钟华
2019/02/12
4.4K0
Istio流量管理实现机制深度解析-基于1.4.0更新
基于1.4.0更新,和最新版本1.6.0的架构基本相同,具有较大参考价值。 目录 前言 Pilot高层架构 统一的服务模型 标准数据面 API 业务DSL语言 Istio流量管理相关组件 控制面组件 数据面组件 命令行工具 数据面标准API 基本概念和术语 XDS服务接口 XDS服务接口的最终一致性考虑 ADS聚合发现服务 Bookinfo 示例程序分析 Bookinfo程序结构 xDS接口调试方法 Envoy启动过程分析 Envoy配置分析 Bookinfo端到端调用分析 小结 参考资料 前言 Is
腾讯云原生
2020/09/10
1.3K1
Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
本文将介绍如何使用Docker Compose搭建Istio。Istio号称支持多种平台(不仅仅Kubernetes)。然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺了一些内容,而且还有坑。本文希望能补实这些内容。我认为在学习Istio的过程中,相比于Kubernetes,使用Docker Compose部署更能深刻地理解Istio各个组件的用处以及他们的交互关系。在理解了这些后,可以在其他环境,甚至直接在虚拟机上部署Istio。当然,生产环境建议使用Kubernetes等成熟的容器框架。
用户8200753
2023/10/22
5180
Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
Istio源码解析4-Istio中pilot代理的启动
上一篇中我们介绍了EnvoyXdsServer的结构以及EnvoyXdsServer的启动流程、怎么与envoy客户端建立连接,当Istio CRD配置、K8s服务事件变化后,怎么监控到事件并把相关配置传到EnvoyXdsServer的channel中,如何进行防抖及推送,最后把事件传到每个客户端的connection中。这里我们介绍下envoy客户端的启动过程以及envoy如何与istiod建立连接。
CNCF
2022/11/28
8710
Istio源码解析4-Istio中pilot代理的启动
Istio系列一:Istio的认证授权机制分析
随着虚拟化技术的不断发展,以容器为核心的微服务概念被越来越多人认可,Istio因其轻量级、服务网格管理理念、兼容各大容器编排平台等优势在近两年脱颖而出,许多公司以Istio的架构设计理念作为模板来管理自己的微服务系统,但在其势头发展猛劲之时,也有许多专家针对Istio的安全机制提出了疑问,比如在Istio管理下,服务间的通信数据是否会泄露及被第三方劫持的风险;服务的访问控制是否做到相对安全;Istio如何做安全数据的管理等等,这些都是Istio目前面临的安全问题,而我们只有深入分析其机制才能明白Istio是如何做安全的。
绿盟科技研究通讯
2019/12/11
2.8K0
Istio系列一:Istio的认证授权机制分析
Istio服务网格细节剖析
因为nginx是代理层,可以转发请求,istio也实现了流量转发的效果,肯定也有代理层,并且识别了前面创建的虚拟服务中定义的规则。
王先森sec
2023/04/24
8710
Istio服务网格细节剖析
打造企业级自动化运维平台系列(十六):服务网格 Istio 详解
官方解释:An open platform to connect, secure, control and observe services.
民工哥
2024/01/18
7970
打造企业级自动化运维平台系列(十六):服务网格 Istio 详解
[译] 在Kubernetes生产环境中运行Istio
本文翻译自 https://www.tigera.io/blog/running-istio-on-kubernetes-in-production-part-i/,作者 Alexander Lukyanchenko,发表于2019年5月。
SammyLiu
2020/02/25
1.7K0
Istio 组件概览
Istio 作为 Service Mesh 领域的集大成者, 提供了流控, 安全, 遥测等模型, 其功能复杂, 模块众多, 有较高的学习和使用门槛, 本文会对istio 1.1 的各组件进行分析, 希望能帮助读者了解istio各组件的职责、以及相互的协作关系.
腾讯云原生
2020/02/14
1.8K0
Istio Envoy 配置解读
前面我们创建了一个 Gateway 和 VirtualService 对象,用来对外暴露应用,然后我们就可以通过 ingressgateway 来访问 Bookinfo 应用了。那么这两个资源对象是如何实现的呢?
我是阳明
2023/11/06
8540
Istio Envoy 配置解读
istio 庖丁解牛(一) 组件概览
Istio 作为 Service Mesh 领域的集大成者, 提供了流控, 安全, 遥测等模型, 其功能复杂, 模块众多, 有较高的学习和使用门槛, 本文会对istio 1.1 的各组件进行分析, 希望能帮助读者了解istio各组件的职责、以及相互的协作关系.
钟华
2019/03/18
2.2K0
istio 庖丁解牛(一) 组件概览
Istio的运维-诊断工具(istio 系列五)
在参考官方文档的时候发现环境偶尔会出现问题,因此插入一章与调试有关的内容,便于简单问题的定位。涵盖官方文档的诊断工具章节
charlieroro
2020/06/11
2.9K0
Istio中的流量配置
Istio的数据面会在pod中注入两个容器:istio-init和istio-proxy。
charlieroro
2020/09/22
2.4K0
Istio中的流量配置
Istio路由管理简介
本文以Istio 1.3.0 在Kubernetes中的部署为例,结合其bookinfo例子(https://istio.io/docs/examples/bookinfo/#deploying-the-application)对Istio的 v1apha3 路由API进行简要的介绍。其中Istio采用了Evaluation Install(https://istio.io/docs/setup/install/kubernetes/)。正文内容需要读者对Kubernetes和Istio的基本概念有基本的了解。
王录华
2019/10/23
2K2
Istio路由管理简介
envoy中的iptable流量劫持
本篇是自己的一篇学习笔记,主要是为了学明白,iptable是如何在envoy里面进行流量劫持的,会从下面几个方面来介绍:
灰子学技术
2021/07/30
1.3K0
漫谈腾讯微服务平台 TSF Mesh 统一容器和虚拟机之路
随着业务的增长,一些传统企业对诸如灰度发布、服务路由、服务熔断、服务限流等服务治理的需求越来越强烈,但他们又不想对业务代码做大量的改造,因而 Service Mesh 成了他们比较好的选择;不幸的是业内比较成熟能落地的 Service Mesh 方案如 Istio 都是基于各种容器平台构建的,而这些传统企业很多没有接入容器平台也不想做容器化改造,这就导致 Service mesh 很难应用于这些传统企业或者一些非容器化的场景。
腾讯云中间件团队
2021/04/07
1.7K0
一文带你彻底厘清 Isito 中的证书工作机制
作者赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher管理委员,热衷于开源、网络和云计算。目前主要从事服务网格的开源和研发工作。 目录 Istio 安全架构 控制面证书签发流程 为什么要通过 Pilot-agent 中转? 控制面身份认证 SDS 工作原理 网格边车证书配置 Gateway 证书配置 数据面使用的所有证书 小结 参考文档 在这篇文章中,我们将探讨 Istio 是如何使用证书来实现网格中服务的身份认证和安全通信的。 本文是对 Istio 认证工作机制的深度分
腾讯云原生
2020/08/17
2.3K0
istio数据面的网络端口和健康检查
本篇文章整理了,istio(版本是1.11.2+)数据面所使用的端口,以及他的健康检查,算是读书笔记,方便后续查找翻看。
灰子学技术
2021/10/26
1.5K0
Istio 网络:深入了解流量和架构
像 Istio 这样的服务网格项目为我们的架构引入了许多功能和优势,包括更安全地管理集群微服务之间的流量、服务发现、请求路由以及服务之间的可靠通信。
Luga Lee
2021/12/10
1.3K0
Istio 网络:深入了解流量和架构
Istio 运维实战系列(1):应用容器对 Envoy Sidecar 的启动依赖问题
作者赵化冰,腾讯云高级工程师,Istio contributor,ServiceMesher管理委员,热衷于开源、网络和云计算。目前主要从事服务网格的开源和研发工作。 目录 故障现象 故障分析 解决方案 在应用启动命令中判断 Envoy 初始化状态 通过 pod 容器启动顺序进行控制 Kubernetes 支持定义 pod 中容器之间的依赖关系 解耦应用服务之间的启动依赖关系 小结 参考文档 本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些
腾讯云原生
2020/09/10
2.8K0
相关推荐
Istio: 服务网格领域的新王者
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验