WebSocket プロトコルは、クライアントとサーバー間の永続的で低レイテンシーな双方向通信を可能にします。 Kubernetes クラスターの外部から WebSocket サービスにアクセスすると、MSE クラウドネイティブゲートウェイは、定義されたルーティングルールに基づいてリクエストを受信し、適切なバックエンドサービスに転送します。 このチュートリアルでは、Container Service for Kubernetes (ACK) クラスターに WebSocket アプリケーションをデプロイし、トラフィック転送に MSE クラウドネイティブゲートウェイを使用する方法を説明します。
前提条件
-
ACK マネージドクラスターを作成済みであること。
-
MSE クラウドネイティブゲートウェイを作成済みであること。
ステップ1:WebSocket アプリケーションのデプロイ
詳細な手順については、「Deployment を使用したステートレスワークロードの作成」をご参照ください。
このチュートリアルでは、Kubernetes ネイティブのサービスディスカバリー方式を使用します。宣言型 Service API リソースによってバックエンドサービスを CoreDNS に登録します。サンプルのバックエンドサービスは、複数の WebSocket エンドポイントを提供します。ACK クラスターで以下の YAML 設定を適用します。
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 をクリックします。表示されるページで、[ソース] タブをクリックします。
-
Add Source をクリックし、次のパラメーターを設定して、OK をクリックします。
パラメーター
説明
Source Type
Container Service を選択します。
ACK/ACK Serverless クラスター
バックエンドサービスがデプロイされているクラスターを選択します。
[Listen to Kubernetes Ingress]
このオプションを有効にすると、MSE クラウドネイティブゲートウェイは Ingress リソースの変更を自動的にリッスンし、それらのリソースで定義されたドメイン名とルート設定を適用します。
このオプションを無効にすると、ゲートウェイは Ingress リソースのリッスンを停止し、それらのリソースから以前に適用された設定は無効になります。
説明MSE コンソールで手動で設定したドメイン名とルートは、Ingress リソースによる設定よりも優先されます。
サービスの追加
MSE コンソールにログオンし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションウィンドウで、Routes をクリックします。表示されるページで、[サービス] タブをクリックします。
-
Create Service をクリックして次のパラメーターを設定し、OK をクリックします。
パラメーター
説明
[Service Sources]
Container Service を選択します。
[Namespaces]
対象クラスターのネームスペースを選択します。
[Services]
リストからサービスを選択します。
Sockbin ルートの追加
MSE コンソールにログオンし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションウィンドウで、Routes をクリックし、[ルート] タブをクリックします。
-
Add Route をクリックし、以下のパラメーターを設定してから、Save and Advertise をクリックします。
パラメーター
説明
Route Name
sockbin-routeと入力します。Domain Name
デフォルトのドメイン名
*を選択します。Path
マッチ条件には、Prefix を選択します。パス値には、
/を入力します。Scenario
Single Service を選択します。
Backend Service
対象のServiceとService Portを選択します。
結果の検証
次のいずれかの方法で、WebSocket サービスが利用可能であることを検証できます。
方法1:Sockbin UI でのテスト
MSE コンソールにログオンし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーション ウィンドウで、Cloud-Native Gateway > ゲートウェイリスト を選択します。 [ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
-
ゲートウェイのOverviewページのGateway Ingressタブに移動し、関連付けられた Server Load Balancer (SLB) インスタンスのパブリックエンドポイントを見つけてブラウザで開きます。
ゲートウェイは、WebSocket ハンドシェイクのドメイン名とパスに基づいて、リクエストを Sockbin サービス UI にルーティングします。
Output: CONNECTING to / ... CONNECTED to / SENT: Hello Sockbin! RESPONSE: { "timestamp": "Tue May 31 2022 07:49:41 GMT+0000 (UTC)", "url": "http://sockb.in/", "reqData": "Hello 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:
await websocket.send("Hello Test")
text = await websocket.recv()
print(text)
asyncio.run(hello())