Cross-Namespace Routing avec canary rollout
Gateway API :
-
Cas pratique :
-
Cross-Namespace routing
-
TLS termination
-
Objectif
Mettre en place un Gateway partagé entre plusieurs équipes :
-
infra-ns: équipe infrastructure/DevOps (propriétaire du Gateway + certificat TLS)
-
site-ns: équipe site/dev (apps home et login)
-
store-ns: équipe store/dev (app store)
Toutes les applications sont servies sous le même domaine : ecom.techledger.io
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 ecom.in.techledger.io
-
la certification TLS via un secret central (ecom-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: "ecom.techledger.io"
protocol: HTTPS
port: 443
allowedRoutes:
namespaces:
from: Selector
selector:
matchLabels:
shared-gateway-access: "true"
tls:
mode: Terminate
certificateRefs:
- name: in-techledger-io-secret # créé par cert-manager va le créer

Déployer les applications backend
- Pour simplifier, voici trois services HTTP simulés :
# site-ns : home app
apiVersion: v1
kind: Service
metadata:
name: home
namespace: site-ns
spec:
selector:
app: home
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: home
namespace: site-ns
spec:
replicas: 1
selector:
matchLabels:
app: home
template:
metadata:
labels:
app: home
spec:
containers:
- name: home
image: hashicorp/http-echo
args: ["-text=Hello from Home!"]
---
# site-ns : login apps
apiVersion: v1
kind: Service
metadata:
name: login-v1
namespace: site-ns
spec:
selector:
app: login-v1
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: login-v1
namespace: site-ns
spec:
replicas: 1
selector:
matchLabels:
app: login-v1
template:
metadata:
labels:
app: login-v1
spec:
containers:
- name: login-v1
image: hashicorp/http-echo
args: ["-text=Login v1"]
---
apiVersion: v1
kind: Service
metadata:
name: login-v2
namespace: site-ns
spec:
selector:
app: login-v2
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: login-v2
namespace: site-ns
spec:
replicas: 1
selector:
matchLabels:
app: login-v2
template:
metadata:
labels:
app: login-v2
spec:
containers:
- name: login-v2
image: hashicorp/http-echo
args: ["-text=Login v2"]
---
# store-ns : store app
apiVersion: v1
kind: Service
metadata:
name: store
namespace: store-ns
spec:
selector:
app: store
ports:
- port: 8080
targetPort: 5678
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: store
namespace: store-ns
spec:
replicas: 1
selector:
matchLabels:
app: store
template:
metadata:
labels:
app: store
spec:
containers:
- name: store
image: hashicorp/http-echo
args: ["-text=Welcome to Store!"]
Créer les Routes HTTP cross-namespace
- HTTPRoute du path /home (Namespace : site-ns)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: home
namespace: site-ns
spec:
parentRefs:
- name: shared-gateway
namespace: infra-ns
rules:
- backendRefs:
- name: home
port: 8080
- HTTPRoute du path /login deploiement Canary rollout (Namespace : site-ns)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: login
namespace: site-ns
spec:
parentRefs:
- name: shared-gateway
namespace: infra-ns
rules:
- matches:
- path:
type: PathPrefix
value: /login
backendRefs:
- name: login-v1
port: 8080
weight: 90
- name: login-v2
port: 8080
weight: 10
- HTTPRoute du path /store (Namespace : store-ns)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: store
namespace: store-ns
spec:
parentRefs:
- name: shared-gateway
namespace: infra-ns
rules:
- matches:
- path:
type: PathPrefix
value: /store
backendRefs:
- name: store
port: 8080




Ce scénario démontre la puissance du Cross-Namespace Routing avec Gateway API :
-
Infrastructure centralisée, mais configuration déléguée aux équipes applicatives ;
-
Sécurité contrôlée via les allowedRoutes ;
-
Isolation et mutualisation : chaque équipe gère ses Routes, tout en partageant le même point d’entrée HTTPS.
Commentaires
Aucun commentaire pour le moment.