Kubernetes est un outil open-source crucial pour l'orchestration de conteneurs. Kubernetes aide à orchestrer et à gérer des clusters à grande échelle dans divers environnements cloud ou même sur des serveurs sur site. Un cluster est un ensemble d'hôtes destinés à exécuter des applications et des services conteneurisés. Un cluster a besoin d'un minimum de deux nœuds pour fonctionner – un nœud maître et un nœud de travail. Vous pouvez faire évoluer votre infrastructure Kubernetes en ajoutant d'autres nœuds de travail. Un nœud maître et ses nœuds de travail doivent pouvoir communiquer sur un réseau pour que l'infrastructure fonctionne. Pour un aperçu des fonctionnalités les plus importantes de Kubernetes, veuillez suivre notre tutoriel sur Découvrir Kubernetes.
Dans ce tutoriel, nous allons vous présenter plusieurs outils et techniques pour vous aider dans l'inspection et le dépannage du réseau Kubernetes.
Prérequis
-
Pour suivre ce tutoriel, vous devez disposer d'un cluster Kubernetes. Nous avons un tutoriel expliquant Comment installer et utiliser Kubernetes sur Ubuntu 20.04 qui peut vous guider dans la configuration d'un cluster de base pour la démonstration.
-
Vous devez également avoir kubectl installé localement. En fonction de votre environnement local, suivez la documentation officielle sur l'installation des outils Kubernetes. Le kubectl doit être configuré pour se connecter à votre cluster. Nous expliquerons cela plus en détail dans la section ci-dessous.
Nous allons exécuter plusieurs commandes à la fois localement et sur le nœud Kubernetes. Commençons !
Configuration de kubectl local pour se connecter à un cluster Kubernetes distant
Commençons par installer kubectl. Notre environnement local fonctionne sous Ubuntu, suivez ce lien si vous utilisez un environnement local différent. Pour installer les outils kubectl sur un environnement local Ubuntu/Debian avec le gestionnaire de paquets apt, exécutez les commandes suivantes pour mettre à jour le dépôt apt et installer les paquets nécessaires :
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Ensuite, exécutez la commande suivante pour télécharger la clé de signature publique de Google Cloud :
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Ensuite, ajoutez le dépôt Kubernetes apt :
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
Après cela, mettez à jour l'index apt et installez kubectl avec la commande suivante :
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Ensuite, vérifiez que kubectl est installé en vérifiant la version avec la commande suivante :
|
1 |
kubectl version |
Voici la sortie si vous venez d'installer kubectl localement :

Dans la capture d'écran ci-dessus, kubectl tente de se connecter au cluster Kubernetes local. Cependant, cela échoue car nous n'avons pas encore de cluster Kubernetes en cours d'exécution sur notre machine locale.
Pour vous connecter au cluster Kubernetes distant, vous devez d'abord télécharger les identifiants Kubernetes depuis le cluster distant. Voici une commande pour copier les identifiants depuis le nœud maître :
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
Remplacez les parties surlignées par votre ssh nom d'utilisateur et l'adresse IP publique du nœud maître. Une fois le téléchargement des identifiants terminé, copiez-les dans votre répertoire personnel :
|
1 |
cp -r .kube $HOME/ |
C'est tout. Votre kubectl local devrait pouvoir se connecter à votre cluster Kubernetes distant et y exécuter des commandes. Pour confirmer que votre kubectl local est connecté au cluster distant, vérifiez à nouveau avec la commande version :
|
1 |
kubectl version --output='json' |
Voici la sortie, montrant une connexion réussie :

Optionnellement, vous pouvez exécuter la commande get nodes comme ceci :

Obtenir l'adresse IP de cluster d'un Pod
Vous pouvez obtenir l'IP de cluster d'un Pod en exécutant la commande kubectl get pod sur votre machine locale. Pour afficher plus d'informations telles que le nœud hébergeant le pod et l'IP de cluster du pod, ajoutez l'option -o wide à la commande :
|
1 |
kubectl get pod -o wide |
Voici une sortie de notre cluster Kubernetes. Dans le tutoriel prérequis, nous avions créé un déploiement de serveur web Nginx comme vous pouvez le voir :

La colonne IP affiche l'adresse IP interne des pods individuels. Si le pod que vous recherchez n'apparaît pas dans la liste, vous vous trouvez peut-être dans un espace de noms différent. Vous pouvez lancer la commande suivante pour lister les pods dans tous les namespaces:
|
1 |
kubectl get pod -o wide --all-namespaces |
Obtenir l'adresse IP d'un Service
Vous pouvez également obtenir l'adresse IP d'un Service sur votre cluster. En ajoutant l'option --all-namespaces , vous obtenez tous les services s'exécutant sur le cluster :
|
1 |
kubectl get service --all-namespaces |
La sortie de la commande ci-dessus est la suivante. L'IP du Service se trouve dans la colonne cluster-ip :

