searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Envoy介绍(一) – 云原生下一代网关

2023-04-23 07:01:45
203
0

诞生

Envoy 是专为大型现代SOA(面向服务架构)设计的、用C++11开发的代理和通信总线,它体积小,性能高。Envoy的角色并不只局限于网关本身,更多的是为云原生时代提供一种可以作为不同类型架构和系统的构建基础的组件,这就在很大程度上决定了它与已经很成熟的Nginx、HAProxy等网关组件存在着本质的不同。随着Envoy成为继Kubernetes与Prometheus之后在CNCF毕业第三个毕业的项目,人们对它的关注度也日趋提高。

在Envoy看来,网络对应用程序应该是透明的;而当网络和应用程序出现故障时,运维人员应该能够很容易地确定问题根源。正式在这两个理念(即网络与可观测性)的驱动下,Envoy诞生并迅速发展成为不但能够为单一服务提供高性能的代理服务还能在大型微服务架构的服务网格中扮演通信总线和通用数据面角色的强大云原生组件。

核心功能

Envoy是自包含且与语言、平台无关的,它不但有着强大的可观测性,而且提供了建立在云原生上的微服务架构对网络通信所需的几乎所有功能。

Envoy处理的是各种网络数据。具体来说,当下游服务将请求发送到Envoy后,请求会经过Envoy的filter(Envoy提供了可组合可插拔的各式各样的filter)进行处理,而后将处理后的结果路由至上游服务;当上游服务回包时,会将回包发回到Envoy,由Envoy将回包发回到下游服务。在这一过程中,Envoy会记录请求与回包的各种信息,为运维人员提供了强大的可观测性。

  • L3/L4 filter架构:Envoy提供了对L3/L4网络代理功能,这是Envoy的核心功能。Envoy提供了可以支持TCP、UDP、HTTP、TLS证书认证、Redis、Postgres、MongoDb等诸多协议的filter。
  • HTTP L7架构:HTTP的重要性是不言而喻的,因此Envoy提供了强大的、可被嵌入Envoy的HTTP连接管理子系统的filter,该子系统支持多种任务,包括请求与回包的header与body的处理,缓存、限频、路由等。此外,Envoy不但支持了HTTP1、HTTP2与HTTP3,还提供了HTTP1与HTTP2的桥接功能,即下游服务与上游服务即使使用了这两个版本的HTTP,也可在Envoy的帮助下顺利完成业务通信。
  • HTTP L7路由:Envoy的路由子系统能够根据路径、权限、内容类型、运行时值等来路由和重定向HTTP请求。
  • 对gRPC的支持:Envoy支持了这一微服务系统中常用的由google开发的RPC框架。
  • 服务发现与动态配置:为了简化部署,Envoy提供了基于DNS解析(或基于静态配置)的上游服务发现功能。而关于Envoy的配置,除了支持静态配置外,Envoy还为中心化管理模式提供了允许动态配置的API,这些API包括:后端群集的主机、后端群集本身、HTTP 路由、侦听套接字和通信加密等。
  • 健康检查:在构建网格时,Envoy推荐的方法是最终一致性的服务发现。Envoy提供了主动对上游服务的进行健康检查的机制,该机制与服务发现共同决定了上游服务集群的负载均衡策略。此外,Envoy还支持了被动的健康检查机制。
  • 负载均衡:Envoy提供了强大的负载均衡机制,它支持了自动重试、服务熔断、服务降级、本地限速、依赖外部限速服务的全局限速、请求隐藏和异常值检测等功能。未来计划为Request Racing提供支持。
  • 可观测性:Enovy提供了强大的客观的性。Envoy为所有的子系统都提供了丰富的统计数据。目前,Envoy支持statsd(及与其兼容的组件)作为统计接收器,而制作其它类型的统计接收器亦不困难。Envoy的统计数据可以通过它的管理页面直接看到,也可以通过其它组件(如Prometheus、Grafana)进行可视化的呈现。目前,在Prometheus、Grafana的生态中均可直接找到Envoy的各式各样的可视化模板。

初窥

Envoy支持了二进制安装,也支持了Docker安装;此外,Envoy还支持了热重启。

这里只介绍Debian系统的Envoy二进制安装命令,其它安装相关信息请查阅Envoy官网。

sudo apt update
sudo apt install debian-keyring debian-archive-keyring apt-transport-https curl lsb-release
curl -sL 'https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key' | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
Verify the keyring - this should yield "OK"
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt install getenvoy-envoy

此处展示一个简单的Envoy的静态配置文件:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        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
          access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          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
  clusters:
  - name: service_envoyproxy_io
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    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

上述静态配置的主要功能如下:

Envoy监听所在机器的10000端口,在获取任意域名("*")且请求path的前缀为"/"的HTTP请求后,将该请求头的host字段重写为"www.envoyproxy.io",而后将该请求路由至上游服务"www.envoyproxy.io:443"。上游服务需要对Envoy进行证书认证(TLS);Envoy产生的日志的格式为默认格式且输出至标准输出("stdout")。

参考链接

www.envoyproxy.io/docs/

0条评论
0 / 1000
Yves
6文章数
0粉丝数
Yves
6 文章 | 0 粉丝
原创

