envy【3】从 HAProxy 迁移到 Envoy 代理

news/2024/12/21 22:20:33/

文章目录

    • 1.简介
    • 2. HAProxy 示例
    • 3. Frontend Configuration
      • 3.1 Envoy Listeners
    • 4. Backend Configuration
      • 4.1 Envoy Filters and Clusters
    • 5. 记录访问和错误
    • 6. 启动

1.简介

这个场景旨在支持你从 HAProxy 迁移到 Envoy Proxy。它将帮助您将以前对 HAProxy 的任何经验和理解应用到 Envoy。

你将学到如何:

  • 配置 Envoy 代理服务器配置和设置。
  • 配置 Envoy 代理以将流量代理到外部服务。
  • 配置访问和错误日​​志。

在场景结束时,您将了解核心 Envoy Proxy 功能,以及如何将现有 HAProxy 脚本迁移到平台。

2. HAProxy 示例

可以通过打开在编辑器中查看示例 HA 代理配置haproxy.cfg

globallog /dev/log    local0log /dev/log    local1 noticeuser haproxygroup haproxydaemondefaultslog     globalmode    httpoption  httplogoption  dontlognullfrontend localnodesbind *:8080mode httpdefault_backend nodesbackend nodesmode httpbalance roundrobinoption forwardforserver web01 172.18.0.3:80 checkserver web02 172.18.0.4:80 check

HA 代理配置通常有四个关键要素:

  • 配置 HA 代理服务器、日志结构和进程范围的安全性和性能调整,这些调整会在低级别影响 HAProxy。这是在所有实例中全局定义的。请参阅中的global部分haproxy.cfg
  • 配置默认设置适用于它之后的所有frontendbackend部分。请参阅 中的defaults部分haproxy.cfg
  • 配置 HA 代理以接受传入请求。本节定义客户端可以连接到的 IP 地址和端口。请参阅 中的frontend部分haproxy.cfg
  • 配置如何处理流量的位置。它定义了一组将被负载平衡并分配来处理请求的服务器。请参阅 中的backend部分haproxy.cfg

并非所有配置都适用于 Envoy 代理,由于不同的架构和决策,某些方面不需要。Envoy Proxy 有四种关键类型,支持 HA Proxy 提供的核心基础设施。核心是:

  • Listeners: 它们定义了 Envoy 代理如何接受传入的请求。目前,Envoy Proxy 仅支持基于 TCP的侦听器。建立连接后,它会传递给一组过滤器进行处理。
  • Filters:它们是可以处理入站和出站数据的管道架构的一部分。此功能启用过滤器,例如 Gzip,它在将数据发送到客户端之前压缩数据。
  • Routers:它们将流量转发到所需的目的地,定义为集群。
  • Clusters:它们定义流量的目标端点和配置设置。

我们将使用这四个组件来创建 Envoy 代理配置以匹配定义的 HA 代理配置。Envoy 一直专注于 API 和动态配置。在这种情况下,配置将使用 HA 代理定义的静态、硬编码资源。

3. Frontend Configuration

在 HTTP 配置块中,HA 代理配置侦听端口 8080,所有流量都由后端节点处理。

frontend localnodesbind *:8080mode httpdefault_backend nodes

在 Envoy Proxy 中,这个概念由 Listeners 处理。

3.1 Envoy Listeners

配置的 Envoy 绑定被定义为 Listeners。每个侦听器都可以定义一个端口和一系列在该端口上响应的filters, routes and clusters。在这种情况下,定义了一个绑定到端口 8080 的侦听器(listener)。
Envoy Proxy 使用 YAML 表示法进行配置。如果您不熟悉此表示法,可以查看此链接。

static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 8080 }

在下一步中,您将找到将处理流量的路由和集群的配置。

4. Backend Configuration

后端配置定义负载平衡器配置以处理传入流量。在此配置示例中,以循环方式定义了两个节点。

backend nodesmode httpbalance roundrobinoption forwardforserver web01 172.18.0.3:80 checkserver web02 172.18.0.4:80 check

在 Envoy 中,这个功能是通过创建过滤器和集群来处理的。

4.1 Envoy Filters and Clusters

对于静态配置,过滤器定义了如何处理传入请求。在这种情况下,我们定义了与所有流量匹配的过滤器。当发出与定义的域和路由匹配的请求时,流量将转发到集群。这相当于上游配置:

filter_chains:
- filters:- name: envoy.http_connection_managerconfig:codec_type: autostat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: backenddomains:- "*"routes:- match:prefix: "/"route:cluster: nodeshttp_filters:- name: envoy.router

名称envoy.http_connection_manager是 Envoy Proxy 中的内置过滤器。其他过滤器包括Redis、Mongo、TCP。您可以在文档中找到完整列表。

过滤器控制 Envoy 如何匹配传入的 HTTP 请求以及哪个集群应该处理它们。集群控制哪些服务器正在处理流量和负载平衡配置,例如循环。

clusters:
- name: nodesconnect_timeout: 0.25stype: STRICT_DNSdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINhosts: [{ socket_address: { address: 172.18.0.3, port_value: 80 }},{ socket_address: { address: 172.18.0.4, port_value: 80 }}]

有关其他负载平衡策略的更多信息,请访问Envoy 文档。

5. 记录访问和错误

HAProxy 的最后一部分配置存储日志文件的位置以及拥有该进程的用户。

globallog /dev/log    local0log /dev/log    local1 noticeuser haproxygroup haproxydaemondefaultslog     globalmode    httpoption  httplogoption  dontlognull

Envoy Proxy 的日志遵循云原生方法,其中应用程序日志输出到stdout和stderr。

用户访问日志默认处于禁用状态,需要进行配置。要为 HTTP 请求启用访问日志,请包括access_logHTTP 连接管理器的配置。路径可以是设备(例如 stdout),也可以是磁盘上的文件,具体取决于您的要求。

