WebSocket は、単一の伝送制御プロトコル ( TCP ) 接続を介して全二重通信チャネルを提供するコンピューター通信プロトコルです。 WebSocket は、オープンシステム相互接続 ( OSI ) モデルのアプリケーション層にあります。 WebSocket を使用すると、サーバーはクライアントにデータをプッシュできます。 WebSocket に準拠するサービスは、WebSocket サービスです。このトピックでは、イングレスゲートウェイを使用してサービスメッシュ ( ASM ) インスタンスの WebSocket サービスにアクセスする方法を示します。
前提条件
手順 1:サンプルアプリケーションをデプロイする
kubectl を使用して Container Service for Kubernetes ( ACK ) クラスタに接続します。詳細については、「クラスタの 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
手順 2:ルーティングルールを設定する
ASM コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。 ASM インスタンスの名前をクリックするか、管理[アクション] 列の をクリックします。
Istio ゲートウェイを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウの を選択します。表示されるページで、[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: - "*"numberパラメーターを80に設定します。これにより、WebSocket サービスはポート 80 経由で受信または送信 HTTP および TCP トラフィックを受信できます。
仮想サービスを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションウィンドウの を選択します。表示されるページで、[YAML から作成] をクリックします。
作成ページで、デフォルト[名前空間] ドロップダウンリストから [作成] を選択し、次の内容をコードエディタにコピーします。次に、 をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tornado spec: hosts: - "*" gateways: - tornado-gateway http: - match: - uri: prefix: / route: - destination: host: tornado weight: 100hostsパラメーターを*に設定します。 これにより、すべてのリクエストが WebSocket サービスにアクセスできます。
手順 3:イングレスゲートウェイの IP アドレスを照会する
方法 1:ASM コンソールを使用する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[イングレスゲートウェイ] ページで、[サービスアドレス] を取得します。
方法 2:ACK コンソールを使用する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のウィンドウで、 を選択します。
[サービス] ページで、istio-system[名前空間] ドロップダウンリストから 外部 IPistio-ingressgateway を選択します。 列で、 のポート 80 の IP アドレスを表示します。
手順 4:イングレスゲートウェイを使用して WebSocket サービスにアクセスする
4 つの異なるブラウザのアドレスバーに http://<イングレスゲートウェイの IP アドレス> と入力します。

次のコマンドを実行して、WebSocket サービスにアクセスします。
curl "http://<イングレスゲートウェイの IP アドレス>/api?id=8&value=300"curl "http://<イングレスゲートウェイの IP アドレス>/api?id=5&value=600"curl "http://<イングレスゲートウェイの IP アドレス>/api?id=1&value=200"curl "http://<イングレスゲートウェイの IP アドレス>/api?id=3&value=290"4 つのブラウザで WebSocket サービスのデータを表示します。 4 つのブラウザの WebSocket サービスのデータは同時に更新され、同じデータが表示されます。
手順 5:WebSocket Secure ( wss ) プロトコルに切り替える
イングレスゲートウェイのサーバー証明書と秘密鍵を作成します。詳細については、「手順 1:複数のサーバーのサーバー証明書と秘密鍵を準備する」をご参照ください。
サーバー証明書と秘密鍵を含むシークレットが ACK クラスタの istio-system 名前空間に作成され、シークレットの名前が 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
手順 6:wss プロトコルを使用して WebSocket サービスにアクセスする
コンピューターの hosts ファイルを変更して、a.aliyun.com ドメイン名をイングレスゲートウェイの IP アドレスに解決します。手順 5 のサブステップ 1 で作成した証明書のドメイン名を使用してイングレスゲートウェイにアクセスできることを確認します。
4 つの異なるブラウザのアドレスバーに https://a.aliyun.com と入力します。

次のコマンドを実行して、WebSocket サービスにアクセスします。
curl -k "https://<イングレスゲートウェイの IP アドレス>/api?id=8&value=300"curl -k "https://<イングレスゲートウェイの IP アドレス>/api?id=5&value=600"curl -k "https://<イングレスゲートウェイの IP アドレス>/api?id=1&value=200"curl -k "https://<イングレスゲートウェイの IP アドレス>/api?id=3&value=290"4 つのブラウザで WebSocket サービスのデータを表示します。 4 つのブラウザの WebSocket サービスのデータは同時に更新され、同じデータが表示されます。