跳转到内容

RoutePolicy

RoutePolicy CRD 提供按路由的 HTTP 流量行为覆盖,将 nginx‑ingress 注解的等价功能引入 Gateway API 模式。它是一个 Gateway API 本地策略,通过 targetRefs 绑定到 HTTPRoute 资源,支持三级继承:命名空间 → 网关 → 路由。

apiVersion: gateway.nantian.dev/v1alpha1
kind: RoutePolicy
metadata:
name: large-uploads
namespace: nantian-demo
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: file-upload-route
default:
timeout:
request: 120s
backendRequest: 90s
connect: 30s
nextUpstream: 10s
bodyLimit:
maxRequestBodyBytes: 52428800
requestBodyBufferBytes: 131072
maxRequestHeaderBytes: 65536
proxy:
requestBuffering: true
responseBuffering: false
bufferSize: 4096
bufferCount: 8
connection:
keepaliveRequests: 1000
keepaliveTime: 3600s
keepaliveTimeout: 75s
upstreamKeepalivePoolSize: 320
upstreamKeepaliveIdle: 60s

RoutePolicy 使用三级优先级体系。高层级覆盖低层级:

优先级targetRef作用域
3(最高)kind: HTTPRoute应用到单个 HTTPRoute。
2kind: Gateway该网关上所有路由的默认值。
1(最低)targetRefs: [](空)策略所在命名空间内所有路由的默认值。

所有字段均为可选。未设置字段会向下级联:如果路由级策略未设置 timeout.connect,则使用网关级的值。如果没有任何策略提供值,则使用数据面全局默认值。

当同一级别的两个策略都指向同一资源时,两者均不生效(该路由回退到下一级)。

targetRefs 字段指定策略绑定的资源:

字段描述
group目标的 API 组。对于 Gateway 和 HTTPRoute 目标,必须为 gateway.networking.k8s.io
kindGateway 表示网关级默认值,HTTPRoute 表示按路由覆盖。
name目标资源的名称,必须与策略在同一命名空间中。

targetRefs 留空可创建命名空间级默认值。每个命名空间只能有一个命名空间级 RoutePolicy

所有字段均为可选。省略某节表示让下一继承层级或全局默认值生效。

覆盖数据面对于目标路由上请求的默认超时设置。

字段类型默认值描述
requestduration60s完整请求‑响应周期的最长持续时间。对应 nginx.ingress.kubernetes.io/proxy-read-timeout
backendRequestduration15s单次后端请求尝试的最长持续时间。对应 nginx.ingress.kubernetes.io/proxy-send-timeout
connectduration5s与后端建立 TCP 连接的最长持续时间。对应 nginx.ingress.kubernetes.io/proxy-connect-timeout
nextUpstreamduration重试期间寻找可用上游所花费的最长持续时间。对应 nginx.ingress.kubernetes.io/proxy-next-upstream-timeout

按路由限制请求体和请求头的大小。

字段类型默认值描述
maxRequestBodyBytesuint6410485760(10 MiB)最大请求体大小(字节)。超过此限制的请求会收到 HTTP 413。对应 nginx.ingress.kubernetes.io/proxy-body-size
requestBodyBufferBytesuint64131072(128 KiB)在写入临时文件之前用于读取请求体的缓冲区大小。对应 nginx.ingress.kubernetes.io/client-body-buffer-size
maxRequestHeaderBytesuint6465536(64 KiB)所有请求头的最大总大小。对应 nginx.ingress.kubernetes.io/client-header-buffer-size

控制 HTTP 代理缓冲行为。

字段类型默认值描述
requestBufferingbooltrue在代理前缓冲完整的客户端请求体。对应 nginx.ingress.kubernetes.io/proxy-request-buffering
responseBufferingbooltrue在发送给客户端前缓冲后端响应。对应 nginx.ingress.kubernetes.io/proxy-buffering
bufferSizeuint644096每个响应缓冲区的大小(字节)。对应 nginx.ingress.kubernetes.io/proxy-buffer-size
bufferCountuint328响应缓冲区的数量。对应 nginx.ingress.kubernetes.io/proxy-buffers-number

控制面向客户端和上游连接的保持活动行为。

字段类型默认值描述
keepaliveRequestsuint321000单个 keepalive 连接上允许的最大请求数。对应 nginx.ingress.kubernetes.io/keepalive-requests
keepaliveTimeduration3600s(1 小时)keepalive 连接的最长生命周期。
keepaliveTimeoutduration75s关闭 keepalive 连接前的最长空闲时间。对应 nginx.ingress.kubernetes.io/keepalive-timeout
upstreamKeepalivePoolSizeuint32320维护的空闲上游 keepalive 连接的最大数量。对应 nginx.ingress.kubernetes.io/upstream-keepalive-connections
upstreamKeepaliveIdleduration60s关闭上游 keepalive 连接前的最长空闲时间。对应 nginx.ingress.kubernetes.io/upstream-keepalive-time

如果你正在从 nginx‑ingress 迁移,下表列出了注解与 RoutePolicy 字段的对应关系:

nginx‑ingress 注解RoutePolicy 字段
nginx.ingress.kubernetes.io/proxy-body-sizedefault.bodyLimit.maxRequestBodyBytes
nginx.ingress.kubernetes.io/client-body-buffer-sizedefault.bodyLimit.requestBodyBufferBytes
nginx.ingress.kubernetes.io/client-header-buffer-sizedefault.bodyLimit.maxRequestHeaderBytes
nginx.ingress.kubernetes.io/proxy-read-timeoutdefault.timeout.request
nginx.ingress.kubernetes.io/proxy-send-timeoutdefault.timeout.backendRequest
nginx.ingress.kubernetes.io/proxy-connect-timeoutdefault.timeout.connect
nginx.ingress.kubernetes.io/proxy-next-upstream-timeoutdefault.timeout.nextUpstream
nginx.ingress.kubernetes.io/proxy-request-bufferingdefault.proxy.requestBuffering
nginx.ingress.kubernetes.io/proxy-bufferingdefault.proxy.responseBuffering
nginx.ingress.kubernetes.io/proxy-buffer-sizedefault.proxy.bufferSize
nginx.ingress.kubernetes.io/proxy-buffers-numberdefault.proxy.bufferCount
nginx.ingress.kubernetes.io/keepalive-requestsdefault.connection.keepaliveRequests
nginx.ingress.kubernetes.io/keepalive-timeoutdefault.connection.keepaliveTimeout
nginx.ingress.kubernetes.io/upstream-keepalive-connectionsdefault.connection.upstreamKeepalivePoolSize
nginx.ingress.kubernetes.io/upstream-keepalive-timedefault.connection.upstreamKeepaliveIdle

为慢速后端增加请求超时时间:

apiVersion: gateway.nantian.dev/v1alpha1
kind: RoutePolicy
metadata:
name: slow-backend-timeout
namespace: default
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: slow-report-route
default:
timeout:
request: 300s

限制特定路由的上传大小:

apiVersion: gateway.nantian.dev/v1alpha1
kind: RoutePolicy
metadata:
name: upload-limit
namespace: default
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: upload-route
default:
bodyLimit:
maxRequestBodyBytes: 52428800 # 50 MiB

为命名空间中所有路由设置默认超时:

apiVersion: gateway.nantian.dev/v1alpha1
kind: RoutePolicy
metadata:
name: ns-defaults
namespace: team-a
spec:
default:
timeout:
request: 60s
connect: 10s
connection:
keepaliveRequests: 500