0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ubuntu下部署envoy并作为前端代理方法

马哥Linux运维 来源:稀土掘金技术社区 2024-01-08 18:08 次阅读

前言

Envoy 是一个开源的高性能、可扩展的代理服务,最初由 Lyft 公司开发。它设计用于处理现代的微服务架构中的网络通信,并提供了许多功能,包括负载均衡、服务发现、路由、认证、授权等。Envoy 被广泛用于构建和部署云原生应用程序以及微服务体系结构。

本文将通过将envoy作为前端代理来演示envoy的安装、配置和简单使用。

本文使用环境

Ubuntu 22.04.3 LTS Desktop 64-bit

1 安装

envoy 编译比较复杂,可以使用Envoy 社区提供的docker镜像和getenvoy项目,不过getenvoy所使用的版本比较老。在Linux下最简单的方式还是直接使用官方的envoy预编译二进制文件。

1.1 下载

从Envoy 的 GitHub 发行版页面下载 Ubuntu 的最新版的envoy预编译二进制文件,这里选择“envoy-1.28.0-linux-x86_64”

https://github.com/envoyproxy/envoy/releases

4cd6d37c-ae0c-11ee-8b88-92fbcf53809c.jpg4ce16a3a-ae0c-11ee-8b88-92fbcf53809c.jpg

1.2 安装envoy

新建项目目录,将文件复制到该目录下(本文使用/home/zhg/Mine/Workplace/getenvoy/)

下载完成后如果是.tar.gz则需要解压

如果是(application/x-executable)可执行文件,则需要添加添加可执行权限


# 重命名为"envoy"方便输入命令
sudo mv envoy-1.28.0-linux-x86_64 envoy


# 添加可执行权限
chmod +x envoy 


通过以下命令可以查看envoy版本,以验证envoy是否正确安装

./envoy --version

4cf1353c-ae0c-11ee-8b88-92fbcf53809c.jpg

2 配置

配置参考官网

www.envoyproxy.io/docs/envoy/…

envoy 可以通过静态配置和动态配置两种方式实现,静态文件通常yaml格式的文件进行配置,主要字段有:

listeners(监听器)

listeners 字段用于定义Envoy监听的网络地址和协议。它描述了Envoy如何接收和处理传入的连接请求。


listeners:
-   name:给监听器命名,方便引用。
-   address:指定监听的 IP 地址和端口。
-   filters:指定用于处理传入连接的过滤器链,包括协议转码、路由、TLS 等。

filter(过滤器)

filters字段通常用于通过配置文件引入和加载Envoy的各种过滤器。过滤器是Envoy的功能组件,用于在请求或响应的处理过程中执行特定的操作。过滤器可以添加、修改或删除请求或响应的头信息,执行转换,执行日志记录等操作。

envoy.http_connection_manager 是Envoy的HTTP连接管理器,它用于处理HTTP请求和响应。它是Envoy配置的核心组件之一,负责管理HTTP连接的生命周期、处理HTTP协议、执行各种过滤器等。该连接管理器允许您配置各种HTTP功能,包括路由、重试、负载均衡、超时等

filters:                           # 过滤器列表
  - name: envoy.http_connection_manager   # 使用 Envoy 的 HTTP 连接管理器过滤器
    typed_config:                   # 配置该过滤器的类型和参数
      "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
      codec_type: HTTP2             # 使用 HTTP/2 编解码器
      stat_prefix: ingress_http     # 用于生成统计信息的前缀
      route_config:                  # 路由配置
        name: local_route           # 路由的名称
        virtual_hosts:               # 虚拟主机列表

             

clusters(集群)

clusters 字段用于定义集群(clusters)。集群是Envoy用于负载均衡和路由请求的基本单元,定义后端服务的地址、端口、协议等信息


clusters:
-  name:定义集群的名称。
-  type:指定集群类型,如 static, strict_dns, sds 等。
-  connect_timeout:连接超时时间。
-  lb_policy:负载均衡策略,如 round_robin, least_request 等。
-  hosts:指定集群的后端主机。
-  tls_context:配置 TLS。

