Guillaume Fenollar DevOps et SysAdmin Freelance

Guillaume FENOLLAR

Ingénieur Linux/DevOps Indépendant

− Montpellier −

Kubectl health, un plugin pour surveiller son cluster Kubernetes

La découverte de l'écosystème Kubernetes et des outils qui s'en rapportent m'ont donné la curiosité d'apprendre le langage Go (Golang), et quoi de mieux pour apprendre que d'avoir un projet en tête permettant de pratiquer dès le début de l'apprentissage ? Je vous présente donc ici mon plugin Kubectl permettant de récupérer un état de santé assez complet de son ou ses clusters Kubernetes.

C’est un besoin qui m’est venu naturellement car devant gérer un nombre croissant de clusters et n’ayant pas toujours de solution type Prometheus installée dans chacun, ni d’aggrégateur d’alertes. Il me fallait donc un outil, si possible en cli, pour savoir d’un coup d’oeil quelle piste privilégier en cas de problème avéré sur une installation.

Cet outil, je l’ai écrit en langage Go. Pour ceux qui ne connaissent pas, il s’agit d’un langage relativement récent (bientôt 10 ans d’existence à l’heure où ces lignes sont écrites), initié par Google, fortement typé et compilé, et désormais le principal langage des plateformes “cloud” et de leurs outils.

Les sources sont visibles sur mon espace Gitlab. Vous y trouverez la documentation associée, mais voici un petit récap en français.

Installation

Pour les systèmes Linux, le plus simple pour l’installer est de récupérer l’artefact de compilation construit par le dernier job CI configuré sur Gitlab, puis de le placer dans un dossier faisant partie de son $PATH :

curl -s -L -o /tmp/kubectl-health.zip https://gitlab.com/guillaume.fenollar/kubectl-health/-/jobs/artifacts/master/download?job=build
sudo unzip -d /usr/bin/ /tmp/kubectl-health.zip

Mais je vous encourage plutôt à cloner le repo, et le builder vous même. Cette méthode est alors compatible avec tous langages d’exploitation.

DST=$GOPATH/gitlab.com/guillaume.fenollar/
mkdir -p $DST && cd $DST
git clone [email protected]:guillaume.fenollar/kubectl-health.git
cd kubectl-health && go build . -o /usr/bin/kubectl-health

Usage

Un plugin Kubectl est simplement un binaire dont le nom commence par kubectl-. La commande kubectl passe donc les arguments tapés par l’utilisateur s’il détecte un binaire matchant le nom de la première commande. Ainsi, pour l’utiliser :

$ kubectl health
INFO Using context cluster-qual
INFO Found 4 nodes, gathering data...
WARNING Conditions detected ! Please review :

LEVEL          NAMESPACE  KIND NAME                        MESSAGE
ALERT         namespace1  pod mydeploy1-xxxxxxxxxx-yyyyy   Pod isn't ready with message : containers with unready status: [container1]
ALERT         namespace2  pod mydeploy2-xxxxxxxxxx-yyyyy   Pod isn't ready with message : containers with unready status: [container2]
WARNING       namespace2  pod kafka-0                      Pod kafka-0's data volume is full at 78%
WARNING                   node qual-master-1               Node's memory available is 21%
WARNING                   node qual-master-1               Node's Image FS is full at 75%

Kubectl-health s’appuie comme sa commande mère, sur un fichier kubeconfig, vous n’avez donc rien à faire. Comme l’utilisation de Kubectl le permet, il est possible de spécifier un namespace ou un contexte différent à l’exécution.

Kubectl utilise alors 3 sources de données pour remonter d’éventuels problèmes :

  • L’API Pods pour remonter tout pod et conteneur en échec
  • L’API Nodes pour remonter tout problème au niveau d’un objet Node
  • L’API stats de chaque Kubelet correspondant à chaque Node du cluster

Cette dernière API est fournie par les Kubelet, et c’est celle qui donne le plus d’informations. Ainsi, Kubectl-health va d’abord lister les nodes du cluster, et contacter les Kubelet sur leur endpoint (décrit dans l’objet Node) en mode insecure (incohérence dans les certificats de celles-ci oblige). Sont alors analysés tout ce qui peut l’être, incluant l’utilisation des volumes persistants sur les pods du node ou encore l’usage CPU/Mémoire du node.

Bien entendu, ce programme est un work-in-progress et sera amélioré au fur et à mesure. N’hésitez pas à m’envoyer vos idées de nouvelles features ou vos observations si le coeur vous en dit ;)