Obtenir et accéder aux espaces de noms réseau des Pods
Chaque pod Kubernetes a un espace de noms réseau qui lui est attribué. Les espaces de noms réseau, également appelés netns, sont des bibliothèques réseau natives de Linux qui fournissent une isolation entre les périphériques réseau.
Pour vérifier la résolution DNS ou la connectivité réseau générale, vous pouvez exécuter des commandes dans l'espace de noms réseau d'un pod. Pour y parvenir, vous commencez par rechercher l'identifiant de processus de l'un des conteneurs d'un pod. Vous pouvez facilement le faire dans Docker en utilisant des commandes spécifiques à Docker. La première commande liste les conteneurs en cours d'exécution sur un nœud. Connectez-vous à l'un de vos nœuds de travail et exécutez la commande suivante :
|
1 |
docker ps |

Dans la sortie, nous nous intéressons à la colonne ID du conteneur ou Noms. Notez le conteneur Nginx que nous avons déployé dans le tutoriel prérequis Comment installer et utiliser Kubernetes sur Ubuntu 20.04.
Ensuite, copiez l'ID ou le nom du conteneur car nous l'utiliserons dans la commande suivante pour trouver l'identifiant du processus :
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-ou-name |
Remplacez la partie en surbrillance par votre valeur copiée de la commande précédente. Ci-dessous se trouve la sortie que nous avons obtenue, qui est l'identifiant du processus :

Maintenant que nous avons un identifiant de processus, nous pouvons l'utiliser pour exécuter la commande nsenter à l'intérieur de l'espace de noms réseau du processus :
|
1 |
sudo nsenter -t container-pid -n ip addr |
Remplacez la partie en surbrillance par l'identifiant de processus que vous avez obtenu dans la commande précédente. Ensuite, à la place de ip addr, vous pouvez mettre n'importe quelle commande que vous souhaitez exécuter dans l'espace de noms réseau du pod. Vous pouvez également l'exécuter avec sudo dans le cas où vous obtiendriez une erreur d'autorisation refusée.
La commande nsenter vous permet d'exécuter une gamme plus large de commandes disponibles sur un nœud, contrairement à l'utilisation de docker exec qui vous limite uniquement aux commandes installées à l'intérieur du conteneur.
Récupérer l'interface Ethernet virtuelle d'un Pod
Un espace de noms réseau sur un pod communique avec le netns racine du nœud via un canal Ethernet virtuel. Du côté du nœud, ce canal apparaît comme un périphérique dont le nom commence par veth et se termine par un identifiant unique, tel que veth742f721 ou veth90. Tandis qu'à l'intérieur du pod, le canal s'identifie comme eth0.
Vous voudrez peut-être savoir quel périphérique veth est associé à quel pod. Vous pouvez commencer par lister tous les périphériques réseau sur le nœud, puis lister tous les périphériques du réseau du pod. Pour identifier quel périphérique veth est associé à un pod particulier, vous pouvez corréler les numéros de périphérique entre les deux listes.
Utilisez la commande nsenter pour exécuter la commande ip addr dans l'espace de noms réseau du pod. Vous devrez connaître l'un des identifiants de processus du conteneur. Pour cela, reportez-vous à la section précédente sur Obtenir et accéder aux espaces de noms réseau des Pods.
Ensuite, exécutez la commande suivante sur le terminal de votre nœud worker, en remplaçant la partie en surbrillance de manière appropriée :
|
1 |
sudo nsenter -t container-pid -n ip addr |
La commande affiche une liste des interfaces du pod :

Notez les if7 caractères après le eth0@ dans la sortie ci-dessus. Cela signifie que le eth0 du pod est associé à la 7ème interface du nœud. Ensuite, listez les interfaces à l'intérieur du namespace par défaut du nœud en exécutant la commande ip addr :
|
1 |
ip addr |
La commande liste les interfaces comme indiqué ci-dessous :

Dans la sortie, la 7ème interface est veth254b50e6@if3 – le canal ethernet virtuel associé au pod que nous testons.
Examen des règles Iptables
Vous pouvez exécuter la commande iptables-save pour lister toutes les iptables sur un nœud :
|
1 |
iptables-save |
La sortie de la commande peut être longue, vous pouvez donc la sauvegarder dans un fichier pour une inspection ultérieure :
|
1 |
iptables-save > iptables.txt |
Vous pouvez également utiliser less pour paginer la sortie :
|
1 |
iptables-save | less |
Puisque nous ne sommes intéressés que par les règles NAT de Kubernetes, ajoutez le drapeau -L pour spécifier la bonne cible :
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Voici la sortie :

