121 votes

Comment fonctionne kubectl port-forward ?

Les commandes kubectl expose peuvent être utilisées pour créer un service pour les applications et attribuer une adresse IP pour y accéder depuis Internet.

D'après ce que j'ai compris, pour accéder à une application au sein d'un cluster Kubernetes, il faut créer une ressource de service et celle-ci doit avoir une adresse IP accessible depuis le réseau externe.

Mais dans le cas du port-forward, comment kubectl crée-t-il une connexion à l'application sans adresse IP accessible de l'extérieur ?

3 votes

Avez-vous lu sur prefetch.net/blog/2018/02/03/ déjà ?

2 votes

C'est un appel via le serveur API. Ce n'est pas un moyen général d'éviter d'avoir besoin d'un service. Ce n'est ni rapide ni, d'après mon expérience, particulièrement fiable, mais c'est utile pour le débogage.

0 votes

@MichaelHausenblas non, je viens juste de le voir... maintenant j'ai une nouvelle question, comment socat port-forwarder fait le port forwarding ?

117voto

lvthillo Points 8424

Pour commencer, il est utile de noter et de se rappeler que dans Kubernetes, chaque Le pod reçoit sa propre adresse IP de 10.*, qui n'est utilisable qu'au sein du cluster. Maintenant, le port-forward de kubectl tunnelise simplement le trafic d'un port spécifié sur votre machine hôte locale vers le port spécifié sur le pod spécifié. Le serveur API devient alors, en quelque sorte, une passerelle temporaire entre votre port local et le cluster Kubernetes.

kubectl port-forward transmet les connexions à un port local vers un port sur un pod. Par rapport à kubectl proxy , kubectl port-forward est plus générique car il peut transmettre le trafic TCP alors que kubectl proxy ne peut transférer que le trafic HTTP.

kubectl port-forward est utile à des fins de test/débogage afin que vous puissiez accéder à votre service localement sans l'exposer.

Vous trouverez ci-dessous le nom de la pod et il fera suivre son port 6379 à localhost:6379 .

kubectl port-forward redis-master-765d459796-258hz 6379:6379 

qui est identique à

kubectl port-forward pods/redis-master-765d459796-258hz 6379:6379

ou

kubectl port-forward deployment/redis-master 6379:6379 

ou

kubectl port-forward rs/redis-master 6379:6379 

ou

kubectl port-forward svc/redis-master 6379:6379

Ici est également un petit exemple de transfert de port pour accéder à un service de base de données (clusterip) sans l'exposer.

2 votes

Je n'y arrive toujours pas car le trafic TCP voyage aussi en utilisant l'IP lui-même.

8 votes

Le lien vers l'échantillon est cassé

2 votes

Si vous souhaitez transférer en masse un espace de noms entier ou un ensemble de services basés sur des sélecteurs vers votre station de travail locale, vous pouvez essayer kubefwd. github.com/txn2/kubefwd

84voto

David Maze Points 26689

kubectl port-forward fait un Demande d'API Kubernetes . Cela signifie que le système qui l'exécute doit avoir accès au serveur d'API et que tout trafic sera acheminé par une seule connexion HTTP.

C'est très utile pour le débogage (si un pod spécifique fonctionne, vous pouvez vous y connecter directement ; dans un environnement de micro-services, vous pouvez parler à un service back-end que vous n'exposeriez pas autrement) mais ce n'est pas une alternative à la mise en place d'objets de service. Lorsque j'ai travaillé avec kubectl port-forward il a été visiblement plus lent que la connexion à un pod via un service, et j'ai vu la commande s'arrêter au bout de quelques minutes. Encore une fois, ce ne sont pas de gros problèmes pour le débogage, mais ce n'est pas ce que je voudrais pour un système de production.

1 votes

Je suis d'accord mais je pense que c'est aussi très utile en production pour la sécurité : avec une simple exécution de script, vous pouvez utiliser la redirection de port pour accéder aux outils d'administration et aux données sensibles que vous ne voulez pas exposer à l'extérieur du cluster.

1 votes

Est-il destiné à être utilisé dans un environnement de production ?

0 votes

