HTTPRoute Filtrer le trafic en fonction de l'hôte, en-tête et le path
coolibra134 vues
Gateway API :
-
Avancé :
- TLS termination & host-based routing
- Filters et custom policies
- Deploiement Canary rollout
Le diagramme suivant décrit le flux de trafic requis entre trois services différents :
- Le trafic back-ecom.techledger.io/* est redirigé vers ecom-back-svc
- Le trafic comportant ecom.techledger.io/* un en-tête env: canary est redirigé vers ecom-svc-canary
- Le trafic ecom.techledger.io/* sans en-tête est redirigé vers ecom-svc
Créer les Namespaces et labels d’accès
Seuls les namespaces avec le label shared-gateway-access: "true" pourront attacher leurs Routes à ce Gateway.
apiVersion: v1
kind: Namespace
metadata:
name: infra-ns
labels:
shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
name: site-ns
labels:
shared-gateway-access: "true"
---
apiVersion: v1
kind: Namespace
metadata:
name: store-ns
labels:
shared-gateway-access: "true"
Déployer le Gateway partagé (dans infra-ns)
Le Gateway appartient à l’équipe infra.
Il gère :
-
le listener HTTPS sur *.in.techledger.io
-
la certification TLS via un secret central wildcard (techledger-io-secret)
-
la politique d’accès cross-namespace
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: shared-gateway
namespace: infra-ns
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod # indique à cert-manager d'utiliser ce ClusterIssuer
spec:
gatewayClassName: cilium
listeners:
- name: https
hostname: "*.techledger.io"
protocol: HTTPS
port: 443
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


Déployer les applications backend
- Pour simplifier, voici trois services HTTP simulés :
---
# ecom-back service
apiVersion: v1
kind: Service
metadata:
name: ecom-back-svc
namespace: store-ns
spec:
selector:
app: ecom-back
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecom-back-deployment
namespace: store-ns
spec:
replicas: 1
selector:
matchLabels:
app: ecom-back
template:
metadata:
labels:
app: ecom-back
spec:
containers:
- name: ecom-back
image: hashicorp/http-echo
args: ["-text=Hello from ecom-back!"]
---
# ecom-svc primary
apiVersion: v1
kind: Service
metadata:
name: ecom-svc
namespace: site-ns
spec:
selector:
app: ecom-svc
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecom-svc-deployment
namespace: site-ns
spec:
replicas: 1
selector:
matchLabels:
app: ecom-svc
template:
metadata:
labels:
app: ecom-svc
spec:
containers:
- name: ecom-svc
image: hashicorp/http-echo
args: ["-text=Hello from ecom-svc!"]
---
# ecom-svc canary
apiVersion: v1
kind: Service
metadata:
name: ecom-svc-canary
namespace: site-ns
spec:
selector:
app: ecom-svc-canary
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecom-svc-canary-deployment
namespace: site-ns
spec:
replicas: 1
selector:
matchLabels:
app: ecom-svc-canary
template:
metadata:
labels:
app: ecom-svc-canary
spec:
containers:
- name: ecom-svc-canary
image: hashicorp/http-echo
args: ["-text=Hello from ecom-svc-canary!"]
Créer les HTTPRoute cross-namespace
- HTTPRoute pour back-ecom.techledger.io/login
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: ecom-back-route
namespace: store-ns
spec:
parentRefs:
- name: shared-gateway
namespace: infra-ns
hostnames:
- "back-ecom.techledger.io"
rules:
- matches:
- path:
type: PathPrefix
value: /login
backendRefs:
- name: ecom-back-svc
port: 8080
- HTTPRoute pour ecom.techledger.io/* avec canary rollout
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: ecom-route
namespace: site-ns
spec:
parentRefs:
- name: shared-gateway
namespace: infra-ns
hostnames:
- "ecom.techledger.io"
rules:
- matches:
- headers:
- type: Exact
name: env
value: canary
backendRefs:
- name: ecom-svc-canary
port: 8080
- backendRefs:
- name: ecom-svc
port: 8080





Commentaires
Connectez-vous pour rejoindre la discussion.
Aucun commentaire pour le moment.