Envoy

news2024/11/24 15:08:03

一. Envoy

在这里插入图片描述

). Envoy

  • Envoy 于 2017 年 9 月作为孵化项目加入 CNCF。从孵化到毕业,Envoy 都是 CNCF 增长最快的项目之一

  • Envoy 在吞吐量和延迟方面都表现良好。这在大型云原生部署中至关重要

  • Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高

  • Envoy 是一个开源的边缘服务代理,也是 Istio Service Mesh 默认的数据平面,专为云原生应用程序设计

  • 够接收请求的流量后,然后对请求的数据做一些微处理,例如添加 Header 头或校验某个 Header 字段的内容。根据来源数据的不同,又可以分为 L3(网络层)、L4(传输层)、L7(应用层),然后转发请求,如果后端是一个集群,需要从中挑选一台机器,又涉及到负载均衡

1. 架构

官网配置说明

参考一

  • Listener: Envoy 的监听地址。Envoy 会暴露一个或多个 Listener 来监听客户端的请求。侦听器(listener)是可以由下游客户端连接的命名网络位置(例如,端口、unix 域套接字等)。Envoy 公开一个或多个下游主机连接的侦听器。一般是每台主机运行一个 Envoy,使用单进程运行,但是每个进程中,可以启动任意数量的 Listener(监听器)。目前只监听 TCP,每个监听器都独立配置一定数量的(L3/L4)网络过滤器。Listenter 也可以通过 Listener Discovery Service(LDS)动态获取
  • Listener filter: Listener 使用 listener filter(监听器过滤器)来操作链接的元数据。它的作用是在不更改 Envoy 的核心功能的情况下,添加更多的集成功能。Listener filter 的 API 相对简单,因为这些过滤器最终是在新接受的套接字上运行。在链中可以互相衔接以支持更复杂的场景,例如调用速率限制。Envoy 已经包含了多个监听器过滤器
  • Network filter:
  • HTTP connection manage:
  • **Cluster:**集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过服务发现,发现集群中的成员。Envoy 可以通过主动运行状况检查,来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员,由负载均衡策略确定
  • **XDS:**动态服务发现

2. 配置

参考一

镜像说明

  • envoyproxy/envoy-alpine : 基于 alpine 的发行镜像
  • envoyproxy/envoy-alpine-dev : 基于 alpineNightly 版本发行镜像
  • envoyproxy/envoy : 基于 Ubuntu 的发行镜像
  • envoyproxy/envoy-dev : 基于 UbuntuNightly 版本发行镜像

Envoy的启动配置文件分为两种方式:静态配置和动态配置

  • 静态配置是将所有信息都放在配置文件中,启动的时候直接加载
  • 动态配置需要提供一个 Envoy 的服务端,用于动态生成 Envoy 需要的服务发现接口,这里叫 XDS,通过发现服务来动态的调整配置信息,Istio 就是实现了v2的API
# 起一个容器测试一下
docker run -it --rm -p 9901:9901 -p 10000:10000 --name envoy-test -d -v /root/envoy/envoy.yaml:/etc/envoy/envoy.yaml  envoyproxy/envoy:v1.18.3

curl localhost:10000

envoy.yaml

网络代理程序的流程,比如作为一个代理,首先要能获取请求流量,通常是采用监听端口的方式实现;其次拿到请求数据后需要对其做微处理,例如附加 Header 或校验某个 Header 字段的内容等,这里针对来源数据的层次不同,可以分为 L3/L4/L7,然后将请求转发出去;转发这里又可以衍生出如果后端是一个集群,需要从中挑选一台机器,如何挑选又涉及到负载均衡等

  • listener : 监听器定义了 Envoy 如何处理入站请求,Envoy 会暴露一个或多个 Listener 来监听客户端的请求,目前 Envoy 仅支持基于 TCP 的监听器,一旦建立连接之后,就会将该请求传递给一组过滤器(filter)进行处理
  • filter : 过滤器。在 Envoy 中指的是一些 可插拔和可组合的逻辑处理层,是 Envoy 核心逻辑处理单元,过滤器是处理入站和出站流量的链式结构的一部分, 在过滤器链上可以集成很多特定功能的过滤器,例如,通过集成 GZip 过滤器可以在数据发送到客户端之前压缩数据
  • route_config : 路由规则配置。即将请求路由到后端的哪个集群, 路由用来将流量转发到具体的目标实例,目标实例在 Envoy 中被定义为集群
  • cluster : 服务提供方集群。Envoy 通过服务发现定位集群成员并获取服务,具体路由到哪个集群成员由负载均衡策略决定, 集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略等

