gRPC utiliza el protocolo HTTP/2 y admite funciones como streaming bidireccional, compresión de encabezados y multiplexación para mejorar la eficiencia de la red. Este tema muestra cómo desplegar una aplicación gRPC en un clúster de Container Service for Kubernetes (ACK) y utilizar Cloud Native Gateway para enrutar su tráfico.
Requisitos previos
Paso 1: Desplegar la aplicación gRPC
Para obtener instrucciones detalladas, consulte Create a stateless workload by using a Deployment.
Este ejemplo utiliza la aplicación grpcbin como servicio de backend de muestra, la cual implementa varios métodos gRPC. Aplique los siguientes recursos a su clúster de ACK.
En un servicio de Kubernetes, el name del port que maneja el tráfico gRPC debe incluir 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
El siguiente código muestra la definición proto para este servicio 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 se basa en el protocolo HTTP/2 y sus rutas siguen el formato {PackageName}.{ServiceName}/{MethodName}. Esto permite que Cloud Native Gateway enrute las solicitudes según la ruta. Por ejemplo, una llamada gRPC al método Index del servicio grpcbin tiene la ruta grpcbin.GRPCBin/Index.
Paso 2: Configurar el enrutamiento gRPC
Agregue el clúster de ACK como origen de servicio para la puerta de enlace y luego agregue el servicio grpcbin.
Agregar un origen de servicio
Inicie sesión en la consola de MSE. En la barra de navegación superior, seleccione una región.
En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.
En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Source.
-
Haga clic en Add Source. En el panel Add Source, establezca Source Type en Container Service, configure los parámetros y luego haga clic en OK.
Parámetro
Descripción
ACK/ACK Serverless Cluster
Seleccione el clúster donde se encuentra el servicio de backend.
NotaAl crear la puerta de enlace, debe seleccionar la misma Virtual Private Cloud (VPC) que el clúster de backend. Posteriormente, al agregar el origen de servicio, el sistema descubre automáticamente los clústeres en esa VPC.
Listen to Kubernetes Ingress
-
Si habilita esta opción, Cloud Native Gateway escucha automáticamente los cambios en los recursos de Ingress y aplica las configuraciones de dominio y ruta de dichos recursos.
-
Si deshabilita esta opción, Cloud Native Gateway deja de escuchar los recursos de Ingress e invalida las configuraciones aplicadas previamente desde esos recursos. Utilice esta opción con precaución.
ImportanteLas configuraciones de dominio y ruta establecidas manualmente en la consola tienen mayor prioridad que las provenientes de recursos de Ingress.
Ingress Class
Escucha los recursos de Ingress asociados con la IngressClass especificada.
-
Si se deja vacío, la puerta de enlace escucha todos los recursos de Ingress en el clúster.
-
Si especifica un valor (solo se admite un único valor), la puerta de enlace escucha los recursos de Ingress cuya anotación
classo campoSpec.IngressClassNamecoincida con el valor especificado. Por ejemplo, si establece esto ennginx, la puerta de enlace escucha los recursos de Ingress con una IngressClass denginxy también aquellos que no están asociados con ninguna IngressClass.
Namespace
Escucha los recursos de Ingress en un namespace específico.
-
Si se deja vacío, la puerta de enlace escucha los recursos de Ingress en todos los namespaces del clúster.
-
Si especifica un valor (solo se admite un único valor), la puerta de enlace escucha los recursos de Ingress en el namespace especificado.
Update Ingress Status
Si habilita esta opción, el sistema actualiza la dirección IP en el campo
Statusdel Ingress escuchado por la dirección IP de la instancia de Server Load Balancer (SLB) asociada con Cloud Native Gateway.NotaEsta función requiere la versión 1.2.9 o posterior de la puerta de enlace.
Security Group Authorization
Se configura un security group para el node pool del clúster de contenedores. Para permitir que los componentes fuera del clúster accedan a los servicios dentro de él, debe abrir los puertos de servicio necesarios en el security group.
Puede modificar el security group. Para más información, consulte Set security group rules.
-
Agregar un servicio
Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.
En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Services.
-
Haga clic en Create Service, configure los parámetros en el panel y luego haga clic en OK.
Parámetro
Descripción
Service Sources
Seleccione Container Service.
Namespaces
Seleccione el namespace del clúster destino.
Services
Seleccione el servicio de la lista.
Agregar una ruta grpcbin
Inicie sesión en la consola de MSE y seleccione una región en la barra de navegación superior.
En el panel de navegación izquierdo, elija Cloud-native Gateway > Gateways. En la página Gateways, haga clic en el ID de la puerta de enlace.
En el panel de navegación izquierdo, haga clic en Routes. Luego, haga clic en la pestaña Routes.
-
Haga clic en Add Route. En la página Add Route, configure los parámetros de la ruta y luego haga clic en Save and Advertise. Para obtener instrucciones detalladas, consulte Add a route.
Parámetro
Descripción
Route Name
Establezca en
grpc.Domain Name
Seleccione el dominio predeterminado *.
Path
Establezca la condición de coincidencia en Prefix y el valor de la ruta en
/grpcbin.GRPCBin.NotaEl formato de ruta para un servicio gRPC es {PackageName}.{ServiceName}/{MethodName}. Puede configurar una ruta basada en prefijos según este formato.
Scenario
Establezca Scenario en Single Service.
Backend Service
Seleccione el servicio destino y el puerto de servicio.
Comprobar los resultados
Utilice bloomrpc para probar el servicio gRPC. Una respuesta exitosa confirma que el servicio está disponible.
También puede utilizar otros clientes gRPC para realizar pruebas.
Use BloomRPC para iniciar una llamada unaria (Unary Call) al método grpcbin.GRPCBin.DummyUnary. Ejemplo de cuerpo de solicitud:
{
"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": {}
}
Ejemplo de respuesta del servidor (latencia: ~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"
}
}