跳转到内容

数据面配置

数据面是真正处理流量的代理组件。它从控制面通过 gRPC xDS 接收配置,运行 HTTP、TCP、UDP 监听器,然后把请求转发到上游服务。

参考配置文件在 dataplane/configs/dataplane/config.yaml

参数类型默认值说明
node_idstringdp数据面实例的唯一标识
clusterstringkind所属逻辑集群名

node_id 在连到同一个控制面的所有数据面实例中必须唯一。在 Kubernetes 里,Helm chart 自动把这个值设为 Pod 名称。本地开发用 dp 就够了。

cluster 字段把数据面分组到逻辑集群。控制面在跨集群部署时用这个字段把配置路由到正确的数据面组。

参数类型默认值说明
control_plane_addrstringhttp://127.0.0.1:18080要连接的控制面 gRPC 地址

数据面启动时向这个地址打开一条双向 gRPC 流。所有配置推送、健康更新和节点状态报告都走这条连接。生产环境把这个地址指向控制面的 Kubernetes Service。

当控制面开启了 gRPC TLS 之后,把地址改成 https:// 开头。

参数类型默认值说明
admin_addrstring127.0.0.1:19080数据面 Admin HTTP 服务的监听地址

数据面 Admin 服务暴露健康检查、运行时统计和少量管理端点。默认只绑定 localhost,安全考虑。

参数类型默认值说明
log.levelstringinfo,nantian_core::connectors=offRust tracing 指令格式的日志过滤
log.formatstringjson输出格式:jsontext
log.add_sourceboolfalse日志条目中包含源文件位置
log.include_targetboolfalse包含 tracing target(Rust 模块路径)
log.include_thread_idsboolfalse包含线程 ID
log.include_thread_namesboolfalse包含线程名
log.non_blockingbooltrue使用非阻塞环形缓冲区输出日志
log.non_blocking_buffered_linesint65536环形缓冲区容量
log.drop_when_fullbooltrue缓冲区满时丢弃日志

level 字段支持 tracing 过滤语法。可以按 Rust 模块设不同级别:info,hyper=warn,tower=debug 表示全局 info 级别,hyper HTTP 库用 warn 级别,tower 中间件用 debug 级别。默认值关掉了 nantian_core::connectors 的冗余输出。

非阻塞日志对高吞吐代理来说很关键。没有非阻塞模式,一个慢速的日志 sink(比如阻塞的磁盘或网络)会拖慢整个代理线程。环形缓冲区吸收突发流量,drop_when_full 保证代理线程不会被日志阻塞。

这些参数控制数据面怎么处理 HTTP 和 TCP 流量:

参数类型默认值说明
runtime_tuning.http_capacity.workerThreadsint0Worker 线程数(0 = CPU 核数)
runtime_tuning.http_capacity.acceptConcurrencyint16并发 TCP accept 操作数
runtime_tuning.http_capacity.upstreamKeepalivePoolSizeint32768上游连接池中保持的最大空闲连接数
runtime_tuning.http_capacity.reusePortbool/nullnull开启 SO_REUSEPORT(null = 系统默认)

workerThreads 为 0 时,运行时按 CPU 核数创建线程。这对 CPU 密集型负载(TLS 拆解、请求头修改、Wasm 过滤器)是最优的。对于 I/O 密集型负载(大部分时间在等上游响应),可以降低这个值让出 CPU 给其他进程。

上游连接池复用和后端服务之间的连接,避免每次请求都走 TCP 握手和 TLS 协商。32768 这个默认值能支持大约这么多并发空闲连接。如果后端服务很多(几百个)或者每个后端并发很高,可以调大这个值。

L4 TCP 代理的缓冲区大小直接影响内存使用和吞吐:

参数类型默认值说明
runtime_tuning.tcpProxyBufferBytesint16384L4 TCP 代理转发使用的缓冲区大小(字节)

该缓冲区用于 ntgw-stream 的 L4 TCP 转发。HTTP 代理的响应缓存条目上限由 runtime_tuning.http_cache.maxEntrySizeMb 控制,与此处的 TCP 缓冲区相互独立。

参数类型默认值说明
runtime_tuning.downstreamReadTimeoutMsint60000从客户端读取请求的超时(毫秒)
runtime_tuning.upstream_connection_timeout_msint5000与上游建立连接的超时(毫秒)
runtime_tuning.upstream_read_timeout_msint30000从上游读取响应的超时(毫秒)
runtime_tuning.upstream_idle_timeout_msint60000上游 keepalive 连接空闲超时(毫秒)

