Comment accéder à une application Kubernetes distante avec le transfert de port Kubectl
Besoin de déboguer une application s’exécutant dans votre cluster Kubernetes ? La redirection de port est un moyen de se connecter à des pods qui ne sont pas accessibles au public. Vous pouvez utiliser cette technique pour inspecter des bases de données, des outils de surveillance et d’autres applications que vous souhaitez déployer en interne sans route publique.
La redirection de port est intégrée à Kubectl. La CLI peut démarrer des sessions de tunnellisation qui redirigent le trafic sur les ports locaux vers les pods de votre cluster Kubernetes. Voici comment le configurer.
Sommaire
Comment fonctionne la redirection de port
La redirection de port est une sorte de règle de traduction d’adresse réseau (NAT) qui achemine le trafic d’un réseau vers un autre. Dans le contexte de Kubernetes, les requêtes qui semblent être terminées par localhost
sont redirigés vers le réseau interne de votre cluster.
La redirection de port ne fonctionne qu’au niveau du port. Vous dirigez un port spécifique comme 33060
à un port cible tel que 3306
dans le réseau destinataire. Lorsque vous envoyez du trafic vers votre port local 33060
il sera automatiquement transmis au port 3306
à l’extrémité distante.
Cette technique vous permet d’accéder à des charges de travail Kubernetes privées qui ne sont pas exposées par un NodePort, Ingress ou LoadBalancer. Vous pouvez diriger le trafic local directement dans votre cluster, ce qui vous évite d’avoir à créer des services Kubernetes pour vos charges de travail internes. Cela permet de réduire votre surface d’attaque.
Déploiement d’un exemple d’application
Voyons maintenant le transfert de port Kubernetes en action. Commencez par créer un déploiement de base auquel vous vous connecterez à l’aide de la redirection de port dans la section suivante.
Nous utilisons un pod de base de données MySQL comme exemple réaliste de cas où vous pourriez avoir besoin d’utiliser cette technique. Les bases de données ne sont normalement pas exposées publiquement, les administrateurs Kubernetes utilisent donc souvent la redirection de port pour ouvrir une connexion directe.
Créez un fichier YAML pour votre déploiement :
apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: mysql:8.0 name: mysql env: - name: MYSQL_ROOT_PASSWORD value: mysql
Assurez-vous de modifier la valeur de MYSQL_ROOT_PASSWORD
variable d’environnement avant d’utiliser ce manifeste en production. Courir kubectl apply
pour créer votre déploiement MySQL :
$ kubectl apply -f mysql.yaml deployment.apps/mysql created
Utilisez ensuite le get pods
commande pour vérifier que la charge de travail a démarré avec succès :
$ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-5f54dd5789-t5fzc 1/1 Running 0 2s
Utiliser Kubectl pour rediriger le port vers Kubernetes
Bien que MySQL s’exécute maintenant dans votre cluster, vous n’avez aucun moyen d’y accéder de l’extérieur. Ensuite, configurez une session de redirection de port afin de pouvoir utiliser vos installations locales d’outils tels que mysql
CLI pour se connecter à votre base de données.
Voici un exemple simple :
$ kubectl port-forward deployment/mysql 33060:3306 Forwarding from 127.0.0.1:33060 -> 3306 Forwarding from [::1]:33060 -> 3306
Les connexions au port 33060 seront dirigées vers le port 3306 par rapport au pod exécutant votre déploiement MySQL. Vous pouvez maintenant démarrer une session shell MySQL qui cible votre base de données dans Kubernetes :
$ mysql --host 127.0.0.1 --port 33060 -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 10 Server version: 8.0.29 MySQL Community Server - GPL
Conservez la fenêtre du shell qui exécute le kubectl port-forward
commande ouverte pendant la durée de votre session de débogage. La redirection de port sera terminée lorsque vous appuyez sur Ctrl+C ou fermez la fenêtre.
Modification des numéros de port local et distant
La syntaxe des liaisons de numéro de port est local:remote
. La 33060:3306
l’exemple ci-dessus mappe le port 33060 sur localhost
à 3306
dans le pod cible.
Spécifier un seul numéro, sans deux-points, l’interprétera à la fois comme port local et distant :
$ kubectl port-forward deployment/mysql 3306
Vous pouvez laisser le port local vide à la place pour attribuer automatiquement un port aléatoire :
$ kubectl port-forward deployment/mysql :3306 Forwarding from 127.0.0.1:34923 -> 3306 Forwarding from [::1]:34923 -> 3306
Ici, vous utiliseriez le numéro de port généré aléatoirement 34923
avec votre client MySQL local.
Modification de l’adresse d’écoute
Kubectl lie le port local sur le 127.0.0.1
(IPv4) et ::1
(IPv6) par défaut. Vous pouvez spécifier votre propre ensemble d’adresses IP à la place en fournissant un --address
drapeau lorsque vous exécutez le port-forward
commande:
# Listen on two IPv4 addresses $ kubectl port-forward deployment/mysql :3306 --address 127.0.0.1,192.168.0.1
Le drapeau n’accepte que les adresses IP et le localhost
mot-clé. Ce dernier est interprété comme incluant 127.0.0.1
et ::1
correspondant aux valeurs par défaut de la commande lorsque --address
est omis.
Sommaire
La redirection de port est une technique utile pour accéder aux applications privées au sein de votre cluster Kubernetes. Kubectl tunnelise le trafic de votre réseau local vers un port spécifique sur un pod particulier. C’est un mécanisme relativement bas qui peut gérer n’importe quelle connexion TCP. Le transfert de port UDP n’est pas encore pris en charge.
L’utilisation d’une session de transfert de port ad hoc est un moyen sûr de déboguer les charges de travail qui n’ont pas besoin d’être exposées en externe. La création d’un service pour chaque nouveau déploiement pourrait permettre aux intrus et aux attaquants de découvrir les terminaux qui doivent être protégés. La redirection de port dans Kubectl vous permet de vous connecter en toute sécurité directement à vos applications, sans avoir à déterminer sur quels nœuds elles s’exécutent.