Use um ingress gateway do ASM para acessar com segurança os serviços gRPC na malha. Esse recurso permite controle de acesso preciso, melhor governança de services e comunicação segura entre eles. Este tópico demonstra como acessar um service gRPC por um ingress gateway e direcionar o tráfego entre duas versões do service.
Antes de começar
Etapa 1: Implante a aplicação de exemplo
Implante duas versões de uma aplicação de exemplo: istio-grpc-server-v1 e istio-grpc-server-v2.
-
Crie um arquivo chamado
app.yaml. -
Implante a aplicação.
kubectl apply -f app.yaml
Etapa 2: Defina as regras de roteamento
Crie um gateway, um service virtual e uma regra de destino para rotear todo o tráfego para o service istio-grpc-server-v1.
-
Crie um arquivo chamado
rules.yaml.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 -
Aplique as regras.
kubectl apply -f rules.yaml
Etapa 3: Implante ou use um ingress gateway
Novo gateway
Crie um ingress gateway e adicione a porta 8080 durante a configuração de Port Mapping.
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 página Gateway Details, na seção Basic options, clique em ícone
ao lado de Port. Na caixa de diálogo Port Mapping, clique em Add Port, defina Protocol como TCP e Service Port como 8080 e clique em Submit.
Etapa 4: Execute o cliente gRPC
-
Instale a ferramenta de linha de comando grpcurl e execute o seguinte comando:
grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHello -
A saída mostra que todas as requisições são roteadas para
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: Direcione o tráfego com roteamento ponderado
Atualize o service virtual para rotear 40% do tráfego para v2 e os 60% restantes para v1.
-
Edite o service virtual.
kubectl edit VirtualService grpc-vsModifique a seção
routeconforme abaixo e salve as alterações..... 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 novamente o comando
grpcurlpara acessar o service gRPC na malha.grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHelloA saída indica que aproximadamente 40% do tráfego é roteado para
v2.NotaOs resultados podem não apresentar uma divisão exata de 40/60, mas a distribuição geral do tráfego se aproximará dessa proporção ao longo do tempo.
"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!"