upstream_connection_timeout_ms 控制连接后端服务的最大等待时间:若上游在该时间内未接受连接,则放弃该连接。upstream_idle_timeout_ms 控制空闲上游连接在连接池中保留多久,太小会导致频繁重建连接,太大则占用连接池资源。

参数类型默认值说明
runtime_protection.httpGlobalRateLimitRequestsPerSecondint10000全局每秒请求数上限
runtime_protection.httpGlobalRateLimitBurstint20000全局突发允许量

这是全局限流,作用于所有进入数据面的请求,在路由规则之前生效。更细粒度的按监听器/按路由限流由下方连接保护章节的 runtime_protection.httpListenerRateLimit*httpRouteRateLimit* 参数控制。

参数类型默认值说明
runtime_protection.httpBackendCircuitBreakerMaxRequestsint4096单个后端的并发在途请求数上限,超过即触发熔断

Nantian 的熔断基于并发在途请求数,而非错误率:当某个后端的并发在途请求达到上限时,新请求快速失败,从而避免拖垮后端。需要按目标做更细粒度熔断时,可通过 BackendLBPolicycircuitBreaker.maxInflightRequests 字段配置。

参数类型默认值说明
runtime_tuning.activeHealthCheckEnabledboolfalse是否开启主动健康检查
runtime_tuning.activeHealthCheckIntervalMsint5000主动健康检查间隔(毫秒)
runtime_tuning.activeHealthCheckTimeoutMsint1000单次健康检查的超时(毫秒)
runtime_tuning.activeHealthCheckUnhealthyThresholdint2连续失败多少次标记为不健康
数据面可对后端做主动健康检查(默认关闭,通过 activeHealthCheckEnabled 开启)。后端不健康时,流量被路由到其他健康后端;当所有后端都不健康时,数据面返回 503,不把不可用后端暴露给客户端。
参数类型默认值说明
admin_auth.bearer_tokenstring""Admin API 静态 Bearer Token
admin_auth.bearer_token_filestring""包含 Bearer Token 的文件路径
用法和控制面的 Admin 认证一样。两个都设空字符串即关闭认证。
参数类型默认值说明
access_log.enabledboolfalse开启按请求访问日志
access_log.pathstringstdout输出路径,stdout 表示控制台
access_log.formatstring(见 config.yaml)格式字符串,支持 %VARIABLE% 占位符
access_log.modestringjson输出模式:jsontext
access_log.sample_ratefloat0.01日志采样率(1.0 = 全部请求)
access_log.routeAnnotationPrefixstringgateway.nantian.dev/access-log-按路由覆盖日志配置的 Kubernetes annotation 前缀
访问日志记录每个(或抽样)代理请求的详情。格式字符串支持 %METHOD%%STATUS%%LATENCY_MS%%ROUTE_NAME% 等变量。高流量环境下把 sample_rate 调低来控制日志量。

routeAnnotationPrefix 允许通过 Kubernetes annotation 按路由覆盖采样率和格式。给某个路由加 gateway.nantian.dev/access-log-sample-rate: "1.0" 就能全量记录该路由的请求。

%RESPONSE_FLAGS% 占位符展开为一个逗号分隔的标志位列表,表明请求为何以特定方式处理。空值或 none 表示请求正常完成。

HTTP 标志位:

FlagHTTP 状态说明
none请求正常完成,无错误
NR500没有匹配到路由
UH503没有健康的后端可用
CB503上游熔断器已打开
IB500BackendRefs 配置无效
UF500路由引用了不支持的过滤器
UT504上游连接或响应超时
DC499客户端在收到响应前断开连接
IT408请求完成前下游空闲超时
UC502上游连接意外关闭
OL503全局过载保护拒绝了请求
RL429全局限流拒绝了请求
RH431请求头超过了 maxRequestHeaderBytes 限制
RB413请求体超过了 maxRequestBodyBytes 限制
MA连接因 httpMaxConnectionAgeMs 被关闭

TCP/TLS 流标志位:

Flag说明
NE通用网络层错误
UE上游连接错误
DE下游连接错误
MC因连接数达到上限被关闭
参数类型默认值说明
runtime.http_listen_addrstring0.0.0.0:80HTTP 代理监听地址
runtime.enable_ipv6booltrue接受 IPv6 连接
runtime.enable_http3boolfalse开启 HTTP/3(QUIC)支持
runtime.tls_min_versionstring1.2入站连接最低 TLS 版本
runtime.tls_max_versionstring1.3入站连接最高 TLS 版本
runtime.tlsAssetDirstring""TLS 证书文件目录

控制数据面如何连接后端服务:

