gRPC utilise le protocole HTTP/2 et prend en charge des fonctionnalités telles que la diffusion bidirectionnelle, la compression des en-têtes et le multiplexage afin d'améliorer l'efficacité du réseau. Cette rubrique explique comment déployer une application gRPC dans un cluster Container Service for Kubernetes (ACK) et utiliser une Cloud Native Gateway pour acheminer son trafic.
Prérequis
Étape 1 : Déployer l'application gRPC
Pour obtenir des instructions détaillées, consultez la rubrique Créer une charge de travail sans état à l'aide d'un Deployment.
Cet exemple utilise l'application grpcbin comme service backend de démonstration, qui implémente plusieurs méthodes gRPC. Appliquez les ressources suivantes à votre cluster ACK.
Dans un service Kubernetes, le name du port qui gère le trafic gRPC doit inclure grpc.
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpcbin
spec:
replicas: 1
selector:
matchLabels:
app: grpcbin
template:
metadata:
labels:
app: grpcbin
spec:
serviceAccountName: grpcbin
containers:
- image: docker.io/moul/grpcbin
imagePullPolicy: IfNotPresent
name: grpcbin
ports:
- containerPort: 9000
- containerPort: 9001
resources:
requests:
cpu: '1'
memory: 2Gi
limit:
cpu: '1'
memory: 2Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: grpcbin
---
apiVersion: v1
kind: Service
metadata:
name: grpcbin-grpc
labels:
app: grpcbin
spec:
ports:
- name: grpc
port: 9000
targetPort: 9000
selector:
app: grpcbin
Le code suivant présente la définition proto de ce service gRPC.
syntax = "proto3";
package grpcbin;
service GRPCBin {
rpc Index(EmptyMessage) returns (IndexReply) {}
// A method with no parameters that returns an empty response.
rpc Empty(EmptyMessage) returns (EmptyMessage) {}
// Echoes the request parameters in the response.
rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
// A server-streaming call that returns 10 messages.
rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
// A client-streaming call that accepts 10 requests and returns the body of the last one.
rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
// A bidirectional streaming method.
rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
// This method returns a specified gRPC error.
rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
// This method returns a random error.
rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
// This method returns headers.
rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
// This method returns no response.
rpc NoResponseUnary(EmptyMessage) returns (EmptyMessage) {}
}
message HeadersMessage {
message Values {
repeated string values = 1;
}
map<string, Values> Metadata = 1;
}
message SpecificErrorRequest {
uint32 code = 1;
string reason = 2;
}
message EmptyMessage {}
message DummyMessage {
message Sub {
string f_string = 1;
}
enum Enum {
ENUM_0 = 0;
ENUM_1 = 1;
ENUM_2 = 2;
}
string f_string = 1;
repeated string f_strings = 2;
int32 f_int32 = 3;
repeated int32 f_int32s = 4;
Enum f_enum = 5;
repeated Enum f_enums = 6;
Sub f_sub = 7;
repeated Sub f_subs = 8;
bool f_bool = 9;
repeated bool f_bools = 10;
int64 f_int64 = 11;
repeated int64 f_int64s= 12;
bytes f_bytes = 13;
repeated bytes f_bytess = 14;
float f_float = 15;
repeated float f_floats = 16;
}
message IndexReply {
message Endpoint {
string path = 1;
string description = 2;
}
string description = 1;
repeated Endpoint endpoints = 2;
}
gRPC est basé sur le protocole HTTP/2 et ses chemins suivent le format {PackageName}.{ServiceName}/{MethodName}. Cela permet à la Cloud Native Gateway d'acheminer les requêtes en fonction du chemin. Par exemple, un appel gRPC à la méthode Index du service grpcbin possède un chemin grpcbin.GRPCBin/Index.
Étape 2 : Configurer le routage gRPC
Ajoutez le cluster ACK en tant que source de service pour la passerelle, puis ajoutez le service grpcbin.
Ajouter une source de service
Connectez-vous à la console MSE. Dans la barre de navigation supérieure, sélectionnez une région.
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. Dans le panneau Add Source, définissez le type de source sur Container Service, configurez les paramètres, puis cliquez sur OK.
Paramètre
Description
ACK/ACK Serverless Cluster
Sélectionnez le cluster où se trouve le service backend.
RemarqueLors de la création de la passerelle, vous devez sélectionner le même Virtual Private Cloud (VPC) que celui du cluster backend. Ensuite, lorsque vous ajoutez la source de service, le système détecte automatiquement les clusters présents dans ce VPC.
Listen to Kubernetes Ingress
-
Si vous activez cette option, la Cloud Native Gateway surveille automatiquement les modifications apportées aux ressources Ingress et applique les configurations de domaine et de route issues de ces ressources.
-
Si vous désactivez cette option, la Cloud Native Gateway cesse de surveiller les ressources Ingress et invalide les configurations précédemment appliquées à partir de ces ressources. Utilisez cette option avec prudence.
ImportantLes configurations de domaine et de route définies manuellement dans la console ont une priorité plus élevée que celles provenant des ressources Ingress.
Ingress Class
Surveille les ressources Ingress associées à l'IngressClass spécifié.
-
Si ce champ est laissé vide, la passerelle surveille toutes les ressources Ingress du cluster.
-
Si vous spécifiez une valeur (une seule valeur est prise en charge), la passerelle surveille les ressources Ingress dont l'annotation
classou le champSpec.IngressClassNamecorrespond à la valeur spécifiée. Par exemple, si vous définissez cette valeur surnginx, la passerelle surveille les ressources Ingress avec une IngressClassnginxainsi que les ressources Ingress non associées à une IngressClass.
Namespace
Surveille les ressources Ingress dans un namespace spécifique.
-
Si ce champ est laissé vide, la passerelle surveille les ressources Ingress dans tous les namespaces du cluster.
-
Si vous spécifiez une valeur (une seule valeur est prise en charge), la passerelle surveille les ressources Ingress dans le namespace spécifié.
Update Ingress Status
Si vous activez cette option, le système met à jour l'adresse IP dans le champ
Statusde l'Ingress surveillé avec l'adresse IP de l'instance Server Load Balancer (SLB) associée à la Cloud Native Gateway.RemarqueCette fonctionnalité nécessite la version 1.2.9 ou ultérieure de la passerelle.
Security Group Authorization
Un groupe de sécurité est configuré pour le pool de nœuds du cluster de conteneurs. Pour permettre aux composants externes au cluster d'accéder aux services internes, vous devez ouvrir les ports de service requis dans le groupe de sécurité.
Vous pouvez modifier le groupe de sécurité. Pour plus d'informations, consultez la rubrique Définir les règles de groupe de sécurité.
-
Ajouter un service
Connectez-vous à la console MSE et 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 dans le panneau, puis cliquez sur OK.
Paramètre
Description
Service Sources
Sélectionnez Container Service.
Namespaces
Sélectionnez le namespace du cluster cible.
Services
Sélectionnez le service dans la liste.
Ajouter une route grpcbin
Connectez-vous à la console MSE et 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 Routes.
-
Cliquez sur Add Route. Sur la page Add Route, configurez les paramètres de la route, puis cliquez sur Save and Advertise. Pour obtenir des instructions détaillées, consultez la rubrique Ajouter une route.
Paramètre
Description
Route Name
Définissez la valeur sur
grpc.Domain Name
Sélectionnez le domaine par défaut *.
Path
Définissez la condition de correspondance sur Prefix et définissez la valeur du chemin sur
/grpcbin.GRPCBin.RemarqueLe format de chemin pour un service gRPC est {PackageName}.{ServiceName}/{MethodName}. Vous pouvez configurer une route basée sur un préfixe selon ce format.
Scenario
Définissez Scenario sur Single Service.
Backend Service
Sélectionnez le service cible et le port de service.
Vérifier les résultats
Utilisez bloomrpc pour tester le service gRPC. Une réponse réussie confirme que le service est disponible.
Vous pouvez également utiliser d'autres clients gRPC pour effectuer des tests.
Utilisez BloomRPC pour initier un appel Unary vers la méthode grpcbin.GRPCBin.DummyUnary. Exemple de corps de requête :
{
"f_string": "Hello",
"f_strings": [
"Hello"
],
"f_int32": 10,
"f_int32s": [
10
],
"f_enum": 0,
"f_enums": [
0
],
"f_sub": {
"f_string": "Hello"
},
"f_subs": [
{
"f_string": "Hello"
}
],
"f_bool": true,
"f_bools": [
true
],
"f_int64": 20,
"f_int64s": [
20
],
"f_bytes": {}
}
Exemple de réponse du serveur (latence : ~0,14 s) :
{
"f_strings": [
"Hello"
],
"f_int32s": [
10
],
"f_enums": [
"ENUM_0"
],
"f_subs": [
{
"f_string": "Hello"
}
],
"f_bools": [
true
],
"f_int64s": [
"20"
],
"f_bytess": [],
"f_floats": [
1.100000023841858
],
"f_string": "Hello",
"f_int32": 10,
"f_enum": "ENUM_0",
"f_sub": {
"f_string": "Hello"
}
}