9
votes

Le routage basé sur le chemin Traefik dans l'entrée Kubernetes ne fonctionne pas comme prévu

J'essaie d'utiliser le mécanisme de routage basé sur le chemin fourni par le contrôleur d'entrée Traefik dans Kubernetes mais j'ai quelques problèmes avec la réécriture d'URL.

Ma configuration [MISE À JOUR] est la suivante

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/auth-type: "basic"
    traefik.ingress.kubernetes.io/auth-tls-insecure: "true"
    traefik.ingress.kubernetes.io/frontend-entry-points: "http,https"
    traefik.ingress.kubernetes.io/app-root: "/"
    traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    traefik.ingress.kubernetes.io/rewrite-target: "/"
  name: webapp-ingress
  namespace: my-company
spec:
  rules:
   - host: local-ubuntu
   - http:
      paths:
      - path: /
        backend:
          serviceName: webapp
          servicePort: 80
      - path: /db
        backend:
          serviceName: db-manager
          servicePort: 8081
  • traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
  • traefik.ingress.kubernetes.io/rewrite-target: "/"

URL: http: // local-ubuntu / db [OK] -> 200

Ensuite, d'autres ressources se chargent mais pointent sur la mauvaise URL de base

Exemple:

L'URL de la ressource est: http: //local-ubuntu/public/css/bootstrap.min.css

Mais cela devrait être : http: //local-ubuntu/db/public/css/bootstrap.min. css (qui fonctionne lorsque j'ai essayé manuellement)

Je ne suis pas sûr de ce qui me manque ici dans la configuration actuelle.


0 commentaires

3 Réponses :


1
votes

Concernant le contenu statique non diffusé, la documentation indique ce qui suit:

Utilisez un * Strip matcher si votre backend écoute sur le chemin racine (/) mais devrait être routable sur un préfixe spécifique. Par exemple, PathPrefixStrip: / products correspondrait à / products mais aussi / products / shoes et / products / shirts. Étant donné que le chemin est supprimé avant le transfert, votre backend est censé écouter sur /. Si votre backend diffuse des actifs (par exemple, des images ou des fichiers Javascript), il est probable qu'il doit renvoyer des URL relatives correctement construites. Poursuivant sur l'exemple, le backend doit renvoyer /products/shoes/image.png (et non /images.png que Traefik ne pourrait probablement pas associer au même backend). L'en-tête X-Forwarded-Prefix (disponible depuis Traefik 1.3) peut être interrogé pour créer de telles URL dynamiquement.


2 commentaires

Malheureusement, même si cela semble être la bonne approche, je ne peux pas la tester correctement dans la définition d'entrée. Par exemple, quelque chose comme traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip: / db" générera une erreur lorsque je regarderai les journaux du pod d'entrée traefik.


Merci beaucoup j'ai mal compris à ce sujet, en modifiant le côté serveur (backend du micro-service), je devais vérifier l'en-tête X-Forwarded-Prefix avant de renvoyer les fichiers statiques avec le chemin correct.



1
votes

Merci beaucoup pour votre aide dans ce dossier.

Tout d'abord, j'ai dû résoudre un problème concernant le formatage des annotations dans le fichier yaml.

Toutes les instructions avec traefik comme préfixe doivent être entre guillemets

Exemple:

  • traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip [Not
    correct]
  • traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    [correct]

Dans le premier cas, aucune des annotations n'était reflétée dans l'entrée.

Mais je n'arrive toujours pas à acheminer correctement le trafic. Avec la configuration actuelle, seule la ressource servie sur / est renvoyée. Aucune des ressources js, css ou autres n'est chargée. Je me demande donc si j'ai besoin d'utiliser l'instruction traefik.frontend.redirect.regex .


0 commentaires

0
votes

Essayez l'une des solutions suivantes:

traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"

traefik.ingress.kubernetes.io/rewrite-target: "/

Ils obtiennent tous deux des résultats similaires, mais ils sont différents et leur comportement est légèrement différent.

Je voudrais en savoir plus sur notre documentation pour les différences: ( https://docs.traefik.io/v1.7/configuration/backends/kubernetes/#general-annotations )

Quant à votre deuxième numéro:

L'URL de la ressource est: local-ubuntu / public / css / bootstrap.min.css

Mais cela devrait être: local-ubuntu / db / public / css / bootstrap.min.css (qui fonctionne quand j'ai essayé

Vous avez supprimé ce chemin de la requête ... votre service DB ne voit jamais le préfixe DB ... Comment est-il censé savoir pour les rajouter?

Vous devez définir une URL racine dans votre application Web pour gérer le chemin supprimé.

Une fois que vous avez fait cela, vous n'aurez peut-être même plus besoin de supprimer le chemin et de le laisser tel quel. Si vous ne pouvez pas définir une URL de base pour votre application, vous ne pourrez peut-être pas utiliser les répertoires pour le routage et devrez peut-être utiliser des sous-domaines à la place.


0 commentaires