Aller au contenu principal
Sommaire de la formation

GRPCRoute: Acheminer du trafic gRPC via la Gateway API

coolibra209 vues

GRPCRoute

Acheminer du trafic gRPC via la Gateway API en fonction :

  • du host (nom DNS),

  • du service et méthode gRPC,

  • et éventuellement des headers gRPC.


Le Gateway

C’est le point d’entrée réseau (le load balancer).
Il écoute sur le port 50051 pour du trafic HTTPS/gRPC :

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: shared-grpc-gateway
  namespace: infra-ns
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod  # indique à cert-manager d'utiliser ce ClusterIssuer  
spec:
  gatewayClassName: cilium
  listeners:
  - name: grpc
    hostname: "*.techledger.io"
    protocol: HTTPS
    port: 50051
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            shared-gateway-access: "true"
    tls:
      mode: Terminate
      certificateRefs:
      - name: techledger-io-secret  # créé par cert-manager va le créer

 

Routage simple par service et méthode gRPC

On veut envoyer :

  • les requêtes io.techledger.User.Login

  • destinées à ecom.techledger.io vers le Service Kubernetes ecom-svc.

apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
  name: ecom-grpc-route
  namespace: site-ns
spec:
  parentRefs:
  - name: shared-grpc-gateway
    namespace: infra-ns
  hostnames:
  - "ecom.techledger.io" 
  rules:
  - matches:
    - method:
        service: io.techledger.ecom.User
        method: Login
    backendRefs:
    - name: ecom-svc
      port: 50051
---
apiVersion: v1
kind: Service
metadata:
  name: ecom-svc
  namespace: site-ns
spec:
  selector:
    app: ecom
  ports:
  - port: 50051
    targetPort: 50051

 

✅ Effet :

Les appels gRPC io.techledger.User/Login à ecom.techledger.ioecom-svc:50051

 

Routage par en-tête (header)

On veut router selon un header gRPC env :

  • env: canary → store-svc-canary

  • sinon → store-svc

apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
  name: store-grpc-route
  namespace: store-ns
spec:
  parentRefs:
  - name: shared-grpc-gateway
    namespace: infra-ns
  hostnames:
  - "store.techledger.io"
  rules:
  - matches:
    - headers:
      - type: Exact
        name: env
        value: canary
    backendRefs:
    - name: store-svc-canary
      port: 50051
  - backendRefs:
    - name: store-svc
      port: 50051
---
apiVersion: v1
kind: Service
metadata:
  name: store-svc-canary
  namespace: store-ns
spec:
  selector:
    app: store
  ports:
  - port: 50051
    targetPort: 50051
---
apiVersion: v1
kind: Service
metadata:
  name: store-svc
  namespace: store-ns
spec:
  selector:
    app: store
  ports:
  - port: 50051
    targetPort: 50051

 

✅ Effet :

store.techledger.io + env: canary → store-svc-canary
sinon → store-svc

 

 

Activation du gRPC Reflection

Si on veut tester avec grpcurl (client CLI gRPC interactif), il faut permettre la méthode reflection :

apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
  name: ecom-route
  namespace: site-ns
spec:
  parentRefs:
  - name: shared-grpc-gateway
    namespace: infra-ns
  hostnames:
  - "ecom.techledger.io"
  rules:
  - matches:
    - method:
        service: io.techledger.ecom.User
        method: Login
    backendRefs:
    - name: ecom-svc
      port: 50051
  - matches:
    - method:
        service: grpc.reflection.v1.ServerReflection
    backendRefs:
    - name: ecom-svc
      port: 50051
---
apiVersion: v1
kind: Service
metadata:
  name: ecom-svc
  namespace: site-ns
spec:
  selector:
    app: ecom
  ports:
  - port: 50051
    targetPort: 50051

 

 

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.