Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Access in-mesh gRPC services via an ASM gateway

Última actualización: Sep 11, 2026

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.

  1. Cree un archivo llamado app.yaml.

    YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v1
      labels:
        app: grpc-helloworld-py
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v1
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v1
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v2
      labels:
        app: grpc-helloworld-py
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v2
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v2
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-helloworld-py
      labels:
        app: grpc-helloworld-py
    spec:
      ports:
        - port: 50051
          name: grpc-port
      selector:
        app: grpc-helloworld-py
  2. 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.

  1. 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        
  2. 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

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, elija Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, elija ASM Gateways > Ingress Gateway.

  3. 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 Dingtalk_20230104170049.jpg 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

  1. 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
  2. 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.

  1. Edite el servicio virtual.

    kubectl edit VirtualService grpc-vs

    Modifique la sección route como 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
  2. Ejecute de nuevo el comando grpcurl para acceder al servicio gRPC dentro de la malla.

    grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHello

    La salida muestra que aproximadamente el 40 % del tráfico se enruta a v2.

    Nota

    Es 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!"