Envoy介绍(一) – 云原生下一代网关

2023-04-23 07:01:45
203
0

诞生

Envoy 是专为大型现代SOA(面向服务架构)设计的、用C++11开发的代理和通信总线,它体积小,性能高。Envoy的角色并不只局限于网关本身,更多的是为云原生时代提供一种可以作为不同类型架构和系统的构建基础的组件,这就在很大程度上决定了它与已经很成熟的Nginx、HAProxy等网关组件存在着本质的不同。随着Envoy成为继Kubernetes与Prometheus之后在CNCF毕业第三个毕业的项目,人们对它的关注度也日趋提高。

在Envoy看来,网络对应用程序应该是透明的;而当网络和应用程序出现故障时,运维人员应该能够很容易地确定问题根源。正式在这两个理念(即网络与可观测性)的驱动下,Envoy诞生并迅速发展成为不但能够为单一服务提供高性能的代理服务还能在大型微服务架构的服务网格中扮演通信总线和通用数据面角色的强大云原生组件。

核心功能

Envoy是自包含且与语言、平台无关的,它不但有着强大的可观测性,而且提供了建立在云原生上的微服务架构对网络通信所需的几乎所有功能。

Envoy处理的是各种网络数据。具体来说,当下游服务将请求发送到Envoy后,请求会经过Envoy的filter(Envoy提供了可组合可插拔的各式各样的filter)进行处理,而后将处理后的结果路由至上游服务;当上游服务回包时,会将回包发回到Envoy,由Envoy将回包发回到下游服务。在这一过程中,Envoy会记录请求与回包的各种信息,为运维人员提供了强大的可观测性。

  • L3/L4 filter架构:Envoy提供了对L3/L4网络代理功能,这是Envoy的核心功能。Envoy提供了可以支持TCP、UDP、HTTP、TLS证书认证、Redis、Postgres、MongoDb等诸多协议的filter。
  • HTTP L7架构:HTTP的重要性是不言而喻的,因此Envoy提供了强大的、可被嵌入Envoy的HTTP连接管理子系统的filter,该子系统支持多种任务,包括请求与回包的header与body的处理,缓存、限频、路由等。此外,Envoy不但支持了HTTP1、HTTP2与HTTP3,还提供了HTTP1与HTTP2的桥接功能,即下游服务与上游服务即使使用了这两个版本的HTTP,也可在Envoy的帮助下顺利完成业务通信。
  • HTTP L7路由:Envoy的路由子系统能够根据路径、权限、内容类型、运行时值等来路由和重定向HTTP请求。
  • 对gRPC的支持:Envoy支持了这一微服务系统中常用的由google开发的RPC框架。
  • 服务发现与动态配置:为了简化部署,Envoy提供了基于DNS解析(或基于静态配置)的上游服务发现功能。而关于Envoy的配置,除了支持静态配置外,Envoy还为中心化管理模式提供了允许动态配置的API,这些API包括:后端群集的主机、后端群集本身、HTTP 路由、侦听套接字和通信加密等。
  • 健康检查:在构建网格时,Envoy推荐的方法是最终一致性的服务发现。Envoy提供了主动对上游服务的进行健康检查的机制,该机制与服务发现共同决定了上游服务集群的负载均衡策略。此外,Envoy还支持了被动的健康检查机制。
  • 负载均衡:Envoy提供了强大的负载均衡机制,它支持了自动重试、服务熔断、服务降级、本地限速、依赖外部限速服务的全局限速、请求隐藏和异常值检测等功能。未来计划为Request Racing提供支持。
  • 可观测性:Enovy提供了强大的客观的性。Envoy为所有的子系统都提供了丰富的统计数据。目前,Envoy支持statsd(及与其兼容的组件)作为统计接收器,而制作其它类型的统计接收器亦不困难。Envoy的统计数据可以通过它的管理页面直接看到,也可以通过其它组件(如Prometheus、Grafana)进行可视化的呈现。目前,在Prometheus、Grafana的生态中均可直接找到Envoy的各式各样的可视化模板。

初窥

Envoy支持了二进制安装,也支持了Docker安装;此外,Envoy还支持了热重启。

这里只介绍Debian系统的Envoy二进制安装命令,其它安装相关信息请查阅Envoy官网。

sudo apt update
sudo apt install debian-keyring debian-archive-keyring apt-transport-https curl lsb-release
curl -sL 'https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key' | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
Verify the keyring - this should yield "OK"
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt install getenvoy-envoy

此处展示一个简单的Envoy的静态配置文件:

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        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
          access_log:
          - name: envoy.access_loggers.stdout
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          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
  clusters:
  - name: service_envoyproxy_io
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    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

上述静态配置的主要功能如下:

Envoy监听所在机器的10000端口,在获取任意域名("*")且请求path的前缀为"/"的HTTP请求后,将该请求头的host字段重写为"www.envoyproxy.io",而后将该请求路由至上游服务"www.envoyproxy.io:443"。上游服务需要对Envoy进行证书认证(TLS);Envoy产生的日志的格式为默认格式且输出至标准输出("stdout")。

参考链接

www.envoyproxy.io/docs/

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0