Aller au contenu principal
Sommaire de la formation

Utiliser Gateway API avec Istio Gateway Cross-Namespace

coolibra174 vues

Intégration :

  • Utiliser Gateway API avec Istio Gateway
  • HTTPRoute avec Cross-Namespace routing Traffic Shifting (canary, blue/green testing)


 

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

  • Istio crée un deploument pour gerer le proxy. On peut appliquer un hpa et un pdb sur ce deployement
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: istio
  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: ecom-techledger-io-secret  # créé par cert-manager va le créer
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: gateway
  namespace: infra-ns
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: shared-gateway-istio
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: shared-gateway-pdb
  namespace: infra-ns
spec:
  minAvailable: 1
  selector:
    matchLabels:
      gateway.networking.k8s.io/gateway-name: shared-gateway

 

 

 

Déployer les applications

  • site-ns : home app :
# 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!"]
---
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
 
  • site-ns : login apps canary rollout
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
---
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!"]

---
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.