Envoy

2023-12-22 07:52
文章标签 envoy

本文主要是介绍Envoy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 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.3curl 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: TCPaddress: 0.0.0.0port_value: 9901
static_resources:listeners:- name: listener_0address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httpcodec_type: AUTOroute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:#host_rewrite_literal: www.envoy-demo.comcluster: envoy-demohttp_filters:- name: envoy.filters.http.router  clusters:- name: envoy-democonnect_timeout: 30stype: STATICdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: envoy-demoendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 172.164.100.34port_value: 899- endpoint:address:socket_address:                           address: 172.164.100.34port_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: TCPaddress: 0.0.0.0port_value: 9901
static_resources:listeners:- name: listener_0address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:host_rewrite_literal: www.envoyproxy.iocluster: service_envoyproxy_iohttp_filters:- name: envoy.filters.http.routerclusters:- name: service_envoyproxy_ioconnect_timeout: 30stype: LOGICAL_DNS# Comment out the following line to test on v6 networksdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: service_envoyproxy_ioendpoints:- lb_endpoints:- endpoint:address:socket_address:address: www.envoyproxy.ioport_value: 443transport_socket:name: envoy.transport_sockets.tlstyped_config:"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContextsni: www.envoyproxy.io
2). admin

官网API 管理端

  • 管理模块
  • Envoy 的一大特色是内置的 Admin 服务,如果你在浏览器中访问 9901 端口,可以看到 Envoy admin 提供以下管理 API 端点, 通过 API 管理端可以对 Envoy 进行动态配置
admin:address:socket_address:protocol: TCPaddress: 0.0.0.0port_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: TCPaddress: 0.0.0.0							# 监听器的地址port_value: 10000							# 监听器的端口filter_chains:									# 配置过滤器链- filters:										# 过滤器# 指定要使用哪个过滤器,下面是 envoy 内置的网络过滤器,如果请求是 HTTP 它将通过此 HTTP 过滤器- name: envoy.filters.network.http_connection_managertyped_config:# 需要配置下面的类型,启用 http_connection_manager 过滤器,除了该过滤器,Envoy 中还内置了一些其他过滤器,包括 Redis、Mongo、TCP 等"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httpaccess_log: 								# 连接管理器发出的 HTTP 访问日志的配置- name: envoy.access_loggers.stdout 		# 输出日志到 stdouttyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLogroute_config:								# 路由配置name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]						# 要匹配的主机名列表,*表示匹配所有主机	routes:- match:prefix: "/"						# 要匹配的 URL 前缀route:								# 路由规则配置host_rewrite_literal: www.envoy-demo.comcluster: envoy-demo				# 在下面的 clusters 中会定义一个 envoy-demohttp_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-democonnect_timeout: 30stype: STATIC				# 当选择 V4_ONLY 时,DNS 解析器将仅执行 IPv4 系列中的地址查找dns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: envoy-demoendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 172.164.100.34port_value: 899- endpoint:address:socket_address:address: 172.164.100.34port_value: 900 
5). transport_socket
  • transport_socket 部分告诉 Envoy 使用 HTTPS
    transport_socket:name: envoy.transport_sockets.tlstyped_config:"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContextsni: www.envoyproxy.io

这篇关于Envoy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523164

相关文章

Envoy源码分析之Dispatcher

