WebSocket是一種網絡傳輸協議,允許在單個TCP連接上進行雙向通信,位于OSI模型的應用層。與傳統HTTP請求相比,WebSocket使服務端能夠主動向客戶端推送數據,從而實現實時交互,適用于需要即時更新的應用場景,例如在線游戲、金融市場數據傳輸等。遵守WebSocket協議的服務即為WebSocket服務。本文通過示例介紹如何通過Nginx Ingress訪問集群內的WebSocket服務。
前提條件
已安裝了Nginx Ingress Controller組件。具體操作,請參見管理Nginx Ingress Controller組件。
已安裝WebSocat工具。具體操作,請參見WebSocat。
步驟一:部署示例應用
在集群中部署示例WebSocket應用和服務。
使用以下內容,創建名為websocket.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: ws name: websocket-server namespace: default spec: replicas: 1 selector: matchLabels: app: ws template: metadata: labels: app: ws spec: containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/websocket-echo-server:latest imagePullPolicy: IfNotPresent name: echo env: - name: BIND_PORT value: "3000" ports: - containerPort: 3000 protocol: TCP resources: limits: cpu: 1000m memory: 1000Mi requests: cpu: 100m memory: 100Mi --- apiVersion: v1 kind: Service metadata: labels: app: ws name: websocket-server namespace: default spec: ports: - name: ws port: 3000 protocol: TCP targetPort: 3000 selector: app: ws type: ClusterIP
執行以下命令,部署示例應用websocket.yaml。
kubectl apply -f websocket.yaml
步驟二:部署示例Ingress
為示例Ingress設置代理發送超時時間和代理讀取超時時間規則。
使用以下內容,創建名為websocket-ingress.yaml文件。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 根據實際情況調整讀寫超時時間,默認值為60秒。 nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # 設置讀超時時間為600秒。 nginx.ingress.kubernetes.io/proxy-send-timeout: "600" # 設置寫超時時間為600秒。 name: ws namespace: default spec: ingressClassName: nginx rules: - host: test.example.com http: paths: - backend: service: name: websocket-server port: number: 3000 path: / pathType: ImplementationSpecific
執行以下命令,部署示例Ingress。
kubectl apply -f websocket-ingress.yaml
執行以下命令,查看該應用的Ingress配置。
kubectl get ing ws
預期輸出:
NAME HOSTS ADDRESS PORTS AGE ws test.example.com 47.XX.XX.53 80 8m
步驟三:通過Nginx Ingress訪問WebSocket服務
執行以下命令,修改
/etc/hosts
配置文件來進行本地域名解析。echo "47.XX.XX.53 test.example.com" | sudo tee -a /etc/hosts
執行以下命令,訪問WebSocket服務。
websocat ws://test.example.com/
預期輸出:
說明WebSocket Server是一個回聲服務,它會將您發送的請求原樣返回。例如當您輸入helloworld和test時,系統會相應地回顯相同的內容。
步驟四: 使用WSS協議訪問WebSocket服務
WSS(WebSocket Secure)協議通過HTTPS為WebSocket通信提供安全保障,確保數據在傳輸過程中得到保護和完整性。在使用WSS協議訪問WebSocket服務之前,需要為域名test.example.com
配置HTTPS證書。
執行以下命令,使用OpenSSL生成的證書。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=test.example.com/O=test.example.com"
執行以下命令,創建證書密鑰。
kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
執行以下命令,編輯websocket-ingress.yaml文件,新增TLS證書內容后保存并退出。
vim websocket-ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 根據實際情況調整讀寫超時時間,默認值為60秒。 nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # 設置讀超時時間為600秒。 nginx.ingress.kubernetes.io/proxy-send-timeout: "600" # 設置寫超時時間為600秒。 name: ws namespace: default spec: ingressClassName: nginx tls: # 引用TLS證書。 - hosts: - test.example.com # 證書所對應的域名。 secretName: tls-test-ingress # 引用Sercret。 rules: - host: test.example.com http: paths: - backend: service: name: websocket-server port: number: 3000 path: / pathType: ImplementationSpecific
執行以下命令,使TLS證書配置生效。
kubectl apply -f websocket-ingress.yaml
執行以下命令,訪問
wss://test.example.com/
。說明如果使用OpenSSL生成的自簽證書,需要加
-k
參數,否則會報錯。而如果是受信任的CA簽發的證書,則無需額外參數正常連接即可。websocat -k wss://test.example.com/
預期輸出:
相關文檔
在ACK中哪些網關支持WebSocket協議,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比。
如果您需要維持較長時間的WebSocket連接,建議您配置自定義超時設置。關于自定義超時Annotation,請參見Custom timeouts。