Tous les produits
Search
Centre de documentation

Microservices Engine:Acheminer les services gRPC avec une Cloud Native Gateway

Dernière mise à jour :Aug 21, 2026

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.

Remarque

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

  1. Connectez-vous à la console MSE. Dans la barre de navigation supérieure, sélectionnez une région.

  2. Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.

  3. Dans le volet de navigation de gauche, cliquez sur Routes. Ensuite, cliquez sur l'onglet Source.

  4. 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.

    Remarque

    Lors 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.

    Important

    Les 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 class ou le champ Spec.IngressClassName correspond à la valeur spécifiée. Par exemple, si vous définissez cette valeur sur nginx, la passerelle surveille les ressources Ingress avec une IngressClass nginx ainsi 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 Status de l'Ingress surveillé avec l'adresse IP de l'instance Server Load Balancer (SLB) associée à la Cloud Native Gateway.

    Remarque

    Cette 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

  1. Connectez-vous à la console MSE et sélectionnez une région dans la barre de navigation supérieure.

  2. Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.

  3. Dans le volet de navigation de gauche, cliquez sur Routes. Ensuite, cliquez sur l'onglet Services.

  4. 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

  1. Connectez-vous à la console MSE et sélectionnez une région dans la barre de navigation supérieure.

  2. Dans le volet de navigation de gauche, choisissez Cloud-native Gateway > Gateways. Sur la page Gateways, cliquez sur l'ID de la passerelle.

  3. Dans le volet de navigation de gauche, cliquez sur Routes. Ensuite, cliquez sur l'onglet Routes.

  4. 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.

    Remarque

    Le 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"
  }
}