Dispatcher 在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一个Dispatcher就是一个EventLoop,其承担了任务队列、网络事件处理、定时器、信号处理等核心功能。在Envoy threading model这篇文章所提到的EventLoop(Each worker thread runs a “non-blocking” even

「前所未有!」服务网格与 Envoy Gateway,客户端可用性和弹性双提升,完美演绎 IT 新时代!

目录 如何从客户端角度思考服务的可用性和弹性 每个服务都有一个“网关” 以三个九的价格获得五个九的高可用能力:一个真实的案例 服务网格中的客户端负载均衡:超越组件之和 重试 异常检测 断路器 超时 限流 低成本下的高感知可用性 下一步 参考链接 如何从客户端角度思考服务的可用性和弹性 这是一系列关于 Envoy Gateway 价值的文章之一,该网

istio :envoy的限制端口

Istio sidecar代理使用以下端口和协议。 为避免端口与sidecar冲突,应用程序不应使用特使使用的任何端口。

基于 K8s/K3s 的 Envoy 入门

Envoy基础 Envoy 是一个开源的边缘服务代理,也是 Istio Service Mesh 默认的数据平面,专为云原生应用程序设计。 下面我们通过一个简单的示例来介绍 Envoy 的基本使用。 1 代理配置 Envoy 使用 YAML 配置文件来控制代理的行为。在下面的步骤中,我们将使用静态配置接口来构建配置,也意味着所有设置都是预定义在配置文件中的。此外 Envoy 也支持动态配置

Wasm C++ Filter 拓展 Envoy

Wasm C++ Filter 这篇博客演示了一个用 C++ 编写的入门 Envoy Wasm Filter,它将返回值注入到 HTTP 响应的 body 中,并且更新与添加 header。 通过该文章完成构建我们的 C++ Wasm Filter 所需的步骤,并使用 Envoy 运行它。 启动所有的应用进程 首先让我们启动容器应用 一个使用 Wasm 过滤器的 Envoy 代理

使用 Golang 扩展 Envoy 代理 - WASM 过滤器

Envoy 是一个开源的服务代理,Envoy 专为云原生应用而设计。 Envoy具有很多的特性,如连接池、重试机制、TLS 管理、压缩、健康检查、故障注入、速率限制、授权等。而这些功能都是通过内置的 http 过滤器 实现的。现在,我们我们介绍一个特殊的过滤器 - WASM 过滤器。         这篇文章不会解释什么是 WASM,所以对 WASM 不做过多的介绍,而是

深入理解Istio服务网格(一)数据平面Envoy

一、服务网格概述(service mesh) 在传统的微服务架构中,服务间的调用,业务代码需要考虑认证、熔断、服务发现等非业务能力,在某种程度上,表现出了一定的耦合性 服务网格追求高级别的服务流量治理能力,认证、熔断、服务发现这些能力更多的是平台测的能力。将业务测和平台测能力解耦,开发人员只关心业务测的能力。每个服务实例都有一个代理,服务的入站流量、出站流量都先经过代理,代理不进行业务处理,只

【云原生】整合K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy

背景 本文把前面的代码整理一遍,不仅仅是demo层面,而是考虑到放进生产中使用,且尽可能用高版本,关于这块技术,网上的文章真是一言难尽,要么就是个概念,要么就是把官网的demo拿过来跑一遍,质量太差。 我本地有Istio,也安装了K8s和Docker,这些都可以根据官网来安装,我这里就忽略了。 我本地使用的版本情况 jdk:17spring-boot-starter-parent:2.7.

grpc基于envoy治理 java实现 control panel

envoy的部署与架构: 见SRE空间:envoy envoy基础(1.7版本的):  PDF 业内厂商实现案例: 网易轻舟: 其中有几个关注点: 1.轻舟的这套服务网格技术的研发成员有C++的研发人员 2.轻舟的envoy部署模式是sidecar模式(要是按照这种模式部署,对雪球来说步子跨的是不是有些大?)  PDF 从kong到envoy的演进:https://zhuanl

服务网关-apisix、envoy实践前期

初衷: 1.治理东西流量 eg:gPRC基于uid灰度,分流 2.grpc的服务注册、发现 eg:替代现有的zookeeper注册中心   背景: 为什么不选择客户端负载均衡方式? 使用gRPC客户端负载均衡器,该负载均衡器被嵌入到gRPC客户端库中。 这样,每个客户端微服务都可以执行自己的负载均衡。 但是,最终的客户非常脆弱,需要大量的自定义代码来提供任何形式的弹性,指标或