WebSocket プロトコルは、クライアントとサーバー間の双方向の継続的な通信を可能にします。これにより、永続的な接続と低レイテンシが保証されます。Container Service for Kubernetes(ACK)クラスターが外部 WebSocket サービスにアクセスする場合、クラウドネイティブゲートウェイがリクエストを受信して転送し、事前定義されたルーティングルールに基づいて特定のバックエンドサービスにリクエストを配信します。このトピックでは、Container Service for Kubernetes クラスターに WebSocket アプリケーションをデプロイし、クラウドネイティブゲートウェイを使用してリクエストを転送する方法について説明します。
前提条件
ACK クラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
MSE クラウドネイティブゲートウェイが作成されていること。詳細については、「クラウドネイティブゲートウェイの作成」をご参照ください。
手順 1:ACK クラスターに WebSocket アプリケーションをデプロイする
アプリケーションのデプロイ方法の詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。
この例では、ACK クラスターはサービスディスカバリに使用されます。バックエンドサービスは、アノテーションベースのサービス API を使用して CoreDNS に登録されます。この例のバックエンドサービスは、複数の WebSocket API を提供します。ACK クラスターにデプロイされる WebSocket アプリケーションは、次のリソース構成を使用します。
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手順 2:クラウドネイティブゲートウェイを使用して WebSocket アプリケーションのリクエストをルーティングする
ACK クラスターをクラウドネイティブゲートウェイのサービスソースとして追加し、Sockbin サービスを追加します。
サービスソースを追加する
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[ソース] タブをクリックします。
[ソース] タブで、[ソースの追加] をクリックします。[ソースの追加] パネルでパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
ソースタイプ
[コンテナサービス] を選択します。
ACK/ACK Serverless クラスターACK Serverless クラスタ
バックエンドサービスがデプロイされているクラスターを選択します。
Kubernetes Ingress をリッスンする
スイッチをオンにすると、クラウドネイティブゲートウェイは Ingress リソースの変更を自動的にリッスンし、Ingress リソースのドメイン名とルートのリッスンされた構成を有効にします。
スイッチをオフにすると、クラウドネイティブゲートウェイは Ingress リソースの変更をリッスンしなくなり、Ingress リソースのドメイン名とルートのリッスンされた構成は無効になります。
説明MSE コンソールで手動で設定されたドメイン名とルートの優先度は、Ingress リソースのリッスンされたドメイン名とルートの優先度よりも高くなります。
サービスを追加する
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[サービス] タブをクリックします。
[サービス] タブで、[サービスの追加] をクリックします。[サービスの追加] パネルでパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
サービスソース
[コンテナサービス] を選択します。
名前空間
宛先クラスターの名前空間を選択します。
サービス
1 つ以上のサービスを選択します。
ゲートウェイから Sockbin サービスへのルートを追加する
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックし、[ルート] タブをクリックします。
[ルート] タブで、[ルートの追加] をクリックします。表示されるページでパラメーターを設定し、[保存してアドバタイズ] をクリックします。
パラメーター
説明
ルーティングルール名
sockbin-routeと入力します。ドメイン名
ドロップダウンリストからデフォルトの関連ドメイン名 * を選択します。
パス
一致条件ドロップダウンリストから [プレフィックス] を選択し、フィールドに
/と入力します。シナリオ
[単一サービス] を選択します。
バックエンドサービス
宛先の [サービス] とサービス [ポート] を選択します。
結果の確認
次のいずれかの方法を使用して、WebSocket サービスの可用性を確認できます。
方法 1:Sockbin サービスページでテストを実施する
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
Overview ページの Gateway Ingress タブで、ゲートウェイに関連付けられている Server Load Balancer(SLB)インスタンスのパブリックエンドポイントを見つけます。次に、ブラウザーのアドレスバーにエンドポイントを入力し、Enter キーを押します。
ゲートウェイは、WebSocket ハンドシェイクリクエストに含まれるドメイン名とパスに基づいてルーティングを実行し、Sockbin サービスページを開きます。

方法 2:特定のプログラミング言語の 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:
# WebSocket サーバーに接続します。
await websocket.send("Hello Test")
# メッセージを送信します。
text = await websocket.recv()
# サーバーからのレスポンスを受信します。
print(text)
asyncio.run(hello())