GRPCRoute: Acheminer du trafic gRPC via la Gateway API
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.io → ecom-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
Aucun commentaire pour le moment.