参数类型默认值说明
runtime_tuning.upstream_connection_timeout_msint5000上游服务连接超时(毫秒)
runtime_tuning.upstream_read_timeout_msint30000上游响应的读取超时(毫秒)
runtime_tuning.upstream_idle_timeout_msint60000上游 Keep-Alive 连接空闲超时(毫秒)
参数类型默认值说明
runtime_tuning.downstreamReadTimeoutMsint60000下游客户端请求的读取超时(毫秒)
runtime_tuning.httpMaxConnectionAgeMsint0连接最大生命周期(毫秒,0 = 不限制)
runtime_tuning.httpKeepaliveRequestLimitint0每个 Keep-Alive 连接的最大请求数(0 = 不限制)
参数类型默认值说明
runtime_tuning.httpReloadRetryIntervalMsint1000HTTP 监听器重载失败时的重试间隔(毫秒)
runtime_tuning.streamReloadRetryIntervalMsint1000Stream 重载失败时的重试间隔(毫秒)
参数类型默认值说明
runtime_tuning.tcpProxyBufferBytesint16384TCP 代理数据缓冲区大小(字节)
runtime_tuning.tcpSessionIdleTimeoutMsint0TCP 会话空闲超时(毫秒,0 = 不超时)
runtime_tuning.tcpMaxConnectionAgeMsint0TCP 连接最大生命周期(毫秒,0 = 不限制)

重试预算防止重试风暴压垮后端:

参数类型默认值说明
runtime_tuning.retryBudgetEnabledbooltrue开启重试预算控制
runtime_tuning.retryBudgetRatioPercentint20重试与成功请求的最大比例(%)
runtime_tuning.retryBudgetBurstint16超过预算限额的最大突发值
重试预算确保重试不会加剧后端故障。当重试次数与成功请求的比例超过 retryBudgetRatioPercent 时,数据面停止重试,直到比例恢复。retryBudgetBurst 允许在稳态比例之上有短暂的突发。
参数类型默认值说明
runtime_tuning.streamUpstreamPoolSizeint128上游池中保持的最大空闲流连接数
runtime_tuning.streamUpstreamPoolIdleTimeoutMsint30000流上游连接的空闲超时(毫秒)
参数类型默认值说明
runtime_tuning.work_stealingbooltrue启用 Tokio 跨工作线程的工作窃取
参数类型默认值说明
runtime_tuning.http_cache.enabledboolfalse启用 HTTP 响应缓存
runtime_tuning.http_cache.maxSizeMbint256最大缓存大小(MB)
runtime_tuning.http_cache.defaultTtlSecondsint60默认缓存 TTL(秒)
参数类型默认值说明
runtime_tuning.graceful_drain_period_msint0优雅关闭排空时间(毫秒,0 = 不排空)
数据面收到 SIGTERM(Pod 终结)后,停止接受新连接,在此时间内排空现有连接。设为 0 则立即关闭代理。Kubernetes 部署常见值为 30000(30 秒)。
参数类型默认值说明
runtime_tuning.activeHealthCheckEnabledboolfalse开启对上游的主动健康检查
runtime_tuning.activeHealthCheckIntervalMsint5000健康检查探测间隔(毫秒)
runtime_tuning.activeHealthCheckTimeoutMsint1000单次探测超时(毫秒)
runtime_tuning.activeHealthCheckUnhealthyThresholdint2连续失败多少次标记为不健康
主动健康检查定期向后端发送请求,在生产流量之外验证后端存活性。它和被动健康检查(从真实请求中检测故障)互补,能发现那些没在接收流量的后端的问题。

TCP Keepalive 探测在操作系统层面检测死连接:

下游 TCP Keepalive:

参数类型默认值说明
runtime_tuning.downstreamTcpKeepalive.enabledboolfalse开启下游连接 TCP Keepalive
runtime_tuning.downstreamTcpKeepalive.idleMsint60000发送探测前的空闲时间(毫秒)
runtime_tuning.downstreamTcpKeepalive.intervalMsint15000探测间隔(毫秒)
runtime_tuning.downstreamTcpKeepalive.probeCountint4判定死亡前的探测次数
runtime_tuning.downstreamTcpKeepalive.userTimeoutMsint0用户超时覆盖(毫秒,0 = 系统默认)
上游 TCP Keepalive 使用 runtime_tuning.upstream_tcp_keepalive 下相同的字段,默认 enabled: true
参数类型默认值说明
runtime_tuning.downstream_tcp_fastopenboolnull下游启用 TCP Fast Open(null = 自动检测)
runtime_tuning.downstream_dscpintnull下游连接 DSCP 标记(null = 禁用)
runtime_tuning.upstream_tcp_recv_bufint0上游 TCP 接收缓冲区大小(字节,0 = 系统默认)
runtime_tuning.upstream_tcp_fast_openbooltrue上游启用 TCP Fast Open
runtime_tuning.upstream_dscpintnull上游连接 DSCP 标记(null = 禁用)

