7.3. Résolution des problèmes liés à l'exécution du conteneur CRI-O
7.3.1. A propos du moteur d'exécution de conteneurs CRI-O
CRI-O est une implémentation de moteur de conteneur natif de Kubernetes qui s'intègre étroitement avec le système d'exploitation pour fournir une expérience Kubernetes efficace et optimisée. Le moteur de conteneurs CRI-O s'exécute en tant que service systemd sur chaque nœud de cluster OpenShift Container Platform.
Lorsque des problèmes d'exécution des conteneurs surviennent, vérifiez l'état du service crio
systemd sur chaque nœud. Rassemblez les journaux de l'unité CRI-O journald des nœuds qui présentent des problèmes d'exécution des conteneurs.
7.3.2. Vérification de l'état du moteur d'exécution CRI-O
Vous pouvez vérifier l'état du moteur d'exécution des conteneurs CRI-O sur chaque nœud du cluster.
Conditions préalables
-
Vous avez accès au cluster en tant qu'utilisateur ayant le rôle
cluster-admin
. -
Vous avez installé l'OpenShift CLI (
oc
).
Procédure
Examinez l'état du CRI-O en interrogeant le service
crio
systemd sur un nœud, à l'intérieur d'un pod de débogage.Démarrer un pod de débogage pour un nœud :
$ oc debug node/my-node
Définissez
/host
comme répertoire racine dans le shell de débogage. Le pod de débogage monte le système de fichiers racine de l'hôte dans/host
au sein du pod. En changeant le répertoire racine en/host
, vous pouvez exécuter les binaires contenus dans les chemins d'exécution de l'hôte :# chroot /host
NoteLes nœuds de cluster OpenShift Container Platform 4.12 exécutant Red Hat Enterprise Linux CoreOS (RHCOS) sont immuables et s'appuient sur les opérateurs pour appliquer les changements de cluster. L'accès aux nœuds de cluster à l'aide de SSH n'est pas recommandé et les nœuds seront altérés en tant que accessed. Cependant, si l'API OpenShift Container Platform n'est pas disponible, ou si le kubelet ne fonctionne pas correctement sur le nœud cible, les opérations
oc
seront impactées. Dans de telles situations, il est possible d'accéder aux nœuds en utilisantssh core@<node>.<cluster_name>.<base_domain>
à la place.Vérifiez si le service
crio
systemd est actif sur le nœud :# systemctl is-active crio
Affiche un résumé plus détaillé de l'état de
crio.service
:# systemctl status crio.service
7.3.3. Collecte des journaux d'unité du CRI-O
Si vous rencontrez des problèmes avec CRI-O, vous pouvez obtenir les journaux de l'unité CRI-O d'un nœud.
Conditions préalables
-
Vous avez accès au cluster en tant qu'utilisateur ayant le rôle
cluster-admin
. - Your API service is still functional.
-
Vous avez installé l'OpenShift CLI (
oc
). - Vous disposez des noms de domaine complets du plan de contrôle ou des machines du plan de contrôle.
Procédure
Rassembler les journaux de l'unité CRI-O journald. L'exemple suivant collecte les journaux de tous les nœuds du plan de contrôle (au sein de la grappe) :
$ oc adm node-logs --role=master -u crio
Rassemble les journaux de l'unité CRI-O journald d'un nœud spécifique :
$ oc adm node-logs <node_name> -u crio
Si l'API n'est pas fonctionnelle, examinez les journaux en utilisant SSH à la place. Remplacez
<node>.<cluster_name>.<base_domain>
par les valeurs appropriées :$ ssh core@<node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.service
NoteLes nœuds de cluster OpenShift Container Platform 4.12 exécutant Red Hat Enterprise Linux CoreOS (RHCOS) sont immuables et dépendent des opérateurs pour appliquer les changements de cluster. L'accès aux nœuds de cluster à l'aide de SSH n'est pas recommandé et les nœuds seront altérés comme accessed. Avant d'essayer de collecter des données de diagnostic via SSH, vérifiez si les données collectées en exécutant
oc adm must gather
et d'autres commandesoc
sont suffisantes. Cependant, si l'API OpenShift Container Platform n'est pas disponible, ou si le kubelet ne fonctionne pas correctement sur le nœud cible, les opérationsoc
seront impactées. Dans de telles situations, il est possible d'accéder aux nœuds en utilisantssh core@<node>.<cluster_name>.<base_domain>
.
7.3.4. Nettoyage de l'entrepôt CRI-O
Vous pouvez effacer manuellement la mémoire éphémère de CRI-O si vous rencontrez les problèmes suivants :
Un nœud ne peut s'exécuter sur aucun pod et cette erreur apparaît :
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to mount container XXX: error recreating the missing symlinks: error reading name of symlink for XXX: open /var/lib/containers/storage/overlay/XXX/link: no such file or directory
Vous ne pouvez pas créer un nouveau conteneur sur un nœud de travail et l'erreur "can't stat lower layer" apparaît :
can't stat lower layer ... because it does not exist. Going through storage to recreate the missing symlinks.
-
Votre nœud est dans l'état
NotReady
après une mise à niveau du cluster ou si vous tentez de le redémarrer. -
L'implémentation de l'exécution du conteneur (
crio
) ne fonctionne pas correctement. -
Vous ne pouvez pas démarrer un shell de débogage sur le nœud utilisant
oc debug node/<nodename>
car l'instance d'exécution du conteneur (crio
) ne fonctionne pas.
Suivez cette procédure pour effacer complètement la mémoire du CRI-O et résoudre les erreurs.
Prérequis :
-
Vous avez accès au cluster en tant qu'utilisateur ayant le rôle
cluster-admin
. -
Vous avez installé l'OpenShift CLI (
oc
).
Procédure
Utiliser
cordon
sur le nœud. Cela permet d'éviter qu'une charge de travail ne soit planifiée si le nœud passe à l'étatReady
. Vous saurez que la planification est désactivée lorsqueSchedulingDisabled
apparaîtra dans votre section Statut :$ oc adm cordon <nodename>
Drainer le nœud en tant qu'utilisateur cluster-admin :
oc adm drain <nodename> --ignore-daemonsets --delete-emptydir-data
NoteL'attribut
terminationGracePeriodSeconds
d'un pod ou d'un modèle de pod contrôle la période de terminaison gracieuse. Cet attribut est fixé par défaut à 30 secondes, mais peut être personnalisé par application si nécessaire. S'il est fixé à plus de 90 secondes, le module peut être marqué commeSIGKILLed
et ne pas se terminer avec succès.Lorsque le nœud revient, connectez-vous à nouveau au nœud via SSH ou la console. Ensuite, connectez-vous à l'utilisateur root :
$ ssh core@node1.example.com $ sudo -i
Arrêter manuellement le kubelet :
# systemctl stop kubelet
Arrêter les conteneurs et les cosses :
Utilisez la commande suivante pour arrêter les pods qui ne se trouvent pas dans le site
HostNetwork
. Ils doivent être supprimés en premier car leur suppression dépend des pods du plugin de mise en réseau, qui se trouvent dans le siteHostNetwork
... for pod in $(crictl pods -q); do if [[ "$(crictl inspectp $pod | jq -r .status.linux.namespaces.options.network)" != "NODE" ]]; then crictl rmp -f $pod; fi; done
Arrêter toutes les autres nacelles :
# crictl rmp -fa
Arrêter manuellement les services crio :
# systemctl stop crio
Après avoir exécuté ces commandes, vous pouvez effacer complètement le stockage éphémère :
# crio wipe -f
Démarrer le service crio et kubelet :
# systemctl start crio # systemctl start kubelet
Vous saurez que le nettoyage a fonctionné si les services crio et kubelet sont démarrés et si le nœud est dans l'état
Ready
:$ oc get nodes
Exemple de sortie
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready, SchedulingDisabled master 133m v1.25.0
Marquez le nœud comme étant planifiable. Vous saurez que l'ordonnancement est activé lorsque
SchedulingDisabled
n'aura plus d'état :oc adm uncordon <nodename> $ oc adm uncordon <nodename>
Exemple de sortie
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready master 133m v1.25.0