1
votes

kubernetes expose des services avec Traefik 2.x comme entrée avec CRD

Qu'est-ce que je travaille

J'ai un cluster Kubernetes comme suit:

  • Plan de contrôle unique (mais plan d'extension à 3 plans de contrôle pour HA)
  • 2 nœuds de calcul



Sur ce cluster, j'ai déployé (à la suite de ce document de traefik https: //docs.traefik. io / user-guides / crd-acme / ):

  • Un déploiement qui crée deux pods:

    • traefik lui-même: qui sera en charge du routage avec le port exposé 80, 8080
    • whoami: un simple serveur http qui répond aux requêtes http
  • deux services

    • service de traefik:
    • whoami servic:
  • Un traefik IngressRoute:

Qu'est-ce que je veux

J'ai plusieurs services en cours d'exécution dans le cluster et je souhaite les exposer à l'extérieur à l'aide d'Ingress. Plus précisément, je souhaite utiliser les nouvelles méthodes d'entrée CDR Traefik 2.x .

Mon objectif ultime est d'utiliser les nouveaux traefiks 2.x CRD pour exposer les ressources sur les ports 80, 443, 8080 en utilisant IngressRoute définitions de ressources personnalisées

Quel est le problème

Si je comprends bien, les contrôleurs Ingress classiques permettent d'exposer tous les ports que nous voulons au monde extérieur (y compris 80, 8080 et 443).

Mais avec la nouvelle approche d'entrée traefik CDR seule, elle n'exporte rien du tout. Une solution consiste à définir le service Traefik comme un service typé loadbalancer, puis à exposer certains ports. Mais vous êtes obligé d'utiliser la plage de ports 30000-32767 (identique à nodeport), et je ne veux pas ajouter un proxy inverse devant le proxy inverse pour pouvoir exposer les ports 80 et 443 ...

J'ai également extrait de la documentation du nouveau CRD igress ( https: //docs.traefik.io/user-guides/crd-acme/ ) que:

kubectl port-forward --address 0.0.0.0 service / traefik 8000: 8000 8080: 8080 443: 4443 -n default

est obligatoire, et je le comprends maintenant. Vous devez mapper le port hôte sur le port de service. Mais cartographier les ports de cette façon semble maladroit et contre-intuitif. Je ne veux pas avoir une partie de la description du service dans un yaml et en même temps je dois me souvenir que je dois mapper le port avec kubectl .

Je suis presque sûr qu'il existe une solution simple et claire à ce problème, mais je ne comprends pas comment garder les choses simples. Avez-vous une expérience dans kubernetes avec la nouvelle configuration CRD de traefik 2.x?


0 commentaires

3 Réponses :


0
votes
apiVersion: v1
kind: Service
metadata:
  name: traefik

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
      targetPort: 8000
    - protocol: TCP
      name: admin
      port: 8080
      targetPort: 8080
    - protocol: TCP
      name: websecure
      port: 443
      targetPort: 4443
  selector:
    app: traefik
have you tried to use tragetPort where every request comes on 80 redirect to 8000 but when you use port-forward you need to always use service instead of pod

3 commentaires

J'ai essayé cela avec le type loadbalancer, mais pas avec le type par défaut. Avec l'équilibreur de charge, Kubernetes ignore ces targetPort et utilise un port aléatoire parmi les 30k +. Mais même avec le type par défaut, j'ai l'impression que cela ne fonctionnera pas, car avec cette configuration, aucun port n'est exposé à l'extérieur, l'astuce que vous mentionnez concerne simplement la communication interne du cluster, n'est-ce pas?


par défaut, le type d'équilibreur de charge kubernetes utilise NodePort pour la communication si vous voulez changer les ports par défaut attribués par kubernetes qui, dans une rage de 30k +, vous devez faire des modifications dans l'api de kubernters. et attribuez-y votre plage souhaitée


Je connais cette solution mais je ne l'aime pas non plus, c'est une configuration supplémentaire en place à laquelle je renoncerai dans moins d'une semaine, et je serai furieux d'essayer de dépanner lorsque le système va échouer. Plus je lis à ce sujet, plus je pense que l'utilisation d'une entrée Nginx régulière devant le traefik CRD est la voie à suivre



0
votes

Vous pouvez essayer d'utiliser le type de service LoadBalancer pour exposer le service Traefik sur les ports 80, 443 et 8080. J'ai testé le yaml à partir du lien que vous avez fourni dans GKE, et cela fonctionne.

Vous devez changer le ports sur le service 'traefik' et ajoutez un 'LoadBalancer' comme type de service:

$ curl https://35.111.XXX.XX/tls -k
Hostname: whoami-5df4df6ff5-xwflt
IP: 127.0.0.1
IP: 10.60.1.11
RemoteAddr: 10.60.1.13:55262
GET /tls HTTP/1.1
Host: 35.111.XXX.XX
User-Agent: curl/7.66.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.60.1.1
X-Forwarded-Host: 35.111.XXX.XX
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Forwarded-Server: traefik-66dd84c65c-4c5gp
X-Real-Ip: 10.60.1.1

$ curl http://35.111.XXX.XX/notls   
Hostname: whoami-5df4df6ff5-xwflt
IP: 127.0.0.1
IP: 10.60.1.11
RemoteAddr: 10.60.1.13:55262
GET /notls HTTP/1.1
Host: 35.111.XXX.XX
User-Agent: curl/7.66.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.60.1.1
X-Forwarded-Host: 35.111.XXX.XX
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-66dd84c65c-4c5gp
X-Real-Ip: 10.60.1.1

Kubernetes créera un Loadbalancer pour votre service et vous pourrez accéder à votre application en utilisant les ports 80 et 443 .

kind: Service
metadata:
  name: traefik
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80 <== Port to receive HTTP connections
    - protocol: TCP
      name: admin
      port: 8080 <== Administration port
    - protocol: TCP
      name: websecure
      port: 443 <== Port to receive HTTPS connections
  selector:
    app: traefik
  type: LoadBalancer <== Define the type load balancer


1 commentaires

Traefik sur EKS, AKS et GKE doit être défini comme LoadBalancer et fonctionne correctement en natif, mais lorsque vous travaillez sur site avec (que j'ai personnellement testé sur les serveurs ubuntu 20.04 et 18.04) ne semble pas fonctionner correctement et tout suit ici < a href = "https://github.com/k3s-io/k3s/issues/1414" rel = "nofollow noreferrer"> # 1414



0
votes

Après un certain temps, j'ai décidé de placer un haproxy devant le cluster kubernetes. Cela semble être la seule solution ATM.


0 commentaires