web-dev-qa-db-fra.com

Kubernetes: Routage d'une requête non HTTP via une entrée vers un conteneur

  1. J'utilise un kubernetes local fourni avec docker sous Mac OS.
  2. J'ai installé le nginx-ingress-controller .
  3. J'ai réussi à envoyer une requête http externe via ingress à mes conteneurs gérés kubernetes (par exemple, à partir de mon navigateur local). Toutes les demandes sont envoyées via les ports nginx 80 ou 443.

Le problème est que je ne peux router que les requêtes http ou https via mon contrôleur ngnix . Comment puis-je envoyer des requêtes non HTTP (par exemple, base de données ou corba) via l'entrée vers mes conteneurs?

5
Matthias M

Ceci n'est pas bien pris en charge via le mécanisme d'entrée et est un problème ouvert .
Il existe un moyen de contourner le trafic TCP ou UDP avec nginx-ingress, qui mappera un port exposé sur un service kubernetes à l’aide d’un configmap.
Voir ce document

Démarrez le contrôleur d’entrée avec l’argument tcp-services-configmap (et/ou udp-services-configmap). 

args: 
- "/nginx-ingress-controller"
- "--tcp-services-configmap=default/nginx-tcp-configmap"
- "--v=2"

déployer configmap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-tcp-configmap
data:
  9000: "default/example-service:8080"

9000 est le port exposé et 8080 est le port de service

8
stacksonstacks

J'utilise un contrôleur nginx-ingress sur un serveur sans système d'exploitation. Afin de pouvoir accéder aux sites hébergés à partir de tous les nœuds, je l'ai créé sous la forme d'un DaemonSet plutôt que d'un déploiement ( Considérations de type «métal nu» ).

La solution fonctionne bien et les mises à jour des spécifications d’Ingress sont parfaitement intégrées.

Afin de rendre un serveur TS disponible, j'ai modifié mes arguments pour les pods dans nginx-ingress-controller.yml, comme indiqué par stacksonstacks:

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io
  --tcp-services-configmap=default/tcp-ingress-configmap
  --udp-services-configmap=default/udp-ingress-configmap

Malheureusement, lors de l'application de la spécification modifiée, DaemonSet ne recréait pas automatiquement les pods. Par conséquent, lors de l'inspection des pods, j'avais toujours les anciens arguments:

/nginx-ingress-controller
  --configmap=$(POD_NAMESPACE)/nginx-configuration
  --publish-service=$(POD_NAMESPACE)/ingress-nginx
  --annotations-prefix=nginx.ingress.kubernetes.io

La suppression des pods dans l'espace de noms ingress-nginx avec kubectl --namespace ingress-nginx delete pod --all a amené le contrôleur à créer de nouveaux pods et, enfin, les ports étaient disponibles sur le réseau hôte.

Je sais que les circonstances pourraient être un peu différentes, mais j'espère que quelqu'un pourra économiser quelques minutes grâce à cela.

1
Fabian Witte