WebSocket permet une communication bidirectionnelle persistante et à faible latence entre les clients et les serveurs. Lorsque vous accédez à un service WebSocket depuis l'extérieur d'un cluster Kubernetes, une passerelle cloud-native MSE reçoit les requêtes et les transfère vers le service backend approprié en fonction des règles de routage. Cette rubrique explique comment déployer une application WebSocket dans un cluster Container Service for Kubernetes (ACK) et acheminer le trafic via une passerelle cloud-native MSE.
Prérequis
Vous avez créé un cluster ACK managé.
Vous avez créé une passerelle cloud-native MSE.
Étape 1 : Déployer l'application WebSocket
Pour obtenir des instructions détaillées, consultez la rubrique Créer une charge de travail sans état à l'aide d'un déploiement.
Ce tutoriel utilise la découverte de service native de Kubernetes. Une ressource Service enregistre le backend auprès de CoreDNS. L'exemple de backend fournit plusieurs endpoints WebSocket. Appliquez la configuration YAML suivante dans votre cluster ACK :
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
Étape 2 : Acheminer le trafic WebSocket
Ajoutez le cluster ACK en tant que source de service pour la passerelle, puis ajoutez le service Sockbin.
Ajouter une source de service
Connectez-vous à la console MSE, puis sélectionnez une région dans la barre de navigation supérieure.
Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.
Dans le volet de navigation de gauche, cliquez sur Routes. Ensuite, cliquez sur l'onglet Source.
-
Cliquez sur Add Source, configurez les paramètres suivants, puis cliquez sur OK.
Paramètre
Description
Source Type
Sélectionnez Container Service.
ACK/ACK Serverless Cluster
Sélectionnez le cluster dans lequel votre service backend est déployé.
Listen to Kubernetes Ingress
Si vous activez cette option, la passerelle cloud-native MSE écoute automatiquement les modifications apportées aux ressources Ingress et applique les configurations de nom de domaine et de route définies dans ces ressources.
Si vous désactivez cette option, la passerelle arrête d'écouter les ressources Ingress et toutes les configurations précédemment appliquées à partir de ces ressources deviennent invalides.
RemarqueLes noms de domaine et les routes que vous configurez manuellement dans la console MSE ont priorité sur les configurations provenant des ressources Ingress.
Ajouter un service
Connectez-vous à la console MSE, puis sélectionnez une région dans la barre de navigation supérieure.
Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.
Dans le volet de navigation de gauche, cliquez sur Routes. Ensuite, cliquez sur l'onglet Services.
-
Cliquez sur Create Service, configurez les paramètres suivants, puis cliquez sur OK.
|
**Paramètre**
|
**Description**
| | --- | --- | |
**Service Sources**
|
Sélectionnez **Container Service**.
| |
**Namespaces**
|
Sélectionnez le namespace du cluster cible.
| |
**Services**
|
Sélectionnez votre service dans la liste.
|
Ajouter une route Sockbin
Connectez-vous à la console MSE, puis sélectionnez une région dans la barre de navigation supérieure.
Dans le volet de navigation de gauche, choisissez Service Sources > Container Service. Sur la page Gateways, cliquez sur l'ID de la passerelle.
Dans le volet de navigation de gauche, cliquez sur Namespaces. Ensuite, cliquez sur l'onglet Services.
-
Cliquez sur Add Route, configurez les paramètres suivants, puis cliquez sur Save and Advertise.
|
**Paramètre**
|
**Description**
| | --- | --- | |
**Route Name**
|
Saisissez `sockbin-route`.
| |
**Domain Name**
|
Sélectionnez le nom de domaine par défaut *.
| |
**Path**
|
Pour la condition de correspondance, sélectionnez **Prefix**. Pour la valeur du chemin, saisissez `/`.
| |
**Scenario**
|
Sélectionnez **Single Service**.
| |
**Backend Service**
|
Sélectionnez le **Service** cible et le **Service Port** cible.
|
Vérifier les résultats
Utilisez l'une des méthodes suivantes pour vérifier que le service WebSocket est disponible.
Méthode 1 : Tester avec l'interface utilisateur Sockbin
Connectez-vous à la console MSE, puis sélectionnez une région dans la barre de navigation supérieure.
Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.
-
Sur la page Overview de la passerelle, accédez à l'onglet Gateway Ingress. Recherchez l'endpoint public de l'instance Server Load Balancer (SLB) associée et ouvrez-la dans un navigateur.
La passerelle achemine la requête vers l'interface utilisateur du service Sockbin en fonction du nom de domaine et du chemin dans le handshake WebSocket.
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!" }
Méthode 2 : Tester avec un client WebSocket
Vous pouvez également utiliser un client WebSocket Python. L'exemple suivant reçoit une réponse du serveur avec un délai d'une seconde.
#!/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())