Aller au contenu principal
Sommaire de la formation

Cross-Namespace Routing avec canary rollout

coolibra203 vues

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

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.