Retour au blog

Comment dépanner et inspecter le réseau Kubernetes

Comment dépanner et inspecter le réseau Kubernetes

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

  • 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 :

Ensuite, exécutez la commande suivante pour télécharger la clé de signature publique de Google Cloud :

Ensuite, ajoutez le dépôt Kubernetes apt :

Après cela, mettez à jour l'index apt et installez kubectl avec la commande suivante :

Ensuite, vérifiez que kubectl est installé en vérifiant la version avec la commande suivante :

Voici la sortie si vous venez d'installer kubectl localement :

kubectl version

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 :

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 :

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 :

Voici la sortie, montrant une connexion réussie :

kubectl version json

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

kubectl get nodes

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 :

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 :

kubectl get pod -o wide

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:

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 :

La sortie de la commande ci-dessus est la suivante. L'IP du Service se trouve dans la colonne cluster-ip :

kubectl get svc

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 :

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 :

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 :

docker inspect

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 :

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 :

La commande affiche une liste des interfaces du pod :

nsenter ip addr

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 :

La commande liste les interfaces comme indiqué ci-dessous :

Kubernetes Networking ip addr

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 :

La sortie de la commande peut être longue, vous pouvez donc la sauvegarder dans un fichier pour une inspection ultérieure :

Vous pouvez également utiliser less pour paginer la sortie :

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 :

Voici la sortie :

Kubernetes Networking iptables

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 :

Vous pouvez maintenant exécuter la commande suivante :

Pour afficher une seule IP de Service, ajoutez le drapeau -t , en spécifiant l'adresse IP souhaitée :

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 :

Kubernetes Networking 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 :

La commande affiche :

get kube dns service

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 :

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:

Kubernetes Networking nsenter dig

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 :

La sortie est similaire à la capture d'écran :

Kubernetes Networking conntrac -l

Ajoutez le drapeau -E pour surveiller en continu les connexions entrantes :

Pour afficher les connexions suivies vers une adresse de destination particulière, ajoutez le drapeau -d et spécifiez l'adresse de destination :

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:

Un paramètre système existe pour le nombre maximal de connexions à suivre. Utilisez la commande suivante pour lister votre valeur actuelle :

Elle affiche :

conntrack max

Vous pouvez modifier la valeur en utilisant le -w flag :

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 :

Ensuite, modifiez la valeur si la ligne existe ou ajoutez la ligne à la fin du fichier, en spécifiant la nouvelle valeur :

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 !

author

Pranay Kapgate

Auteur · CloudSigma

Preslav Dobrev est un designer créatif chez CloudSigma, axé sur une identité commerciale cohérente à travers des canaux marketing traditionnels et innovants. Il excelle à fusionner la vision artistique avec le marketing stratégique pour créer des récits de marque percutants.

Commentaires

Aucun commentaire pour l'instant. Soyez le premier.