Utilice una puerta de enlace de entrada de ASM para acceder de forma segura a los servicios gRPC dentro de su malla. Esto permite un control de acceso preciso, una mejor gobernanza de los servicios y una comunicación segura entre ellos. En este tema se muestra cómo acceder a un servicio gRPC a través de una puerta de enlace de entrada y cambiar el tráfico entre dos versiones del servicio.
Antes de empezar
Paso 1: Desplegar la aplicación de ejemplo
Despliegue dos versiones de una aplicación de ejemplo: istio-grpc-server-v1 y istio-grpc-server-v2.
-
Cree un archivo llamado
app.yaml. -
Despliegue la aplicación.
kubectl apply -f app.yaml
Paso 2: Establecer las reglas de enrutamiento
Cree una puerta de enlace, un servicio virtual y una regla de destino para enrutar todo el tráfico al servicio istio-grpc-server-v1.
-
Cree un archivo llamado
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 las reglas.
kubectl apply -f rules.yaml
Paso 3: Desplegar o usar una puerta de enlace de entrada
Nueva puerta de enlace
Create an ingress gateway y agregue el puerto 8080 durante la configuración de Port Mapping.
Puerta de enlace existente
Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, elija .
En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, elija .
En la página Ingress Gateway, haga clic en el nombre de la puerta de enlace de destino. En la página Gateway Details, dentro de la sección Basic options, haga clic en el icono
junto a Port. En el cuadro de diálogo Port Mapping, haga clic en Add Port, establezca Protocol en TCP y Service Port en 8080. Por último, haga clic en Submit.
Paso 4: Ejecutar el cliente gRPC
-
Instale la herramienta de línea de comandos grpcurl y ejecute el siguiente comando:
grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHello -
La salida muestra que todas las solicitudes se enrutan a
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!"
Paso 5: Cambiar el tráfico con enrutamiento ponderado
Actualice el servicio virtual para enrutar el 40 % del tráfico a v2 y el 60 % restante a v1.
-
Edite el servicio virtual.
kubectl edit VirtualService grpc-vsModifique la sección
routecomo se indica a continuación y guarde los cambios..... 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 -
Ejecute de nuevo el comando
grpcurlpara acceder al servicio gRPC dentro de la malla.grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHelloLa salida muestra que aproximadamente el 40 % del tráfico se enruta a
v2.NotaEs posible que sus resultados no reflejen una división exacta de 40/60, pero la distribución general del tráfico se acercará a esta proporción con el tiempo.
"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!"