全部產品
Search
文件中心

Microservices Engine:雲端式原生網關實現WebSocket服務的轉寄

更新時間:Dec 27, 2024

WebSocket協議實現了用戶端與伺服器間的持續、雙向通訊,確保了串連的持久性和低延遲。在Kubernetes叢集外部存取WebSocket服務時,雲原生網關承擔了請求接收和轉寄的角色,根據預定的路由規則將請求分發到相應的後端服務。本文介紹了如何在Container Service for Kubernetes叢集部署WebSocket應用,並通過雲原生網關進行流量轉寄。

前提條件

步驟一:使用Container Service部署WebSocket應用

應用部署的具體操作,請參見建立無狀態工作負載Deployment

在本樣本中,使用Container ServiceK8s原生的服務發現方式,即通過聲明式Service API資源將後端服務註冊到CoreDNS。樣本中的後端服務提供了多個WebSocket介面,在Container ServiceACK中應用如下資源:

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服務。

添加服務來源

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,選擇路由管理,然後選擇來源頁簽。

  4. 單擊建立來源並配置相關參數,配置完成後單擊確定

    配置項

    描述

    來源類型

    選擇Container Service服務來源。

    ACK/ACK Serverless叢集

    選擇後端服務所在的叢集。

    監聽K8s Ingress

    開啟監聽Ingress配置後,雲原生網關會自動監聽Ingress資源的變化,並生效Ingress資源中網域名稱、路由的相關配置。

    關閉監聽Ingress配置後,雲原生網關會放棄監聽Ingress資源,同時,之前已監聽的Ingress資源中網域名稱、路由相關配置會失效。

    說明

    通過管控手動設定的網域名稱、路由的相關配置的優先順序高於Ingress資源。

添加服務

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,選擇路由管理,然後選擇服務頁簽。

  4. 單擊建立服務並配置相關參數,然後單擊確定

    配置項

    說明

    服務來源

    選擇Container Service

    命名空間

    選擇目的地組群的命名空間。

    服務列表

    在服務列表中選擇服務。

添加網關到Sockbin服務的路由

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,單擊路由管理,然後選擇路由頁簽。

  4. 單擊建立路由並配置相關參數,然後單擊儲存並發布

    配置項

    說明

    路由名稱

    設定為sockbin-route

    網域名稱

    選擇預設關聯網域名稱*。

    路徑(Path)

    選擇匹配條件為首碼是,Path以/開頭。

    使用情境

    選擇使用情境為單服務

    後端服務

    選擇目標服務以及服務連接埠

結果驗證

本文為您提供兩種方式來驗證WebSocket服務可用性。

方式一:通過Sockbin服務的介面直接進行測試

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在網關基本概览頁面,找到网关入口頁簽,在綁定的SLB中找到公網入口地址,在瀏覽器中訪問入口地址。

    網關會根據WebSocket握手時攜帶的網域名稱和Path進行路由,即可得到Sockbin服務的介面。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())