全部產品
Search
文件中心

Alibaba Cloud Service Mesh:通過入口網關訪問網格內WebSocket服務

更新時間:Jun 30, 2024

WebSocket是一種網路傳輸協議,可在單個TCP串連上進行全雙工系統通訊,位於OSI模型的應用程式層。WebSocket允許服務端主動向用戶端推送資料。遵守WebSocket協議的服務即為WebSocket服務。本文通過樣本介紹如何通過ASM入口網關訪問網格內的WebSocket服務。

前提條件

步驟一:部署樣本應用

  1. 通過kubectl串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 使用以下內容,建立名為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
    ---
  3. 執行以下命令,建立tornado應用。

    kubectl apply -f tornado.yaml

步驟二:設定路由規則

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 建立網關規則

    1. 在網格詳情頁面左側導覽列,選擇ASM網關 > 網關規則,然後在右側頁面,單擊使用YAML建立

    2. 設定命名空間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:
          - "*"

      設定number80,使WebSocket服務通過80連接埠接收傳入或傳出的HTTP或TCP串連。

  5. 建立虛擬服務

    1. 在網格詳情頁面左側導覽列,選擇流量管理中心 > 虛擬服務,然後在右側頁面,單擊使用YAML建立

    2. 設定命名空間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服務。

步驟三:擷取入口網關的地址

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,單擊叢集

  3. 叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

  4. 在叢集管理頁左側導覽列,選擇網路 > 服務

  5. 服務頁面頂部設定命名空間istio-system,查看istio-ingressgateway External IP列下連接埠為80的IP地址。

步驟四:驗證通過入口網關訪問WebSocket服務

  1. 在四個不同類型的瀏覽器中輸入http://<入口網關地址>

    服務

  2. 分別執行以下命令,請求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協議訪問

  1. 為上述網關設定伺服器憑證和私密金鑰。具體操作,請參見步驟一:為多個主機準備伺服器憑證和私密金鑰

    請確保在ACK叢集下的istio-system命名空間中,已經建立了包含認證和私密金鑰的Secret,且Secret名稱為myexample-credential。

  2. 修改步驟二:設定路由規則中建立的路由規則。

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

  1. 修改原生hosts檔案,將a.aliyun.com解析到ASM網關的IP地址,確保可以通過步驟五.1中設定的認證中的網域名稱訪問到ASM網關。

  2. 在四個不同類型的瀏覽器中輸入https://a.aliyun.com

    服務

  3. 分別執行以下命令,請求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服務頁面資料同時被更新,且頁面顯示結果一致。