O protocolo gRPC utiliza HTTP/2 e oferece recursos como streaming bidirecional, compressão de cabeçalhos e multiplexação para aumentar a eficiência da rede. Este tópico demonstra como implantar uma aplicação gRPC em um cluster do Container Service for Kubernetes (ACK) e usar um Cloud Native Gateway para rotear o tráfego correspondente.
Pré-requisitos
Etapa 1: Implantar a aplicação gRPC
Para obter instruções detalhadas, consulte Crie uma carga de trabalho sem estado usando um Deployment.
Este exemplo utiliza a aplicação grpcbin como serviço de backend de amostra, pois ela implementa diversos métodos gRPC. Aplique os seguintes recursos no seu cluster ACK.
Em um Service do Kubernetes, o name da port que gerencia o tráfego gRPC deve conter 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
O código abaixo apresenta a definição proto deste serviço 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;
}
Como o gRPC se baseia no protocolo HTTP/2, seus caminhos seguem o formato {PackageName}.{ServiceName}/{MethodName}. Essa estrutura permite que o Cloud Native Gateway roteie requisições com base no caminho. Por exemplo, uma chamada gRPC para o método Index do serviço grpcbin possui o caminho grpcbin.GRPCBin/Index.
Etapa 2: Configure o roteamento gRPC
Adicione o cluster ACK como source de serviço do gateway e, em seguida, adicione o serviço grpcbin.
Adicionar uma source de serviço
Faça login no MSE console. Na barra de navegação superior, selecione uma região.
No painel de navegação à esquerda, escolha Cloud-native Gateway > Gateways. Na página Gateways, clique em no ID do gateway.
No painel de navegação à esquerda, clique em Routes. Em seguida, clique em na aba Source.
-
Clique em Add Source. No painel Add Source, defina Source Type como Container Service, configure os parâmetros e clique em OK.
Parâmetro
Descrição
ACK/ACK Serverless Cluster
Selecione o cluster onde o serviço de backend está localizado.
NotaAo criar o gateway, selecione a mesma Virtual Private Cloud (VPC) do cluster de backend. Assim, ao adicionar a source de serviço, o sistema descobre automaticamente os clusters nessa VPC.
Listen to Kubernetes Ingress
-
Ao ativar esta opção, o Cloud Native Gateway monitora automaticamente alterações nos recursos de Ingress e aplica as configurações de domínio e rota desses recursos.
-
Se você desativar esta opção, o Cloud Native Gateway para de monitorar recursos de Ingress e invalida as configurações aplicadas anteriormente a partir deles. Utilize esta opção com cautela.
ImportanteAs configurações de domínio e rota definidas manualmente no console têm prioridade maior do que as provenientes de recursos de Ingress.
Ingress Class
Monitora recursos de Ingress associados à IngressClass especificada.
-
Se deixado em branco, o gateway monitora todos os recursos de Ingress no cluster.
-
Ao especificar um valor (apenas um único valor é suportado), o gateway monitora recursos de Ingress cuja anotação
classou campoSpec.IngressClassNamecorresponda ao valor definido. Por exemplo, se você definir comonginx, o gateway monitorará recursos de Ingress com IngressClassnginxe também aqueles não associados a nenhuma IngressClass.
Namespace
Monitora recursos de Ingress em um namespace específico.
-
Se deixado em branco, o gateway monitora recursos de Ingress em todos os namespaces do cluster.
-
Ao especificar um valor (apenas um único valor é suportado), o gateway monitora recursos de Ingress no namespace indicado.
Update Ingress Status
Ao ativar esta opção, o sistema atualiza o endereço IP no campo
Statusdo Ingress monitorado para o endereço IP da instância do Server Load Balancer (SLB) associada ao Cloud Native Gateway.NotaEste recurso requer a versão 1.2.9 ou posterior do gateway.
Security Group Authorization
Um grupo de segurança é configurado para o pool de nós do cluster de contêineres. Para permitir que componentes fora do cluster acessem serviços internos, abra as portas de serviço necessárias no grupo de segurança.
É possível modifique o grupo de segurança. Para mais informações, consulte Defina security group rules.
-
Adicionar um serviço
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Cloud-native Gateway > Gateways. Na página Gateways, clique em no ID do gateway.
No painel de navegação à esquerda, clique em Routes. Em seguida, clique em na aba Services.
-
Clique em Create Service, configure os parâmetros no painel e clique em OK.
Parâmetro
Descrição
Service Sources
Selecione Container Service.
Namespaces
Selecione o namespace do cluster de destino.
Services
Escolha o serviço na lista.
Adicionar uma rota grpcbin
Faça login no MSE console e selecione uma região na barra de navegação superior.
No painel de navegação à esquerda, escolha Cloud-native Gateway > Gateways. Na página Gateways, clique em no ID do gateway.
No painel de navegação à esquerda, clique em Routes. Em seguida, clique em na aba Routes.
-
Clique em Add Route. Na página Add Route, configure os parâmetros da rota e clique em Save and Advertise. Para instruções detalhadas, consulte Add a route.
Parâmetro
Descrição
Route Name
Defina como
grpc.Domain Name
Selecione o domínio padrão *.
Path
Defina a condição de correspondência como Prefix e o valor do caminho como
/grpcbin.GRPCBin.NotaO formato de caminho para um serviço gRPC é {PackageName}.{ServiceName}/{MethodName}. Configure uma rota baseada em prefixo seguindo este formato.
Scenario
Defina Scenario como Single Service.
Backend Service
Selecione o serviço de destino e a porta do serviço.
Verifique os resultados
Utilize o bloomrpc para testar o serviço gRPC. Uma resposta bem-sucedida confirma a disponibilidade do serviço.
Outros clientes gRPC também podem ser usados para testes.
Use o BloomRPC para iniciar uma Unary Call no método grpcbin.GRPCBin.DummyUnary. Exemplo de corpo da requisição:
{
"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": {}
}
Exemplo de resposta do servidor (latência: ~0,14s):
{
"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"
}
}