web-dev-qa-db-fra.com

Comment exécuter la commande curl à partir d'un pod Kubernetes

J'ai les questions suivantes:-

1: Je suis connecté à un pod Kubernetes à l'aide de la commande suivante: -

./cluster/kubectl.sh exec my-nginx-0onux -c my-nginx -it bash

le "show ip addr"

la commande montre l'IP assignée du pod. Étant donné que pod est un concept logique, je suppose que je suis connecté à un conteneur Docker et non à un pod. Dans ce cas, l'IP du pod est identique à l'IP du conteneur Docker. Cette compréhension est-elle correcte?

2: à partir d'un nœud Kubernetes, je fais Sudo docker ps puis procédez comme suit: -

Sudo docker exec  71721cb14283 -it '/bin/bash'

Cela ne fonctionne pas. Est-ce que quelqu'un sait ce que je fais mal?

3: je veux accéder au service nginx que j'ai créé, à partir du pod en utilisant curl. Comment puis-je installer curl dans ce pod ou conteneur pour accéder au service de l'intérieur. Je veux le faire pour comprendre la connectivité réseau.

14
Mayank

Voici comment obtenir une ligne de commande curl au sein d'un réseau kubernetes pour tester et explorer vos points de terminaison internes REST.

Pour obtenir une invite d'une boîte occupée s'exécutant à l'intérieur du réseau, exécutez la commande suivante. (Une astuce consiste à utiliser un conteneur unique par développeur.)

kubectl run curl-<YOUR NAME> --image=radial/busyboxplus:curl -i --tty --rm

Vous pouvez omettre le --rm et maintenir l'instance en cours d'exécution pour une réutilisation ultérieure. Pour le réutiliser ultérieurement, tapez:

kubectl attach <POD ID> -c curl-<YOUR NAME> -i -t

Utilisation de la commande kubectl get pods vous pouvez voir tous les POD en cours d'exécution. C'est quelque chose de similaire à curl-votrenom-944940652-fvj28.

EDIT: Notez que vous devez vous connecter à Google Cloud à partir de votre terminal (une fois) avant de pouvoir le faire! Voici un exemple, assurez-vous de mettre dans votre zone, cluster et projet: gcloud container clusters get-credentials example-cluster --zone europe-west1-c --project example-148812

27
Andreas Lundgren

L'idée de Kubernetes est que pods sont assignés sur un Host mais là n'est rien de sûr ou de permanent, vous ne devez donc PAS essayer de rechercher l'IP d'un conteneur ou d'un pod à partir de votre conteneur, mais plutôt utiliser ce que Kubernetes appelle un service .

Un service Kubernetes est un chemin vers un pod avec un ensemble défini de sélecteurs, via le kube-proxy, qui équilibrera la demande de tous les pods avec les sélecteurs donnés.

En bref:

créer un Pod avec un label appelé 'nom' par exemple. Disons name=mypod créer un service avec le sélecteur name=mypod que vous appelez myService par exemple, auquel vous affectez le port 9000 par exemple.

vous pouvez ensuite passer d'un pod aux pods desservis par ce service à l'aide de curl http://myService:9000

Cela suppose bien sûr que le pod DNS fonctionne. Si vous demandez un LoadBalancer type de Service lors de sa création et que vous l'exécutez sur AWS ou GKE, ce service sera également disponible depuis l'extérieur de votre cluster. Pour le service interne uniquement, définissez simplement l'indicateur clusterIP: None et il ne sera pas équilibré en charge à l'extérieur.

voir référence ici:

https://kubernetes.io/docs/concepts/services-networking/service/https://kubernetes.io/docs/tutorials/services/

4
MrE
  1. Kubernetes utilise le modèle IP-per-pod . Tous les conteneurs d'un même pod partagent la même adresse IP que s'ils s'exécutaient sur le même hôte.

  2. La commande doit suivre docker exec [OPTIONS] CONTAINER COMMAND [ARG...]. Dans ton cas, Sudo docker exec -it 71721cb14283 '/bin/bash' devrait marcher. Sinon, vous devez fournir la sortie de votre commande.

  3. Cela dépend de l'image que vous utilisez. L'installation d'un logiciel dans un conteneur n'a rien de spécial. Pour nginx, essayez apt-get update && apt-get install curl

3
Yu-Ju Hong