Aller au contenu principal
Sommaire de la formation

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.