Envoy详解:高性能C++代理服务器的安装与配置指南

概述

Envoy是Lyft公司开源的高性能C++编写的代理服务器,广泛应用于云原生架构中。作为一个现代化的网络代理,Envoy可以替代传统的Nginx、HAProxy等工具,在微服务架构中扮演着重要的角色。本文将详细介绍Envoy的特性、安装配置以及使用方法。

Envoy简介

Envoy于2016年由Lyft公司开源,并于2017年加入CNCF(云原生计算基金会)。它是一个专为云原生应用设计的边缘和服务代理,具有以下核心特性:

  • 高性能:基于C++开发,单进程架构,避免了多进程/多线程的上下文切换开销
  • 可观测性:内置丰富的统计指标,支持多种追踪后端
  • 动态配置:通过xDS API实现动态配置更新,无需重启
  • 支持多种协议:HTTP/1.1、HTTP/2、gRPC、TCP、TLS等
  • 灵活的过滤链:通过过滤器架构实现功能扩展

Envoy应用场景

  • API网关:作为微服务的统一入口
  • Sidecar代理:在服务网格中作为Sidecar部署
  • 边缘代理:处理南北向流量
  • 负载均衡器:实现高级负载均衡策略
  • 透明代理:实现流量拦截和转发

环境准备

系统要求

  • 操作系统:Linux(Ubuntu/CentOS/Debian)、macOS、Windows
  • 内存:至少512MB
  • CPU:x86_64或ARM64架构
  • 磁盘:至少100MB空间

安装Envoy

方式一:使用APT安装(Ubuntu/Debian)

# 添加GPG密钥
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 添加Envoy仓库
curl -fsSL https://getenvoy.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/envoy-archive-keyring.gpg

# 添加仓库
echo "deb [signed-by=/usr/share/keyrings/envoy-archive-keyring.gpg] https://apt.envoyproxy.io $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/envoy.list

# 安装Envoy
sudo apt-get update
sudo apt-get install envoy

方式二:使用YUM安装(CentOS/RHEL)

# 添加仓库
sudo tee /etc/yum.repos.d/envoy.repo << 'EOF'
[envoy]
name=Envoy Repository
baseurl=https://yum.envoyproxy.io/main/centos/7/x86_64
enabled=1
gpgcheck=0
EOF

# 安装Envoy
sudo yum install envoy

方式三:使用Docker运行

# 运行最新版本的Envoy
docker run --name envoy -d -p 9901:9901 -p 10000:10000 envoyproxy/envoy:latest

# 或者使用自定义配置文件
docker run --name envoy -d   -v /path/to/envoy.yaml:/etc/envoy/envoy.yaml:ro   -p 9901:9901   -p 10000:10000   envoyproxy/envoy:latest

方式四:手动下载二进制文件

# 下载最新版本的Envoy
curl -LO https://github.com/envoyproxy/envoy/releases/download/v1.35.0/envoy-v1.35.0-linux-x86_64.tar.gz

# 解压
tar xzf envoy-v1.35.0-linux-x86_64.tar.gz

# 移动到系统路径
sudo mv envoy /usr/local/bin/

# 验证安装
envoy --version

Envoy配置基础

配置文件结构

Envoy使用YAML格式的配置文件,主要包含以下几个部分:

static_resources:
  listeners:          # 监听器定义
  - name: ...
    address: ...
    filter_chains: ...

  clusters:           # 集群定义(后端服务)
  - name: ...
    hosts: ...

dynamic_resources:     # 动态资源配置
  lds_config: ...
  cds_config: ...

admin:                 # 管理界面配置
  address: ...

一个完整的示例配置

admin:
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
  - name: http_listener
    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
          codec_type: AUTO
          stat_prefix: http_connection_manager
          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:
                  cluster: web_service
                  host_rewrite: localhost
                  prefix_rewrite: /

  clusters:
  - name: web_service
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: web_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080

核心概念详解

Listener(监听器)

Listener是Envoy接收入站流量的入口点。每个Listener可以绑定到一个或多个网络地址(IP:端口),并配置相应的过滤器链。

# TCP监听器示例
- name: tcp_listener
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 10001
  filter_chains:
  - filters:
    - name: envoy.filters.network.tcp_proxy
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
        stat_prefix: tcp_proxy
        cluster: backend_cluster

Cluster(集群)

Cluster定义了一组可以路由到的主机(endpoints),Envoy会将流量负载均衡到集群中的所有主机。

# 简单集群配置
- name: my_cluster
  type: STRICT_DNS
  connect_timeout: 5s
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: my_cluster
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: backend.example.com
              port_value: 80

Route(路由)

路由配置决定了HTTP请求如何被路由到不同的集群,支持基于路径、前缀、头部、查询参数等条件的路由。

route_config:
  name: api_route
  virtual_hosts:
  - name: api_vhost
    domains: ["api.example.com"]
    
    routes:
    # 基于路径前缀的路由
    - match:
        prefix: /v1/users
      route:
        cluster: users_service
        prefix_rewrite: /
        timeout: 10s

高级功能配置

负载均衡策略

# ROUND_ROBIN - 轮询
- name: round_robin_cluster
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: round_robin_cluster
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: backend1.example.com
              port_value: 80

熔断器配置

- name: circuit_breaker_cluster
  connect_timeout: 1s
  lb_policy: ROUND_ROBIN
  
  circuit_breakers:
    thresholds:
    - priority: DEFAULT
      max_connections: 1000
      max_pending_requests: 1000
      max_requests: 1000
      max_retries: 3

Envoy管理界面

Envoy提供了一个管理界面,可以查看运行状态、统计数据和动态修改配置。

admin:
  address:
    socket_address:
      protocol: TCP
      address: 0.0.0.0
      port_value: 9901

# 常用管理端点
# 查看服务器信息: curl http://localhost:9901/server_info
# 查看当前配置: curl http://localhost:9901/config_dump
# 查看集群状态: curl http://localhost:9901/clusters
# 查看统计信息: curl http://localhost:9901/stats

运维管理

启动Envoy

# 使用配置文件启动
envoy -c /etc/envoy/envoy.yaml

# 使用systemd管理
sudo systemctl enable envoy
sudo systemctl start envoy
sudo systemctl status envoy

监控指标

# Envoy支持多种监控指标格式

# 查看所有指标
curl http://localhost:9901/stats

# 以Prometheus格式查看
curl http://localhost:9901/stats/prometheus

常见问题与解决方案

Q1: Envoy启动失败,配置文件报错

问题描述:启动Envoy时提示配置文件语法错误

解决方法:

  1. 使用YAML语法检查工具验证配置文件
  2. 检查YAML缩进是否正确(使用空格而非制表符)
  3. 查看详细错误日志
# 验证配置文件语法
python3 -c "import yaml; yaml.safe_load(open('/etc/envoy/envoy.yaml'))"

# 调试启动
envoy -c /etc/envoy/envoy.yaml --log-level debug

Q2: 负载均衡不生效

问题描述:所有请求都路由到同一台后端服务器

解决方法:

  1. 检查集群类型配置是否正确
  2. 确认后端服务器配置了多个endpoint
  3. 验证负载均衡策略配置

Q3: gRPC请求失败

问题描述:gRPC客户端无法连接或请求超时

解决方法:

  1. 确保listener配置了codec_type: H2
  2. 在cluster中配置http2_protocol_options

总结

Envoy作为云原生时代的核心代理组件,提供了丰富的功能和灵活的配置方式。通过本文的介绍,你应该已经掌握了Envoy的基本概念、安装配置和使用方法。

参考资源

发表回复

后才能评论