Si l'API k8s est down, il ne sera plus possible d'utiliser kubectl. On pourrait avoir un message du genre :
$ kubectl get nodes
The connection to the server localhost:6443 was refused -
did you specify the right host or port ?
Ce message d'erreur peut aussi s'afficher si kubeconfig est mal configuré
Pour corriger cela : Vérifier que le CRI (docker, containerd...) et kubelet tournent toujours sur le control plane.
Vérifier le statut du noeud :
kubectl get nodes
Puis décrire les noeuds qui ne sont pas READY :
kubectl describe node <nom noeud>
La partie conditions du describe donne de très bonnes informations.
Si un noeud a un problème, celà signifie peut-être qu'un service (kubelet, docker...) est éteint sur ce noeud.
systemctl status kubelet
systemctl status docker
Si les services sont OK, alors nous allons vérifier les pods dans le namespace kube-system :
kubectl get pods -n kube-system
kubectl describe pod <nom pod> -n kube-system
On peut regarder les logs associés aux services sur chaque noeud en utilisant journalctl
:
journalctl -u kubelet
journalctl -u docker
On peut aussi voir les logs des composants kubernetes dans /var/log :
/var/log/kube-apiserver.log
/var/log/kube-scheduler.log
...
Certains de ces logs ne sont cependant pas présents pour des clusters kubeadm. On retrouve les logs via la commande kubectl logs du container.
On va évidemment regarder le statut du pod kubectl get pods ainsi que kubectl describe pod nom-pod.
On peut aussi accéder au pod via la commande exec :
kubectl exec nompod -c nomcontainer -- commande
Pour exécuter cette commande le pod doit fonctionné.
Les containers écrivent les logs directement dans stdout/stderr. On utilise donc kubectl logs pour avoir le log d'un container :
kubectl logs nompod -c nomcontainer
Dans un premier temps, regarder que le plugin réseau tourne toujours. Ensuite il peut-être intéressant de regarder kube-proxy ainsi que le DNS.
On peut aussi lancer un container qui possède des outils réseaux afin de débuguer le réseau. L'image en question est celle de nikolaka/netshoot. Cette image contient différents outils permettant d'explorer et de débuguer le réseau.
apiVersion: v1
kind: Pod
metadata:
name: netshoot
spec:
containers:
- name: netshoot
image: nicolaka/netshoot
command: ['sh', '-c', 'while true; do sleep 5; done'] # Boucle infinie
Puis nous allons lancer kubectl exec avec les paramètres -i et -t afin d'avoir le shell intéractif.
kubectl exec -it monpod -- /bin/bash