Use um ingress gateway do Service Mesh (ASM) para acessar serviços Google Remote Procedure Call (gRPC) em uma instância do ASM. Esse recurso permite implementar controle de acesso preciso nos serviços gRPC, aprimorar a governança de serviços e garantir a segurança na comunicação entre eles. Este tópico descreve como usar um ingress gateway para acessar um serviço gRPC em uma instância do ASM e como direcionar o tráfego entre duas versões de um serviço gRPC.
Pré-requisitos
Etapa 1: Implantar aplicações de exemplo
Implante a versão 1 e a versão 2 de um serviço gRPC: istio-grpc-server-v1 e istio-grpc-server-v2.
-
Crie um arquivo chamado app.yaml e copie o seguinte conteúdo para ele:
-
Execute o comando a seguir para implantar a aplicação:
kubectl apply -f app.yaml
Etapa 2: Configurar uma regra de roteamento
Crie um gateway Istio, um serviço virtual e uma regra de destino para a instância do ASM a fim de rotear todo o tráfego de entrada para istio-grpc-server-v1.
-
Execute o comando a seguir para criar um arquivo chamado rules.yaml e copie o conteúdo abaixo para ele:
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: grpc-gateway spec: selector: istio: ingressgateway servers: - port: number: 8080 name: grpc protocol: GRPC hosts: - "*" --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: grpc-helloworld-py trafficPolicy: loadBalancer: simple: ROUND_ROBIN subsets: - name: v1 labels: version: "v1" - name: v2 labels: version: "v2" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grpc-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 8080 route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 100 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 0 -
Execute o comando a seguir para implantar a regra de roteamento:
kubectl apply -f rules.yaml
Etapa 3: Criar um ingress gateway ou usar um existente
Criar um ingress gateway
Crie um ingress gateway e defina a Service Port do ingress gateway como 8080.
Adicionar a porta 8080 a um ingress gateway existente
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página Ingress Gateway, clique em nome do gateway desejado. Na seção Basic options da página Gateway Details, clique em ícone
ao lado de Port. Na caixa de diálogo Port Mapping, clique em Add Port, defina Protocol como TCP, defina Service Port como 8080 e clique em Submit.
Etapa 4: Iniciar o cliente gRPC
-
Instale a ferramenta de linha de comando grpcurl para executar o seguinte comando:
grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHello -
A saída indica que todas as solicitações são roteadas para istio-grpc-server-v1.
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
Etapa 5: Roteamento de tráfego para o serviço gRPC v2 com base em uma proporção específica
Direcione 40% do tráfego para istio-grpc-server-v2 e 60% para istio-grpc-server-v1.
-
Execute o comando a seguir para editar os serviços virtuais:
kubectl edit VirtualService grpc-vsModifique
routeconforme o comando a seguir e salve a regra:.... route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 60 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 40 -
Execute o comando gRPCurl a seguir para acessar o serviço gRPC implantado na instância do ASM:
grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHelloA saída indica que 40% do tráfego é roteado para istio-grpc-server-v2.
NotaO tráfego pode não ser distribuído entre istio-grpc-server-v1 e istio-grpc-server-v2 na proporção exata de 60:40. No entanto, a distribuição geral do tráfego permanece sempre próxima dessa proporção.
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"