最终配置

admin:
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  #host_rewrite_literal: www.envoy-demo.com
                  cluster: envoy-demo
          http_filters:
          - name: envoy.filters.http.router  
  clusters:
  - name: envoy-demo
    connect_timeout: 30s
    type: STATIC
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: envoy-demo
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 172.164.100.34
                port_value: 899
        - endpoint:
            address:
              socket_address:                           
                address: 172.164.100.34
                port_value: 900
  
1). docker 启动
docker run -it -p 9901:9901 -p 10000:10000 --name envoy -d -v /root/envoy/envoy.yaml:/etc/envoy/envoy.yaml  envoyproxy/envoy:v1.18.3

# 启动2个被代理的 nginx demo
docker run -it --name nginx-test -p 899:80 -d nginx
docker run -it --name nginx-exam -p 900:80 -d nginx

# 最总结果是可以通过 envoy 访问到 nginx 首页
curl 127.0.0.1:10000

默认 Envoy 的配置文件

admin:
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite_literal: www.envoyproxy.io
                  cluster: service_envoyproxy_io
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: service_envoyproxy_io
    connect_timeout: 30s
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_envoyproxy_io
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.envoyproxy.io
                port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: www.envoyproxy.io
2). admin

官网API 管理端

  • 管理模块
  • Envoy 的一大特色是内置的 Admin 服务,如果你在浏览器中访问 9901 端口,可以看到 Envoy admin 提供以下管理 API 端点, 通过 API 管理端可以对 Envoy 进行动态配置
admin:
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901

3). static_resources

Listener components

  • 定义静态 API
  • listeners(监听器) 可以配置 多个 filter_chainsfilter_chains 中的 filters 是过滤器定义,Envoy 内置了很多 filters

filters 过滤器类型:

  • envoy.filters.network.connection_limit
  • envoy.filters.network.direct_response
  • envoy.filters.network.dubbo_proxy
  • envoy.filters.network.echo
  • envoy.filters.network.envoy_mobile_http_connection_manager
  • envoy.filters.network.ext_authz
  • envoy.filters.network.http_connection_manager
  • envoy.filters.network.local_ratelimit
  • envoy.filters.network.mongo_proxy
  • envoy.filters.network.ratelimit
  • envoy.filters.network.rbac
  • envoy.filters.network.redis_proxy
  • envoy.filters.network.set_filter_state
  • envoy.filters.network.sni_cluster
  • envoy.filters.network.sni_dynamic_forward_proxy
  • envoy.filters.network.tcp_proxy
  • envoy.filters.network.thrift_proxy
  • envoy.filters.network.wasm
  • envoy.filters.network.zookeeper_proxy

以下扩展仅在contrib图像中可用:

  • envoy.filters.network.client_ssl_auth
  • envoy.filters.network.generic_proxy
  • envoy.filters.network.golang
  • envoy.filters.network.kafka_broker
  • envoy.filters.network.kafka_mesh
  • envoy.filters.network.mysql_proxy
  • envoy.filters.network.postgres_proxy
  • envoy.filters.network.rocketmq_proxy
  • envoy.filters.network.sip_proxy
static_resources:
  listeners:
  - name: listener_0								# 监听器的名称,可以自己定义
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0							# 监听器的地址
        port_value: 10000							# 监听器的端口
    filter_chains:									# 配置过滤器链
    - filters:										# 过滤器
      # 指定要使用哪个过滤器,下面是 envoy 内置的网络过滤器,如果请求是 HTTP 它将通过此 HTTP 过滤器
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          # 需要配置下面的类型,启用 http_connection_manager 过滤器,除了该过滤器,Envoy 中还内置了一些其他过滤器,包括 Redis、Mongo、TCP 等
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          access_log: 								# 连接管理器发出的 HTTP 访问日志的配置
          - name: envoy.access_loggers.stdout 		# 输出日志到 stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          route_config:								# 路由配置
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]						# 要匹配的主机名列表,*表示匹配所有主机	
              routes:
              - match:
                  prefix: "/"						# 要匹配的 URL 前缀
                route:								# 路由规则配置
                  host_rewrite_literal: www.envoy-demo.com
                  cluster: envoy-demo				# 在下面的 clusters 中会定义一个 envoy-demo
          http_filters:								# 定义http过滤器链
          - name: envoy.filters.http.router			# 调用7层的路由过滤器