Inspection des détails IPVS
Kube-proxy est un proxy réseau s'exécutant sur chaque nœud de votre cluster Kubernetes. Il peut être utilisé pour configurer IPVS afin de gérer la traduction des IP de Service virtuelles en IP de pod. Pour lister la table de traduction des IP, vous pouvez utiliser la commande ipvsadm . Tout d'abord, vous devez l'installer sur votre nœud :
|
1 |
sudo apt install ipvsadm |
Vous pouvez maintenant exécuter la commande suivante :
|
1 |
sudo ipvsadm -Ln |
Pour afficher une seule IP de Service, ajoutez le drapeau -t , en spécifiant l'adresse IP souhaitée :
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
Interrogation du DNS du cluster
Il existe plusieurs façons de déboguer la résolution DNS de votre cluster. La documentation officielle décrit une méthode consistant à déployer un conteneur de débogage avec tous les outils nécessaires, puis à utiliser kubectl pour exécuter nslookup.
Optionnellement, vous pouvez interroger le DNS en utilisant les commandes dig et nsenter depuis le nœud lui-même. Tout d'abord, vous devrez installer dig sur votre nœud maître. Pour Ubuntu, installez-le avec la commande apt :
|
1 |
sudo apt install dnsutils |

Retournez sur le terminal de votre machine locale et exécutez la commande ci-dessous pour trouver l'IP de cluster du service kube-dns :
|
1 |
kubectl get service -n kube-system kube-dns |
La commande affiche :

La colonne cluster-ip contient la valeur dont nous avons besoin. Nous pouvons maintenant utiliser nsenter pour exécuter dig dans le namespace du conteneur. Cependant, vous aurez besoin de l'identifiant de processus (PID) du conteneur pour accéder à son namespace. Consultez la section Obtention et accès aux namespaces réseau des pods ci-dessus pour obtenir des conseils.
Une fois que vous avez l'identifiant container-id, exécutez la commande suivante sur votre nœud maître :
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
La commande dig prend l'IP du service DNS du cluster ( @10.96.0.10) et recherche le nom de domaine complet du Service service-name.namespace.svc.cluster.local:

Pour plus d'informations sur la recherche des noms de service et des namespaces, consultez la section Obtention de l'adresse IP d'un Service.
Examen du suivi des connexions Conntrack
Vous pouvez utiliser la commande conntrack pour afficher toutes les connexions actuellement suivies :
|
1 |
sudo conntrack -L |
La sortie est similaire à la capture d'écran :

Ajoutez le drapeau -E pour surveiller en continu les connexions entrantes :
|
1 |
sudo conntrack -E |
Pour afficher les connexions suivies vers une adresse de destination particulière, ajoutez le drapeau -d et spécifiez l'adresse de destination :
|
1 |
sudo conntrack -L -d 80.45.6.4 |
Parfois, la table de suivi des connexions se remplit, ce qui entraîne le rejet des nouvelles connexions. Cela provoque des problèmes empêchant vos nœuds d'établir des connexions fiables. Si cela se produit, vous verrez des messages tels que le suivant dans vos journaux système, à l'emplacement /var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: table full, dropping packet. |
Un paramètre système existe pour le nombre maximal de connexions à suivre. Utilisez la commande suivante pour lister votre valeur actuelle :
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Elle affiche :

Vous pouvez modifier la valeur en utilisant le -w flag :
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
Vous souhaiterez peut-être modifier votre fichier /etc/sysctl.conf pour rendre la valeur permanente et vous assurer qu'elle persiste après les redémarrages. Ouvrez le fichier avec nano :
|
1 |
sudo nano /etc/sysctl.conf |
Ensuite, modifiez la valeur si la ligne existe ou ajoutez la ligne à la fin du fichier, en spécifiant la nouvelle valeur :
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Conclusion
Lors du déploiement de plusieurs services conteneurisés, vous bénéficierez grandement de Kubernetes car il vous offre un point de gestion centralisé. Pour garantir la connectivité entre les différents pods Kubernetes, nous vous avons présenté quelques commandes d'inspection réseau que vous pouvez utiliser pour résoudre les problèmes liés à votre infrastructure Kubernetes.
Pour en savoir plus sur Kubernetes, ses avantages, la configuration et le déploiement d'applications sur Kubernetes, jetez un œil à nos différents tutoriels Kubernetes.
Bonne informatique !
Commentaires
Aucun commentaire pour l'instant. Soyez le premier.