WebSocket協議實現了客戶端與服務器間的持續、雙向通訊,確保了連接的持久性和低延遲。在Kubernetes集群外部訪問WebSocket服務時,云原生網關承擔了請求接收和轉發的角色,根據預定的路由規則將請求分發到相應的后端服務。本文介紹了如何在容器服務 Kubernetes 版集群部署WebSocket應用,并通過云原生網關進行流量轉發。
前提條件
步驟一:使用容器服務部署WebSocket應用
應用部署的具體操作,請參見創建無狀態工作負載Deployment。
在本示例中,使用容器服務K8s原生的服務發現方式,即通過聲明式Service API資源將后端服務注冊到CoreDNS。示例中的后端服務提供了多個WebSocket接口,在容器服務ACK中應用如下資源:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: sockbin
name: sockbin-app
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: sockbin
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: sockbin
spec:
containers:
- image: therebelrobot/sockbin
imagePullPolicy: Always
name: sockbin
ports:
- containerPort: 4080
protocol: TCP
resources:
limits:
cpu: 500m
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
labels:
app: sockbin
name: sockbin-service
namespace: default
spec:
ports:
- name: http
port: 4080
protocol: TCP
targetPort: 4080
selector:
app: sockbin
sessionAffinity: None
type: NodePort
步驟二:使用云原生網關作為WebSocket的路由分發
添加ACK集群作為網關的服務來源并添加Sockbin服務。
添加服務來源
登錄MSE管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 網關列表,單擊目標網關名稱。
在左側導航欄,選擇路由管理,然后選擇來源頁簽。
單擊創建來源并配置相關參數,配置完成后單擊確定。
配置項
描述
來源類型
選擇容器服務服務來源。
ACK/ACK Serverless集群
選擇后端服務所在的集群。
監聽K8s Ingress
開啟監聽Ingress配置后,云原生網關會自動監聽Ingress資源的變化,并生效Ingress資源中域名、路由的相關配置。
關閉監聽Ingress配置后,云原生網關會放棄監聽Ingress資源,同時,之前已監聽的Ingress資源中域名、路由相關配置會失效。
說明通過管控手動配置的域名、路由的相關配置的優先級高于Ingress資源。
添加服務
登錄MSE管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 網關列表,單擊目標網關名稱。
在左側導航欄,選擇路由管理,然后選擇服務頁簽。
單擊創建服務并配置相關參數,然后單擊確定。
配置項
說明
服務來源
選擇容器服務。
命名空間
選擇目標集群的命名空間。
服務列表
在服務列表中選擇服務。
添加網關到Sockbin服務的路由
登錄MSE管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 網關列表,單擊目標網關名稱。
在左側導航欄,單擊路由管理,然后選擇路由頁簽。
單擊創建路由并配置相關參數,然后單擊保存并發布。
配置項
說明
路由名稱
設置為
sockbin-route
。域名
選擇默認關聯域名*。
路徑(Path)
選擇匹配條件為前綴是,Path以
/
開頭。使用場景
選擇使用場景為單服務。
后端服務
選擇目標服務以及服務端口。
結果驗證
本文為您提供兩種方式來驗證WebSocket服務可用性。
方式一:通過Sockbin服務的界面直接進行測試
登錄MSE管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 網關列表,單擊目標網關名稱。
在網關基本概覽頁面,找到網關入口頁簽,在綁定的SLB中找到公網入口地址,在瀏覽器中訪問入口地址。
網關會根據WebSocket握手時攜帶的域名和Path進行路由,即可得到Sockbin服務的界面。
方式二:使用各種語言的WebSocket客戶端進行測試
例如,使用Python的WebSocket客戶端來得到一個延遲1秒的服務端響應。
#!/usr/bin/env python
import asyncio
import websockets
async def hello():
async with websockets.connect("ws://ip_addr/delay/1000") as websocket:
await websocket.send("Hello Test")
text = await websocket.recv()
print(text)
asyncio.run(hello())