4). clusters
  • 当请求与过滤器匹配时,该请求会被发送到集群。如上 static_resources 的配置将主机定义为访问 HTTPS 的 www.envoy-demo.com 域名,如果定义了多个主机,Envoy 将执行轮询策略

官网clusters type 配置

  • STATIC

    (DEFAULT) ⁣Refer to the static discovery type for an explanation

    STATIC 是最简单的服务发现类型,配置显式指定每个上游主机的已解析网络名称(IP 地址/端口、unix 域套接字等)

  • STRICT_DNS

    ⁣Refer to the strict DNS discovery type for an explanation

    当使用 STRICT_DNS 类型的服务发现时,Envoy 将持续并异步地解析指定的 DNS 目标,DNS 结果中每个返回的 IP 地址将被视为上游集群中的显式主机。这意味着如果查询返回三个 IP 地址,Envoy 将假定该集群有三台主机,并且所有三台主机应该负载均衡。如果有主机从 DNS 返回结果中删除,则 Envoy 会认 为它不再存在,并且会将它从所有的当前连接池中排除

  • LOGICAL_DNS

    ⁣Refer to the logical DNS discovery type for an explanation

  • EDS

    ⁣Refer to the service discovery type for an explanation

  • ORIGINAL_DST

    ⁣Refer to the original destination discovery type for an explanation

官网 dns_lookup_family 配置说明

  clusters:
  - name: envoy-demo
    connect_timeout: 30s
    type: STATIC				# 当选择 V4_ONLY 时,DNS 解析器将仅执行 IPv4 系列中的地址查找
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: envoy-demo
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 172.164.100.34
                port_value: 899
        - endpoint:
            address:
              socket_address:
                address: 172.164.100.34
                port_value: 900 
5). transport_socket
  • transport_socket 部分告诉 Envoy 使用 HTTPS
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: www.envoyproxy.io

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java|IDEA 中添加编译参数 --add-exports

方法1 File > Settings > Build, Execution, Deployment > Compiler > Java Compiler > Javac Options > Override compiler parameters per-module 点击: 点击OK 双击Compliation options,输入后回车: 方法2 找到出错…

【S32DS RTD实战】-1.4-基于S32K3创建配置FreeRTOS工程-控制GPIO点亮LED

目录(附DEMO,可下载,讲解过程超详细) 1 下载FREERTOS RTD 1.1 安装FREERTOS RTD 2 确认S32DS已安装的AUTOSAR RTD 3 基于S32K3创建&配置FREERTOS工程 3.1 选择SDKs 3.2 增加FreeRTOS模块 3.3 修改MCU芯片封装 3.4 配置GPIO 3.5 修改HSE CLK…

python如何更改代码背景图片,背景主题(黑色护眼)和各类文本颜色(python进阶必看,爱了爱了)

一、在 PyCharm 中设置图片背景的方法如下: 打开 PyCharm 的设置窗口,在设置窗口中找到 "Appearance & Behavior" -> "Appearance" 选项卡。在 "Appearance" 选项卡中,找到 "Background Image&qu…

HarmonyOs4.0基础

