向应用程序网关公开 WebSocket 服务器

Azure 应用程序网关 v2 为 WebSocket 和 HTTP/2 协议提供了本机支持。 应用程序网关和 Kubernetes 入口均不具有用户可配置的设置来选择性地启用或禁用 WebSocket 支持。

适用于 WebSocket 服务器部署的 YAML

以下 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 运行状况探测

如果部署未显式定义运行状况探测,则应用程序网关会在 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