Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 31, 2026

Utilisez une passerelle d'entrée ASM pour accéder en toute sécurité aux services gRPC au sein de votre maillage. Cette approche permet un contrôle d'accès précis, une meilleure gouvernance des services et une communication sécurisée entre les services. Cette rubrique explique comment accéder à un service gRPC via une passerelle d'entrée et répartir le trafic entre deux versions du service.

Prérequis

Étape 1 : Déployer l'exemple d'application

Déployez deux versions d'un exemple d'application : istio-grpc-server-v1 et istio-grpc-server-v2.

  1. Créez un fichier nommé 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. Déployez l'application.

    kubectl apply -f app.yaml

Étape 2 : Définir les règles de routage

Créez une passerelle, un service virtuel et une règle de destination pour acheminer tout le trafic vers le service istio-grpc-server-v1.

  1. Créez un fichier nommé 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. Appliquez les règles.

    kubectl apply -f rules.yaml

Étape 3 : Déployer ou utiliser une passerelle d'entrée

Nouvelle passerelle

Créez une passerelle d'entrée et ajoutez le port 8080 lors de la configuration Port Mapping.

Passerelle existante

  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez ASM Gateways > Ingress Gateway.

  3. Sur la page Ingress Gateway, cliquez sur le nom de la passerelle cible. Sur la page Gateway Details, dans la section Basic options, cliquez sur l'icône Dingtalk_20230104170049.jpg située à côté de Port. Dans la boîte de dialogue Port Mapping, cliquez sur Add Port, définissez Protocol sur TCP et Service Port sur 8080, puis cliquez sur Submit.

Étape 4 : Exécuter le client gRPC

  1. Installez l'outil en ligne de commande grpcurl et exécutez la commande suivante :

    grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}:8080 helloworld.Greeter/SayHello
  2. La sortie indique que toutes les requêtes sont acheminées vers 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!"     

Étape 5 : Répartir le trafic avec un routage pondéré

Mettez à jour le service virtuel pour acheminer 40 % du trafic vers v2 et les 60 % restants vers v1.

  1. Modifiez le service virtuel.

    kubectl edit VirtualService grpc-vs

    Modifiez la section route comme suit et enregistrez les modifications.

    ....
          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. Exécutez à nouveau la commande grpcurl pour accéder au service gRPC dans le maillage.

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

    La sortie indique qu'environ 40 % du trafic est acheminé vers v2.

    Remarque

    Les résultats peuvent ne pas afficher une répartition exacte de 40/60, mais la distribution globale du trafic tendra vers ce ratio au fil du temps.

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