4. Envoy 静态配置入门:静态配置文件结构
Envoy 的静态配置是学习其代理模型的基础。在变更门禁场景中,静态配置常用于固定边车代理的初始启动参数,确保在动态控制面尚未就绪时,代理仍能按预设规则转发流量。本章将拆解静态配置文件的三大核心块:listeners、clusters 和 admin,并掌握 YAML 语法要点与启动命令。
4.1 静态配置文件整体结构
Envoy 的静态配置是一个 YAML 文件,顶层包含三个必需字段和一个可选字段:
| 顶层字段 | 是否必需 | 作用描述 |
|---|---|---|
listeners |
是 | 定义监听端口、协议、过滤器链,决定如何接收入站流量 |
clusters |
是 | 定义上游服务端点、负载均衡策略、健康检查,决定流量转发目标 |
admin |
是 | 暴露管理接口(如 /stats、/config_dump),用于运行时监控与调试 |
static_resources |
否 | 包裹 listeners 和 clusters 的父级容器,静态配置中必须使用此字段 |
关键记忆点: 静态配置的 YAML 根节点必须是
static_resources,其下嵌套 listeners 和 clusters;admin 与 static_resources 平级。
4.2 YAML 语法基础与避坑指南
Envoy 配置对 YAML 缩进和类型敏感,以下是最容易出错的三个规则:
- 缩进一致性: 使用空格(禁止 Tab),同一层级必须对齐。Envoy 通常使用 2 空格缩进。
- 字符串引号: 包含冒号、特殊字符或数字开头的值必须加双引号,例如
"127.0.0.1:8080"。 - 列表与映射: 列表项以
-开头,映射键值对以key: value形式书写,冒号后必须有一个空格。
常见错误示例:
# 错误:缩进不一致,冒号后无空格
listeners:
- name: my_listener
address:
socket_address:
address: 0.0.0.0
port_value:10000 # 缺少空格
# 正确写法
listeners:
- name: my_listener
address:
socket_address:
address: "0.0.0.0"
port_value: 10000
4.3 Listeners 详解:流量入口
Listener 定义了 Envoy 如何监听端口、解析协议以及应用过滤器。一个最小可用的 Listener 包含以下结构:
static_resources:
listeners:
- name: ingress_listener
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
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: backend_cluster
http_filters:
- name: envoy.filters.http.router
核心字段说明:
- address.socket_address: 绑定 IP 和端口,
0.0.0.0表示监听所有网络接口。 - filter_chains: 过滤器链,至少包含一个网络过滤器。HTTP 场景下使用
http_connection_manager。 - route_config: 定义虚拟主机和路由规则,将请求映射到目标 cluster。
4.4 Clusters 详解:流量出口
Cluster 定义了一组提供相同服务的上游端点。Envoy 根据负载均衡策略将请求分发到这些端点。
clusters:
- name: backend_cluster
connect_timeout: "0.25s"
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: "10.0.0.1"
port_value: 8080
- endpoint:
address:
socket_address:
address: "10.0.0.2"
port_value: 8080
| 字段 | 说明 | 常用值 |
|---|---|---|
type |
端点发现方式 | STRICT_DNS(DNS 解析)、STATIC(静态 IP)、EDS(动态) |
lb_policy |
负载均衡算法 | ROUND_ROBIN、LEAST_REQUEST、RING_HASH |
connect_timeout |
与上游建立连接的超时时间 | "0.25s"、"1s" |
load_assignment |
静态端点列表(type=STATIC 或 STRICT_DNS 时使用) | 包含 lb_endpoints 数组 |
4.5 Admin 接口:运行时调试入口
Admin 模块为运维人员提供 HTTP 管理端点,用于查看配置、统计、日志级别调整等。变更门禁调试中,/config_dump 和 /stats 是最常用的两个端点。
admin:
address:
socket_address:
address: "0.0.0.0"
port_value: 9901
启动后可通过 curl http://127.0.0.1:9901/stats 查看实时指标,或通过 curl http://127.0.0.1:9901/config_dump 导出当前生效配置。
安全提示: 生产环境中 admin 端口不应暴露到公网,建议绑定到
127.0.0.1 或通过防火墙限制访问。
4.6 启动 Envoy 实例
将上述配置保存为 envoy-static.yaml,使用以下命令启动 Envoy:
# 使用 docker 运行(推荐)
docker run --rm -v $(pwd)/envoy-static.yaml:/etc/envoy/envoy.yaml \
-p 10000:10000 -p 9901:9901 \
envoyproxy/envoy:v1.28-latest \
-c /etc/envoy/envoy.yaml
# 或直接使用本地二进制
envoy -c envoy-static.yaml --log-level info
启动后验证:
- 访问
http://localhost:9901/stats确认 admin 接口正常。 - 访问
http://localhost:10000测试流量是否被代理到上游端点。
4.7 静态配置整体架构图
下图展示了静态配置中 Listener、Cluster 和 Admin 三者的关系,以及请求从入站到转发的完整路径:
4.8 完整静态配置示例
将上述 Listener、Cluster 和 Admin 合并为一个完整的 envoy-static.yaml:
static_resources:
listeners:
- name: ingress_listener
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
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: backend_cluster
http_filters:
- name: envoy.filters.http.router
clusters:
- name: backend_cluster
connect_timeout: "0.25s"
type: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: backend_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: "10.0.0.1"
port_value: 8080
- endpoint:
address:
socket_address:
address: "10.0.0.2"
port_value: 8080
admin:
address:
socket_address:
address: "0.0.0.0"
port_value: 9901
快速验证: 将上述配置保存后启动 Envoy,然后执行
curl -v http://localhost:10000/,观察是否返回上游服务的响应。若未部署上游服务,可先启动一个简单的 HTTP 服务器(如 python3 -m http.server 8080)作为测试端点。