目录 一、HarmonyOs系统定义 1.1系统的技术特性(三大特征) 1.1.1、硬件互助、资源共享 1.1.2、一次开发、多端部署(面向开发者) 1.1.3、统一OS,弹性部署(支持多种API:ArkTs、JS、C/C、Java) 1.2、系统的技术架构 二、Harmony OS项目搭建 2.1、(D…

同步与互斥(二)

一、谁上锁就由谁解锁? 互斥量、互斥锁,本来的概念确实是:谁上锁就得由谁解锁。 但是FreeRTOS并没有实现这点,只是要求程序员按照这样的惯例写代码。 main函数创建了2个任务: 任务1&#xff1…

文件:文本文件和二进制文件 详解

目录 0 引言1 文本文件1.1 是如何存储的?1.2 文件拓展名 2 二进制文件2.1 是如何存储的?2.2 分类2.2.1 图像文件2.2.2 音频文件2.2.3 视频文件2.2.4 可执行文件 🙋‍♂️ 作者:海码007📜 专栏:C专栏&#x…

GD32F4中断向量查询

中断向量表 中断向量对应函数 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ;…

行为型设计模式(三)状态模式 备忘录模式

状态模式 State 1、什么是状态模式 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,将对象的行为包装在不同的状态类中,对象在运行时根据内部状态的改变而改变它的行为。 2、为什么使用状态模式 封装了…

【数字图像处理】实验四 图像分割

一、实验内容: 1. 熟悉和掌握利用Matlab工具进行数字图像的读、写、显示等数字图像处理基本步骤。 2. 熟练掌握各种图像分割的基本原理及方法。 3. 能够从深刻理解图像分割,并能够思考拓展到一定的应用领域。 二、实验…

雷军1992年发表的计算机论文,强啊!

提起雷军,相信大家都非常熟悉了,90年代初毕业于武大计算机系,后来一路创业,现如今在相应领域的成就也有目共睹。 之前咱们这里也分享过雷军早年间写的文字博客,他曾在早期博客中讲述了自己的编程之路,以及当…

机器学习 | 概率图模型

见微知著,睹始知终。 见到细微的苗头就能预知事物的发展方向,能透过微小的现象看到事物的本质,推断结论或者结果。 概率模型为机器学习打开了一扇新的大门,将学习的任务转变为计算变量的概率分布。 实际情况中,各个变量…

一个简单的 HTTP 请求和响应服务——httpbin

拉取镜像 docker pull kennethreitz/httpbin:latest 查看本地是否存在存在镜像 docker images | grep kennethreitz/httpbin:latest 创建 deployment,指定镜像 apiVersion: apps/v1 kind: Deployment metadata:labels:app: httpbinname: mm-httpbinnamespace: mm-…

FPC柔性排线用什么胶水能固定到线路板上?

为了固定FPC柔性排线到线路板上,可以使用特殊用于电子组装的胶水。常用的胶水类型有: 1.氰基丙烯酸酯胶水(Cyanoacrylate) 被称为“超级胶水”或“快干胶水”。这种胶水对FPC通常有很好的附着力。 2.环氧树脂胶水 环氧树脂胶水…

C++之深拷贝和浅拷贝

目录 浅拷贝 深拷贝 赋值运算符重载的深拷贝 在学习C类和对象时我们学习了浅拷贝,本期我们将再次回顾浅拷贝并为大家讲述深拷贝的概念。 浅拷贝 在学习类和对象时我们学习了拷贝构造函数的概念,而且我们也知道,因为拷贝构造函数属于类的默…

02|用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统

02|用LangChain快速构建基于“易速鲜花”本地知识库的智能问答系统 项目及实现框架 我们先来整体了解一下这个项目。 项目名称:“易速鲜花”内部员工知识库问答系统。 项目介绍:“易速鲜花”作为一个大型在线鲜花销售平台,有自…

SpringCloudGateway网关处拦截并修改请求

SpringCloudGateway网关处拦截并修改请求 需求背景 老系统没有引入Token的概念,之前的租户Id拼接在请求上,有的是以Get,Param传参形式;有的是以Post,Body传参的。需要在网关层拦截请求并进行请求修改后转发到对应服务。…

软件工程快速复习(期末急救)

每个同学要假想自己是一个项目经理,去完成一个软件项目,比如医院管理系统,自动设备控制系统等,以面向结构的软件工程方法,说出完成项目的步骤,涉及到的具体技术。初步了解面向对象的方法的与面向结构的方法…

Linux网络编程——字节序

一、概念 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 二、分类 字节序有两者常见序: 1. Big-Endian(大端):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。如&#x…

量化交易学习笔记:XGBoost 在量化选股中的应用

一、引言 本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验,方便与深度学习模型进行对比实践。 二、算法介绍 XGBoost 是在 Gradient Boosting(梯度提升)框架下实现的机器学习算法,全称为“极限梯度提…

图神经网络并在 TensorFlow 中实现

asokraju.medium.com 一、说明 本文将引导您了解图神经网络 (GNN) 并使用 TensorFlow 实现该网络。在后续的 文章中,我们讨论 GNN 的不同变体及其实现。这是一个分步计划: 图神经网络 (GNN) 的使用:我们首先讨论 GNN 是什么、它们如何工作以及…