【Envoy 数据面】Network filter 与 Connection:字节流、水印与 TCP Proxy / HCM 分叉
内容提要
本文介绍Envoy数据面代理中Network (L3/L4) filters的核心机制。Network filter处理原始字节流和连接事件,而非HTTP头,分为读、写、读写三类。连接生命周期包括实例化、数据循环、关闭等阶段,缓冲水印实现反压机制。TCP Proxy与HCM是两条分叉路径:前者做1:1 L4代理,后者将字节转为HTTP事件。排障时需先确认链终点类型,再选择正确指标。
延伸解读
排障先定坐标系:L4 与 L7 指标不可混用
文章强调,排障时若链终点是 tcp_proxy,却去 HTTP access log 或 :path 维度找原因,属于坐标系错误。例如 TCP Proxy 连接上限打满时,下游能连上 Envoy 但建不起上游,这与 HCM 的 503 语义相邻但指标不同。因此,写告警和 runbook 前,必须先确认链终点类型,再选择对应指标,否则容易误判故障根因。
水印反压:延迟上升未必是 CPU 问题
Envoy 通过读写缓冲的水位触发反压,防止慢消费者无限占用内存。当水印触发时,延迟上升可能来自缓冲反压,而非 CPU 算不过来。巨型请求、慢上游、慢客户端组合会放大水位振荡。理解这一点,有助于在性能排查时区分是资源瓶颈还是背压效应,避免盲目扩容。
同链多 filter 顺序:谁终结字节流是关键
配置 network filter 链时,顺序错误会导致字节被 codec 消费后行为未定义。例如在 HCM 之后再挂期望读原始字节的 filter,将无法正常工作。正确做法是让 tcp_proxy 或 HCM 作为终端过滤器,并通过 FilterChainMatch 分链,而不是指望线性列表既透传又解码。配置审查时应先确认谁终结字节流。
Q&A
Envoy 的 Network filter 处理的是什么数据?
Network filter 处理的是原始字节流和连接事件(如 TLS 握手完成、连接断开),而不是 HTTP 头。
Envoy 的 Network filter 分为哪几类?
分为三类:Read(读)、Write(写)、Read/Write(读写)。Read 在下游数据到达时触发,Write 在写回下游时触发,Read/Write 双向触发,如 TLS、代理、HCM。
Envoy 中缓冲水印机制的作用是什么?
缓冲水印机制用于实现反压,防止慢消费者无限占用内存。当缓冲超过高水位时,连接进入 watermark 状态,停止读取或通知减速;落到低水位后恢复。
TCP Proxy 和 HCM 在 Envoy 中有什么主要区别?
TCP Proxy 做 1:1 的 L4 代理,不解析 HTTP,没有路由和重试;HCM 将字节流转换为 HTTP 事件,进行编解码、HTTP filter 和路由。
在 Envoy 中排障时,为什么需要先确认链终点是 tcp_proxy 还是 http_connection_manager?
因为两者的指标和语义不同。tcp_proxy 没有 HTTP 状态码,失败可能表现为没有 200;HCM 有 codec/stream/路由统计,但 ALPN 错误可能导致协议错误。确认终点类型才能选择正确的指标。
在 Envoy 中,如果同一链上挂了多个 filter,顺序错误会有什么后果?
如果顺序错误,比如在 HCM 之后再挂期望读原始字节的 filter,字节已被 codec 消费,行为未定义。正确做法是通过 FilterChainMatch 分成两条链,而不是线性叠加。