Je suis d'accord pour dire qu'il n'est pas destiné à la production / aux services, mais la durée est à peu près celle indiquée dans la documentation : "La session de transfert se termine lorsque le pod sélectionné se termine, et une nouvelle exécution de la commande est nécessaire pour reprendre le transfert." kubernetes.io/docs/reference/generated/kubectl/

26voto

Vihar Manchala Points 215

Si vous voulez transférer vers un port différent de localhost. Essayez ceci

kubectl port-forward <pod-name> <locahost-port>:<pod-port>

kubectl port-forward sample-pod-sadasds-sxawdd 8090:6379

La commande ci-dessus renvoie à localhost 8090 depuis le pod 6379.

0 votes

Réponse impeccable @Vihar

23voto

Skeptic Points 31

La commande port-forward permet de transférer un (ou plusieurs) port local vers un pod.

Cette commande est très utile, par exemple dans les déploiements bleus/verts, lorsque vous souhaitez dépanner un pod qui se comporte mal.

Pour aller encore plus loin, vous pouvez même exécuter des tests préliminaires sur les pods qui vous semblent les plus sujets aux erreurs directement dans votre pipeline CI/CD dans Jenkins en utilisant des conditions multiples et un pipeline déclaratif.

Exemples d'utilisation :

Ecoute sur le port 8888 localement, transfert vers 5000 dans le pod.

kubectl port-forward pod/mypod 8888:5000

Ecoute sur le port 8888 sur toutes les adresses, transfert vers 5000 dans le pod.

kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000

Ecoute sur un port aléatoire localement, transfert vers 5000 dans le pod.

kubectl port-forward pod/mypod :5000

Ecoute sur le port 8888 sur localhost et l'IP sélectionnée, transfert vers 5000 dans le pod.

kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

Écouter les ports 5000 et 6000 localement, en transférant les données vers/depuis les ports 5000 et 6000 dans le pod.

kubectl port-forward pod/mypod 5000 6000

Écouter les ports 5000 et 6000 localement, en transférant les données vers/depuis les ports 5000 et 6000 dans un pod sélectionné par le déploiement.

kubectl port-forward deployment/mydeployment 5000 6000

Écouter les ports 5000 et 6000 localement, en transférant les données vers/depuis les ports 5000 et 6000 dans un pod sélectionné par le service.

kubectl port-forward service/myservice 5000 6000

3voto

Lord Points 2720

Pour accéder à quelque chose à l'intérieur du cluster, il y a plusieurs options disponibles,

  1. Service IP en cluster avec Ingress-Nginx
  2. Service NodePort pour exposer le pod directement au monde extérieur.

Les deux approches ci-dessus nécessitent l'écriture d'un fichier de configuration. Si vous souhaitez accéder à un pod sans écrire de fichier de configuration, il s'agit de la troisième option.

  1. Port Forward : Nous pouvons exécuter une commande dans notre terminal qui demande à notre cluster Kubernets de transférer un port à partir d'un pod très spécifique à l'intérieur de notre cluster. Lorsque nous utilisons ce transfert de port, notre cluster va se comporter comme s'il avait un service de port de nœud en lui. Il va exposer ce pod ou un port très spécifique au monde extérieur et nous permettre de nous y connecter directement depuis notre machine locale.

Prenons un exemple :

const stan = nats.connect('ticketing', 'abc', {
  url: 'http://localhost:5000',
});

Notre objectif est d'établir une connexion entre stan et un pod à l'intérieur d'un cluster kubernets.

Nous avons d'abord besoin du nom du pod, vous pouvez obtenir le nom par la commande kubectl get pods

kubectl get pods

Je suppose que mon nom de pod est nats-depl-855d477f4d-xgbd7 et il est accessible via un service IP de cluster.

apiVersion: v1
kind: Service
metadata:
  name: nats-srv
spec:
  selector:
    app: nats
  ports:
    - name: client
      protocol: TCP
      port: 4222
      targetPort: 4222

Maintenant, pour établir la connexion, exécutez la commande ci-dessous :

kubectl port-forward nats-depl-855d477f4d-xgbd7 5000:4222

5000 : est le port de ma machine locale

4222 : est le port du pod auquel je veux accéder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X