TCP Fast Open 通过在初始 TCP 握手期间发送数据来减少连接延迟。DSCP(区分服务代码点)标记可在网络层面实现 QoS 优先级。

保护限制防止异常客户端或后端导致资源耗尽:

参数类型默认值说明
runtime_protection.httpGlobalInflightLimitint16384所有监听器并发请求数上限
runtime_protection.httpListenerInflightLimitint8192每个监听器并发请求数上限
runtime_protection.httpRouteInflightLimitint4096每个路由并发请求数上限
runtime_protection.httpBackendCircuitBreakerMaxRequestsint4096单个后端并发请求熔断阈值
runtime_protection.httpMaxRequestBodyBytesint10485760请求体最大大小(字节,0 = 不限制)
runtime_protection.httpMaxRequestHeaderBytesint65536请求头最大大小(字节,0 = 不限制)

全局、按监听器、按路由的限流:

参数类型默认值说明
runtime_protection.httpGlobalRateLimitRequestsPerSecondint10000全局请求速率限制(0 = 不限制)
runtime_protection.httpGlobalRateLimitBurstint20000全局突发允许量
runtime_protection.httpListenerRateLimitRequestsPerSecondint5000每个监听器请求速率限制
runtime_protection.httpListenerRateLimitBurstint10000每个监听器突发允许量
runtime_protection.httpRouteRateLimitRequestsPerSecondint2000每个路由请求速率限制
runtime_protection.httpRouteRateLimitBurstint4000每个路由突发允许量
限流采用令牌桶算法。Burst 决定桶的深度:100 的速率配 50 的突发,第一个瞬间允许 150 个请求,之后稳定在每秒 100 个。
参数类型默认值说明
runtime_protection.tcpGlobalConnectionLimitint32768最大并发 TCP 连接数
runtime_protection.tcpListenerConnectionLimitint8192每个监听器最大 TCP 连接数
runtime_protection.udpGlobalDatagramLimitint100000最大并发 UDP 数据报数
runtime_protection.udpListenerDatagramLimitint50000每个监听器最大 UDP 数据报数
参数类型默认值说明
runtime_tuning.requestMirrorMaxConcurrencyint1024最大并发镜像请求数
请求镜像将生产流量复制一份发送到次要后端,用于测试或金丝雀分析。这个限制控制飞行中的镜像请求数,防止镜像消耗过多资源。
参数类型默认值说明
session_persistence.secret_keystring""会话 Cookie 加密密钥
session_persistence.secret_key_filestring""包含密钥的文件路径
会话保持(粘性会话)需要密钥来加密会话 Cookie。二选一配置 secret_keysecret_key_file。生产环境建议用文件方式,密钥从 Kubernetes Secret 挂载。
参数类型默认值说明
runtime_tuning.udpResponseIdleTimeoutMsint500UDP 响应会话空闲超时(毫秒)

xDS 连接控制面的传输参数:

参数类型默认值说明
xdsTransport.connect_timeout_msint5000建立 xDS 连接的超时时间(毫秒)
xdsTransport.keepalive_interval_msint10000xDS keepalive ping 间隔(毫秒)
xdsTransport.keepaliveTimeoutMsint5000xDS keepalive ping 响应超时(毫秒)
xdsTransport.initialReconnectBackoffMsint2000xDS 重连初始退避时间(毫秒)
xdsTransport.maxReconnectBackoffMsint30000xDS 重连最大退避时间(毫秒)
xdsTransport.applyTimeoutMsint3000应用接收到的配置快照的超时时间(毫秒)
xdsTransport.applyPollIntervalMsint100等待快照应用时的轮询间隔(毫秒)
xdsTransport.staleStreamTimeoutMsint30000将陈旧 xDS 流视为失败的时间(毫秒)
xdsTransport.snapshotFreshnessTimeoutMsint90000将当前快照视为过期的时间(毫秒)

连接断开时,数据面使用指数退避重连,从 initialReconnectBackoffMs 开始,每次翻倍,最多到 maxReconnectBackoffMsapplyTimeoutMsapplyPollIntervalMs 控制快照应用过程。

参数类型默认值说明
experimental.enableExperimentalGatewayboolfalse开启实验性 Gateway API 功能
experimental.enableAiGatewayboolfalse开启 AI 网关模块
必须和控制面的功能开关保持一致。只在一侧开启会导致行为不一致。