按端口代理 UDP 流量
使用 Gateway API UDPRoute 或 APISIX CRD stream route,按网关入站端口将 UDP 流量路由到 echo Service。
前置条件
启动示例上游服务
创建 Kubernetes manifest 文件,定义监听 9000 端口的 UDP echo server:
apiVersion: apps/v1
kind: Deployment
metadata:
name: udp-echo
namespace: aic
spec:
replicas: 1
selector:
matchLabels:
app: udp-echo
template:
metadata:
labels:
app: udp-echo
spec:
containers:
- name: udp-echo
image: python:3-alpine
command: ["python", "-u", "-c"]
args:
- |
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 9000))
print("UDP echo server listening on port 9000")
while True:
data, addr = sock.recvfrom(1024)
sock.sendto(data, addr)
ports:
- containerPort: 9000
protocol: UDP
---
apiVersion: v1
kind: Service
metadata:
name: udp-echo
namespace: aic
spec:
selector:
app: udp-echo
ports:
- name: udp
port: 9000
targetPort: 9000
protocol: UDP
将配置应用到集群:
kubectl apply -f udp-echo.yaml
启用网关 Stream 代理
升级网关,启用 stream 模式并设置 UDP 监听端口 9300。下列命令使用 --reuse-values 保留当前 Helm release 的其他值:
- APISIX 网关
- API7 网关
helm upgrade -n aic apisix apisix/apisix \
--reuse-values \
--set "service.stream.enabled=true" \
--set "service.stream.udp[0]=9300"
helm upgrade -n aic api7-ee-3-gateway api7/gateway \
--reuse-values \
--set "gateway.stream.enabled=true" \
--set "gateway.stream.only=false" \
--set "gateway.stream.udp[0]=9300"
配置 UDP 路由
本节将配置一个路由,用于监听 9300 端口上的 UDP 流量。
- Gateway API
- APISIX CRD
更新 Gateway manifest 文件,定义用于 UDP 流量的监听器:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
namespace: aic
name: apisix
spec:
gatewayClassName: apisix
listeners:
- name: http
protocol: HTTP
port: 80
- name: udp
protocol: UDP
port: 9300
allowedRoutes:
kinds:
- kind: UDPRoute
infrastructure:
parametersRef:
group: apisix.apache.org
kind: GatewayProxy
name: apisix-config
创建 Kubernetes manifest 文件,定义 UDPRoute:
apiVersion: gateway.networking.k8s.io/v1
kind: UDPRoute
metadata:
name: stream-route-udp
namespace: aic
spec:
parentRefs:
- name: apisix
sectionName: udp
rules:
- backendRefs:
- name: udp-echo
port: 9000
当 listener_port_match_mode 为 explicit 或 auto 时,sectionName: udp 引用会为 9300 添加 server_port 匹配。Gateway 监听器端口必须等于 APISIX 实际的 stream 监听端口。默认的 off 模式不会添加该匹配。
将配置应用到集群:
kubectl apply -f gateway.yaml -f udp-route.yaml
创建定义四层路由(stream route)的 Kubernetes manifest 文件:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: stream-route-udp
namespace: aic
spec:
ingressClassName: apisix
stream:
- name: stream-route-udp
protocol: UDP
match:
ingressPort: 9300
backend:
serviceName: udp-echo
servicePort: 9000
将配置应用到集群:
kubectl apply -f udp-route.yaml
设置上游传输协议
将后端 scheme 设为 udp。L4 scheme 仅适用于 stream route。
- Gateway API
- APISIX CRD
将 BackendTrafficPolicy 挂载到后端 Service:
apiVersion: apisix.apache.org/v1alpha1
kind: BackendTrafficPolicy
metadata:
name: udp-echo-transport
namespace: aic
spec:
targetRefs:
- group: ""
kind: Service
name: udp-echo
sectionName: udp
scheme: udp
应用策略:
kubectl apply -f udp-upstream-policy.yaml
创建与后端 Service 同名的 ApisixUpstream:
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: udp-echo
namespace: aic
spec:
ingressClassName: apisix
scheme: udp
应用上游配置:
kubectl apply -f udp-upstream.yaml
如需将 stream 插件挂载到 UDPRoute,请参阅将插件应用到 L4 路由。
验证
kubectl port-forward 仅支持 TCP,无法验证 UDP 代理。请在集群内运行一个临时 Pod,向网关发送 UDP 数据包:
kubectl run -it --rm test-udp-proxy --image=busybox --namespace=aic -- /bin/sh
进入 Pod 后,执行以下命令向网关发送 UDP 数据包:
echo "UDP Testing" | nc -u -w1 <gateway-service-name> 9300
你应看到消息 UDP Testing 被原样返回。