WebSocket是一種網路傳輸協議,可在單個TCP串連上進行全雙工系統通訊,位於OSI模型的應用程式層。WebSocket允許服務端主動向用戶端推送資料。遵守WebSocket協議的服務即為WebSocket服務。本文通過樣本介紹如何通過ASM入口網關訪問網格內的WebSocket服務。
前提條件
步驟一:部署樣本應用
通過kubectl串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
使用以下內容,建立名為tornado的YAML檔案。
apiVersion: v1 kind: Service metadata: name: tornado labels: app: tornado service: tornado spec: ports: - port: 8888 name: http selector: app: tornado --- apiVersion: apps/v1 kind: Deployment metadata: name: tornado spec: replicas: 1 selector: matchLabels: app: tornado version: v1 template: metadata: labels: app: tornado version: v1 spec: containers: - name: tornado image: registry.cn-beijing.aliyuncs.com/aliacs-app-catalog/tornado:lastest imagePullPolicy: Always ports: - containerPort: 8888 ---
執行以下命令,建立tornado應用。
kubectl apply -f tornado.yaml
步驟二:設定路由規則
登入ASM控制台。
在左側導覽列,選擇 。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
建立網關規則。
在網格詳情頁面左側導覽列,選擇 ,然後在右側頁面,單擊使用YAML建立。
設定命名空間為default,將以下內容複寫到文字框中,單擊建立。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
設定
number
為80
,使WebSocket服務通過80連接埠接收傳入或傳出的HTTP或TCP串連。
建立虛擬服務。
在網格詳情頁面左側導覽列,選擇 ,然後在右側頁面,單擊使用YAML建立。
設定命名空間為default,將以下內容複寫到文字框中,單擊建立。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tornado spec: hosts: - "*" gateways: - tornado-gateway http: - match: - uri: prefix: / route: - destination: host: tornado weight: 100
設定
hosts
為*
,表示任意請求都可以訪問WebSocket服務。
步驟三:擷取入口網關的地址
在控制台左側導覽列,單擊叢集。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇 。
在服務頁面頂部設定命名空間為istio-system,查看istio-ingressgateway External IP列下連接埠為80的IP地址。
步驟四:驗證通過入口網關訪問WebSocket服務
在四個不同類型的瀏覽器中輸入http://<入口網關地址>。
分別執行以下命令,請求WebSocket服務。
curl "http://<入口網關地址>/api?id=8&value=300"
curl "http://<入口網關地址>/api?id=5&value=600"
curl "http://<入口網關地址>/api?id=1&value=200"
curl "http://<入口網關地址>/api?id=3&value=290"
可以看到,四個瀏覽器的WebSocket服務頁面資料同時被更新,且頁面顯示結果一致。
步驟五:切換使用wss協議訪問
為上述網關設定伺服器憑證和私密金鑰。具體操作,請參見步驟一:為多個主機準備伺服器憑證和私密金鑰。
請確保在ACK叢集下的istio-system命名空間中,已經建立了包含認證和私密金鑰的Secret,且Secret名稱為myexample-credential。
修改步驟二:設定路由規則中建立的路由規則。
YAML樣本如下:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" - hosts: - "*" port: name: https number: 443 protocol: HTTPS tls: credentialName: myexample-credential mode: SIMPLE
步驟六:驗證使用wss協議訪問WebSocket服務
修改原生hosts檔案,將a.aliyun.com解析到ASM網關的IP地址,確保可以通過步驟五.1中設定的認證中的網域名稱訪問到ASM網關。
在四個不同類型的瀏覽器中輸入https://a.aliyun.com。
分別執行以下命令,請求WebSocket服務。
curl -k "https://<入口網關地址>/api?id=8&value=300"
curl -k "https://<入口網關地址>/api?id=5&value=600"
curl -k "https://<入口網關地址>/api?id=1&value=200"
curl -k "https://<入口網關地址>/api?id=3&value=290"
可以看到,四個瀏覽器的WebSocket服務頁面資料同時被更新,且頁面顯示結果一致。