Azure 应用程序网关 v2 为 WebSocket 和 HTTP/2 协议提供了本机支持。 应用程序网关和 Kubernetes 入口均不具有用户可配置的设置来选择性地启用或禁用 WebSocket 支持。
以下 Kubernetes 部署 YAML 显示了用于部署 WebSocket 服务器的最低配置,这与部署常规 Web 服务器是相同的:
apiVersion: apps/v1
kind: Deployment
metadata:
name: websocket-server
spec:
selector:
matchLabels:
app: ws-app
replicas: 2
template:
metadata:
labels:
app: ws-app
spec:
containers:
- name: websocket-app
imagePullPolicy: Always
image: your-container-repo.azurecr.io/websockets-app
ports:
- containerPort: 8888
imagePullSecrets:
- name: azure-container-registry-credentials
---
apiVersion: v1
kind: Service
metadata:
name: websocket-app-service
spec:
selector:
app: ws-app
ports:
- protocol: TCP
port: 80
targetPort: 8888
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: websocket-repeater
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- host: ws.contoso.com
http:
paths:
- backend:
serviceName: websocket-app-service
servicePort: 80
假设满足所有先决条件,并且应用程序网关部署由 Azure Kubernetes 服务 (AKS) 中的 Kubernetes 入口控制,则上述部署将导致在应用程序网关部署的公共 IP 地址和 ws.contoso.com
域的端口 80 上公开 WebSocket 服务器。
以下 cURL 命令会测试 WebSocket 服务器部署:
curl -i -N -H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Origin: http://localhost" \
-H "Host: ws.contoso.com" \
-H "Sec-Websocket-Version: 13" \
-H "Sec-WebSocket-Key: 123" \
http://1.2.3.4:80/ws
如果部署未显式定义运行状况探测,则应用程序网关会在 WebSocket 服务器终结点上尝试 HTTP GET
操作。
根据服务器实现(例如此示例),可能需要特定于 WebSocket 的标头(例如,Sec-Websocket-Version
)。
由于应用程序网关不会添加 WebSocket 标头,因此来自 WebSocket 服务器的应用程序网关运行状况探测响应很可能是 400 Bad Request
。 然后,应用程序网关会将 Pod 标记为运行不正常。 对于 WebSocket 服务器的使用者,此状态最终会导致 502 Bad Gateway
错误。
要避免发生 502 Bad Gateway
错误,可能需要向服务器添加用于运行状况检查的 HTTP GET
处理程序。 例如,/health
返回 200 OK
。