routes(路由)

routes 字段用于定义路由规则。路由规则确定了Envoy在接收到请求时应该将其转发到哪个后端服务


routes:
-   prefix:URL 前缀匹配。
-   cluster:指定请求应该转发到的集群。
-   timeout:设置请求超时时间。
-   retry_policy:配置请求重试策略。

admin(管理控制)

admin是用于提供管理和监控功能的配置选项。通过 Envoy 的 admin`接口,用户可以查看运行时统计信息、配置信息,执行一些诊断命令等


admin:
-   access_log_path:指定访问日志文件的路径。
-   address:指定 Envoy 管理界面的监听地址和端口。

以下是一份配置实例,在项目目录打开终端,输入以下命令创建配置文件,并将配置内容复制到文件中。

touch envoy_conf.yaml


# Envoy 管理配置
admin:
  # 访问日志路径
  access_log_path: "/home/zhg/Mine/Workplace/getenvoy/envoy.log"
  # 管理界面监听地址和端口
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 10001


# 静态资源配置
static_resources:
  listeners:
    # 定义一个监听器,监听在 0.0.0.0:10000
    - address:
        socket_address: { protocol: TCP, address: 0.0.0.0, port_value: 10000 }
      filter_chains:
        - filters:
            # 使用 HTTP 连接管理器过滤器
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                codec_type: auto
                stat_prefix: http
                access_log:
                  # 记录 HTTP 请求到文件
                  - name: envoy.access_loggers.file
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
                      path: "/home/zhg/Mine/Workplace/getenvoy/envoy_http.log"
                      log_format:
                        text_format: |
                          >>>>
                          start_time: "%START_TIME%"  
                          method: "%REQ(:METHOD)%", original_path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%", protocol: "%PROTOCOL%", response_code: "%RESPONSE_CODE%", response_flags: "%RESPONSE_FLAGS%"
                          user_agent: "%REQ(USER-AGENT)%"
                          authority: "%REQ(:AUTHORITY)%"
                          upstream_host: "%UPSTREAM_HOST%"
                          request_id: "%REQ(X-REQUEST-ID)%"
                          custom_header: "%REQ(custom_header)%"
                          static_header: "%REQ(static_header)%"
                route_config:
                  name: search_route
                  virtual_hosts:
                    - name: backend
                      domains:
                        - "*"
                      routes:
                        - match:
                            prefix: "/"
                          route:
                            # 将请求发送到 baidu 集群
                            cluster: baidu
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
    - name: baidu
      connect_timeout: 1s
      # 使用 STRICT_DNS 模式进行 DNS 解析
      type: STRICT_DNS
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: baidu
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 目标服务器地址
                      address: www.baidu.com
                      port_value: 80
   

   

3 运行envoy

写好配置文件后,就可以在项目目录打开终端,输入以下命令启动envoy


# 通过静态配置文件直接启动 Envoy
# -l debug :设置日志级别为debug,可省略
./envoy -c envoy_conf.yaml -l debug


//查看帮助
envoy --help


4.测试

4.1 查看envoy admin

打开浏览器,输入localhost:10001,可以看到envoy已经启动起来,可以正常访问admin页面

4cffaf54-ae0c-11ee-8b88-92fbcf53809c.jpg

4.2 代理配置验证

普通 curl 请求

curl -vvv baidu.com

zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv baidu.com
*   Trying 39.156.66.10:80...
* Connected to baidu.com (39.156.66.10) port 80 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Thu, 16 Nov 2023 0354 GMT
< Server: Apache
< Last-Modified: Tue, 12 Jan 2010 1300 GMT
< ETag: "51-47cf7e6ee8400"
< Accept-Ranges: bytes
< Content-Length: 81
< Cache-Control: max-age=86400
< Expires: Fri, 17 Nov 2023 0354 GMT
< Connection: Keep-Alive
< Content-Type: text/html
< 



* Connection #0 to host baidu.com left intact






4d130b26-ae0c-11ee-8b88-92fbcf53809c.jpg

使用 curl 访问 Envoy,并添加 Header 字段 host: baidu.com

curl -v -H 'Host: baidu.com' 127.0.0.1:10000

可以看到请求被转发到了 baidu.com,在响应头中,server: envoy表示服务器使用的是 Envoy 代理。这是 Envoy 代理的标识,表示请求经过了 Envoy


zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv -H 'Host: baidu.com' 127.0.0.1:15001
*   Trying 127.0.0.1:15001...
* Connected to 127.0.0.1 (127.0.0.1) port 15001 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< accept-ranges: bytes
< cache-control: private, no-cache, no-store, proxy-revalidate, no-transform
< content-length: 2381
< content-type: text/html
< date: Thu, 16 Nov 2023 03:45:17 GMT
< etag: "588604dc-94d"
< last-modified: Mon, 23 Jan 2017 13:27:56 GMT
< pragma: no-cache
< server: envoy
< set-cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
< x-envoy-upstream-service-time: 18
< 

...省略...

* Connection 

4d2554de-ae0c-11ee-8b88-92fbcf53809c.jpg

4.3 代理到本机web服务

4.3.1 修改配置

在clusters字段下增加一个名为"localserver"的集群,配置如下:

  clusters:
    - name: baidu
      connect_timeout: 1s
      # 使用 STRICT_DNS 模式进行 DNS 解析
      type: STRICT_DNS
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: baidu
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 目标服务器地址
                      address: www.baidu.com
                      port_value: 80
    - name: localserver
      connect_timeout: 1s
      # 使用 STATIC 模式,直接指定目标地址
      type: STATIC
      dns_lookup_family: V4_ONLY
      lb_policy: round_robin
      load_assignment:
        cluster_name: localserver
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      # 本地服务器地址
                      address: 127.0.0.1
                      port_value: 9001




并将routes的cluster 修改为改localserver

  routes:
    - match:
        prefix: "/"
      route:
        # 将请求发送到 baidu 集群
        cluster: localserver


4.3.2 使用Python搭建简易HTTP 服务器

适用:小型 web 项目在局域网内的预览

编写网页

新建项目目录和文件:web/index.html,并输入以下内容,创建一个简易的网页以进行验证。





    
    
    
    Document


     WebServer for hello Envoy! 


4.3.3 启动http服务器

在项目目录运行启动http服务器

# 服务器默认监听端口是 8000,支持自定义端口号
python3 -m http.server 9001


#服务器默认工作目录为当前目录,可通过 -d/--directory 参数指定工作目录
python -m http.server --directory /tmp/




4.3.4 验证地址

输入以下命令获取ubuntu的本机IP地址,假设ip是192.168.2.30


# ubuntu 查看本机ip地址
$ ip a


2.访问网页 例如ubuntu虚拟机所在的主机,使用浏览器连接ubuntu的ip地址,端口是envoy的监听端口9000,即

http://192.168.2.30:10000/

这时候应该能看到Ubuntu本地服务器web/index.html网页的内容,注意这里用的是10000端口,这是envoy程序的监听端口,如果是9001则是http服务器的端口,

4d3df98a-ae0c-11ee-8b88-92fbcf53809c.jpg

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79543
  • 网络通信
    +关注

    关注

    4

    文章

    728

    浏览量

    29548
  • Ubuntu
    +关注

    关注

    5

    文章

    533

    浏览量

    28834
  • 云原生
    +关注

    关注

    0

    文章

    222

    浏览量

    7843

原文标题:ubuntu 下部署envoy 并作为前端代理方法

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ubuntu 用socks5代理上网,求助

    ubuntu 11.10 里面有没有类似proxifier的代理上网工具呢?
    发表于 07-18 15:28

    【OK210试用体验】搭建远程ubuntu服务之二 ubuntu代理上网

    本帖最后由 耳东的刀 于 2015-7-24 12:58 编辑 因为学校是锐捷上网。一个人一个锐捷号,懒得找学校的网络管理员,ubuntu安装锐捷锐捷客户端我不会,那么设置代理上网相对简单
    发表于 07-24 12:56

    【Rico Board试用体验】Amazon Iot物联网终端之五部署虚拟机下的Ubuntu

    命令直接访问GPIO的功能,但是仅仅适合测试,不适合作为开发项目的方法。开发在windows系统下的开发工具,均需要交叉编译器,而使用linux开发平台,则可以直接用GCC-arm编译器生成代码,并且
    发表于 11-03 15:17

    浅谈Service Mesh体系中的Envoy

    部署和使用Envoy能够带来很好的运行效率。非常有意思的表述,Envoy并没有把追求极致性能作为目标,那么其架构设计会弱化性能这块吗?目前业内公认
    发表于 07-12 17:25

    基于Ubuntu的Django+uwsgi+nginx项目部署步骤

    Ubuntu 部署Django+uwsgi+nginx项目前 搭建必要环境
    发表于 07-09 09:36

    Linux服务器的vue项目部署方法

    最近刚到新公司,正好之前没接触过这方面的东西。最初仅仅是猜想。最后也没想到Tomcat真的可以部署前端页面
    发表于 07-16 08:10

    JAVA如何生成UUID并作为数据库表的ID

    JAVA生成UUID并作为数据库表的ID
    发表于 06-02 16:59

    qt源码库在树莓派中的部署方法

    接安装qt。本文介绍最普遍的部署方式,就是在pc端的ubuntu中交叉编译库源码,然后上传编译好的库到树莓派,最后配置qt creator交叉编译的kit来实现在pc端编译自码程序,上传到树莓派运行。...
    发表于 12-24 06:44

    XR806是否可用类似SDIO接口与CPU连接,并作为Linux的一个外设网卡设备?

    如题:XR806是否可用类似SDIO接口与CPU连接,并作为Linux的一个外设网卡设备?
    发表于 03-11 15:02

    使用 Canonical MAAS 部署 openEuler 测试

    虛拟机资源,实现物理物理服务器的自助服务,远程访问。MAAS目前支持 Ubuntu、CentOS、RHEL、Windows、ESXI 和自定义镜像的部署。当在数据中心管理成百上千的物理服务器,比如
    发表于 08-24 11:43

    在Linux系统下部署RocketMQ单机实例

    前言这篇文章以4.3.0版本为标准进行讲述在linux下部署RocketMQ单机实例,在此之前需要已配置JAVA环境。下载程序包直接使用一般就下载已经编译好的二进制文件就好了,下载好以后&
    发表于 11-11 16:29

    ubuntu使用方法与技巧

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的。
    发表于 11-22 16:03 1.8w次阅读

    Ubuntu系统Linux学习环境的配置方法

    Ubuntu系统Linux学习环境的配置方法分享: Ubuntu14.04出来后我心血来潮卸载了fedora系统想换下Ubuntu系统尝尝鲜,冲动的结果是发现原来在fedora学习li
    发表于 11-21 14:45 1062次阅读

    差压液位计的常见故障及处理方法

    3、4号机组差压液位计有两种布置方式:其一是正压侧仪表管线上设置平衡容器与被测容器上部空间连通,负压侧仪表管线与被测容器下部相连并作为测量零点,适用于密闭容器;其二是正压侧仪表管线与被测容器下部相连
    发表于 08-20 09:05 1.1w次阅读

    ubuntu与windows之间的文件互传方法

    。因此在开发的过程中会经常在 Windows和 Ubuntu两者间切换,同时还需要频繁的进行文件互传。一般情况下,ubuntu 与 windows 之间的文件互传有如下三种方法
    的头像 发表于 04-17 15:03 7602次阅读
    <b class='flag-5'>ubuntu</b>与windows之间的文件互传<b class='flag-5'>方法</b>