access_log:
- name: envoy.file_access_logconfig:path: "/dev/stdout"

结果应如下所示:

- name: envoy.http_connection_managerconfig:codec_type: autostat_prefix: ingress_httpaccess_log:- name: envoy.file_access_logconfig:path: "/dev/stdout"route_config:

默认情况下,Envoy 有一个格式字符串,其中包含 HTTP 请求的详细信息。

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n

此格式字符串的结果是:

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

可以通过设置格式字段来自定义输出的内容,例如:

access_log:
- name: envoy.file_access_logconfig:path: "/dev/stdout"format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n"

也可以通过设置json_format字段将日志行输出为 JSON ,例如:

access_log:
- name: envoy.file_access_logconfig:path: "/dev/stdout"json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

可以在此处找到有关 Envoy 日志记录方法的更多信息。

日志记录并不是使用 Envoy Proxy 获得生产可见性的唯一方法。该平台内置了高级跟踪和度量功能。

6. 启动

Envoy 代理配置现在已经从 HA 代理转换而来。最后一部分是启动 Envoy Proxy 实例进行测试。

在配置的顶部,该行user haproxy指示以低权限用户身份运行 HA 代理。

Envoy Proxy 采用云原生方法来管理流程所有者。当我们通过容器启动 Envoy 代理时,我们可以指定一个低权限用户。

下面将通过主机上的 Docker 容器启动 Envoy 代理。该命令公开 Envoy 以侦听端口 80 上的传入请求。但是,正如侦听器配置中所指定的,Envoy 代理正在侦听端口 8080 上的传入流量。这允许进程以低权限用户身份运行。

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
$ curl localhost -IL
HTTP/1.1 503 Service Unavailable
content-length: 57
content-type: text/plain
date: Wed, 17 Nov 2021 06:57:20 GMT
server: envoy

HTTP 请求将导致503错误,因为上游连接未运行且不可用。因此,Envoy 代理没有可用于请求的目标目的地。以下命令将启动一系列与为 Envoy 定义的配置相匹配的 HTTP 服务。

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
$ curl localhost -i
HTTP/1.1 200 OK
date: Wed, 17 Nov 2021 07:01:31 GMT
content-length: 58
content-type: text/html; charset=utf-8
x-envoy-upstream-service-time: 0
server: envoy<h1>This request was processed by host: 9e0d200c3327</h1>

有了可用的服务,Envoy 就可以成功地将流量代理到目标目的地。
您应该会看到一个响应,指示哪个 Docker 容器处理了请求。在 Envoy 代理日志中,您还应该看到输出的访问行。


http://www.ppmy.cn/news/420902.html

相关文章

【代码重构】依恋情结(Feature Envy)和不合适的亲昵关系(Inappropriate Intimacy)-- 解决一个函数访问其它对象的数据比访问自己的数据更多的情况

依恋情结 ●症状和特点 一个方法访问另一个对象的数据多于访问它自己的数据。 ●问题产生的原因 在将字段移动到数据类之后&#xff0c;可能会出现这种情况。如果是这种情况&#xff0c;您可以将数据的操作也移到该类中。 ●解决方法 作为一个基本规则&#xff0c;如果事情…

为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ?

文章目录 背景基于网桥的容器网络Service 同节点通信问题开启 bridge-nf-call-iptables我的环境netshoot 工具 参考 背景 Kubernetes 环境中&#xff0c;很多时候都要求节点内核参数开启 bridge-nf-call-iptables: sysctl -w net.bridge.bridge-nf-call-iptables1 参考官方文…

文件从 UNIX(LF) 批量改为 PC(CR+LF) ,编码格式保持源文件编码,CMD转换成功

如何把文件从 UNIX(LF) 批量改为 PC(CRLF) &#xff0c;编码格式保持源文件编码&#xff0c;通过电脑自带cmd 批量更改-1.0 chcp 65001 && FOR /F "tokens*" %f IN (dir /b D:\opt\output\DATA_FILE\20230531\*.DAT) DO type "D:\opt\output\DATA_FILE…

接口测试——接口测试文档

在执行接口测试前&#xff0c;测试人员肯定会先拿到开发给予的接口文档。测试人员可以根据这个文 档编写接口测试用例。所以&#xff0c;我们要先了解接口文档的主要构成及含义。 以购买开心产品项目接口文档为例&#xff0c;解析一下接口文档的组成。 完整的接口文档有公共信…

制作独特彩妆美女模特头像照片的PS教程

有时为了使图片更出众更出彩&#xff0c;我们需要在人物脸上做一些效果。前期拍摄时没给人物画彩妆。这时就需要我们用PS来实现了。最终效果 原图 一、新建一个图层&#xff0c;使用柔角笔刷并将颜色值设为#7e2224对眼睛内边缘进行涂抹&#xff0c;范围如图。修改图层模式为…

ps合成玫瑰花丛中漂亮美女照片

&#xff08;1&#xff09;把素材图打开。 &#xff08;2&#xff09;把人物 使用钢笔工具 扣出来。 如下所示&#xff1a; &#xff08;3&#xff09; 载入草丛笔刷&#xff0c;把颜色动态和传递去掉勾选&#xff0c;这2个选项可能会造成前后背景色反复更替 。 设置画笔&am…

短发新娘婚纱照攻略

这个攻略送给那些即将拍摄婚纱照的短发新娘们&#xff0c;那些还在因为短发而担心拍不出漂亮的照片的准新人们&#xff0c;这个短发新娘婚纱照攻略叫你们一样拍出美美的婚纱照。 1、新派婚纱照 新式婚纱照运用了“环境人物照”的手法。除了有故事情节外&#xff0c;你也会察觉…