跳到主要内容

代理 WebSocket 连接

WebSocket 是一种在单个 TCP 连接上为客户端和服务器提供双向通道的协议。它让 Web 上的实时通信可以即时收发数据,广泛用于聊天应用、协同编辑工具、多人游戏等交互式应用。

本指南介绍如何使用 Ingress Controller 配置网关代理 WebSocket 连接。如果需要对 WebSocket 连接限流,请参阅 limit-conn 插件。

前提条件

  1. 完成设置 Ingress Controller 和网关

启动示例上游服务

创建 Kubernetes manifest 文件,部署 WebSocket 服务器及其 Service。该服务器在 /.ws 提供 WebSocket 端点,并会回显收到的任何消息。

ws-echo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: websocket-server
spec:
replicas: 1
selector:
matchLabels:
app: websocket-server
template:
metadata:
labels:
app: websocket-server
spec:
containers:
- name: echo-server
image: jmalloc/echo-server
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: websocket-server
spec:
selector:
app: websocket-server
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP

将配置应用到集群:

kubectl apply -f ws-echo.yaml

创建路由

创建到 WebSocket 上游服务的路由:

ws-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: ws-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /.ws
backendRefs:
- name: websocket-server
port: 8080

将配置应用到集群:

kubectl apply -f ws-route.yaml

验证 Connections

将网关 Service 端口暴露到本地机器:

# 替换为你的网关 Service 名称
kubectl port-forward svc/<gateway-service-name> 9080:80 &

通过该路由与 WebSocket 服务器建立连接:

websocat "ws://127.0.0.1:9080/.ws"

在终端中发送 hello 消息。你应看到 WebSocket 服务器回显相同消息:

Request served by 1cd244052136
hello
hello

你可以继续发送更多消息,WebSocket 服务器会回显你发送的任何消息。这表示双向连接已成功建立并保持可用。