7.8. Dépannage du processus Source-to-Image
7.8.1. Stratégies de dépannage de la source à l'image
Utilisez Source-to-Image (S2I) pour créer des images de conteneurs reproductibles et formatées par Docker. Vous pouvez créer des images prêtes à l'emploi en injectant le code source d'une application dans une image de conteneur et en assemblant une nouvelle image. La nouvelle image incorpore l'image de base (le constructeur) et le code source construit.
Pour déterminer à quel moment du processus S2I une défaillance se produit, vous pouvez observer l'état des pods relatifs à chacune des étapes S2I suivantes :
- During the build configuration stageun pod de construction est utilisé pour créer une image de conteneur d'application à partir d'une image de base et du code source de l'application.
- During the deployment configuration stageun pod de déploiement est utilisé pour déployer des pods d'application à partir de l'image du conteneur d'application qui a été construite lors de l'étape de configuration de la construction. Le module de déploiement déploie également d'autres ressources telles que des services et des itinéraires. La configuration du déploiement commence après la réussite de la configuration de la construction.
-
After the deployment pod has started the application podsles pannes d'application peuvent se produire dans les modules d'application en cours d'exécution. Par exemple, une application peut ne pas se comporter comme prévu bien que les modules d'application soient dans l'état
Running
. Dans ce cas, vous pouvez accéder aux modules d'application en cours d'exécution afin d'examiner les défaillances d'une application au sein d'un module.
Pour résoudre les problèmes liés aux S2I, il convient de suivre la stratégie suivante :
- Contrôler l'état de la construction, du déploiement et du pod d'application
- Déterminer l'étape du processus S2I où le problème s'est produit
- Examiner les journaux correspondant à l'étape échouée
7.8.2. Collecte des données de diagnostic source-image
L'outil S2I exécute successivement un module de construction et un module de déploiement. Le module de déploiement est chargé de déployer les modules d'application sur la base de l'image du conteneur d'application créée lors de la phase de construction. Surveillez l'état de la construction, du déploiement et des modules d'application pour déterminer à quel moment du processus S2I une défaillance se produit. Concentrez ensuite la collecte des données de diagnostic en conséquence.
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
).
Procédure
Surveillez l'état du pod tout au long du processus S2I afin de déterminer à quel stade une défaillance se produit :
$ oc get pods -w 1
- 1
- Utilisez
-w
pour surveiller les modifications apportées aux pods jusqu'à ce que vous quittiez la commande à l'aide deCtrl C
.
Examinez les journaux d'un pod qui a échoué pour y déceler les erreurs.
If the build pod fails, examinez les journaux du module de construction :
oc logs -f pod/<application_name>-<build_number>-build
NoteVous pouvez également consulter les journaux de la configuration de construction en utilisant
oc logs -f bc/<application_name>
. Les journaux de la configuration de construction comprennent les journaux du module de construction.If the deployment pod failsle cas échéant, examinez les journaux du module de déploiement :
$ oc logs -f pod/<application_name>-<build_number>-deploy
NoteVous pouvez également consulter les journaux de la configuration de déploiement à l'aide de
oc logs -f dc/<application_name>
. Cette commande génère des journaux à partir du module de déploiement jusqu'à ce que ce dernier se termine avec succès. La commande affiche les journaux des modules d'application si vous l'exécutez après la fin du module de déploiement. Après la fin d'un module de déploiement, il est toujours possible d'accéder à ses journaux en exécutant la commandeoc logs -f pod/<application_name>-<build_number>-deploy
.If an application pod fails, or if an application is not behaving as expected within a running application podpour ce faire, consultez les journaux du module d'application :
$ oc logs -f pod/<application_name>-<build_number>-<random_string>
7.8.3. Collecte de données de diagnostic d'application afin d'enquêter sur les défaillances de l'application
Des pannes d'application peuvent se produire dans les pods d'application en cours d'exécution. Dans ces situations, vous pouvez récupérer des informations de diagnostic à l'aide de ces stratégies :
- Examiner les événements relatifs aux modules d'application.
- Examinez les journaux des pods d'application, y compris les fichiers journaux spécifiques à l'application qui ne sont pas collectés par le cadre de journalisation OpenShift.
- Tester les fonctionnalités d'une application de manière interactive et exécuter des outils de diagnostic dans un conteneur d'application.
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
Répertorie les événements relatifs à un module d'application spécifique. L'exemple suivant permet de récupérer les événements d'un module d'application nommé
my-app-1-akdlg
:$ oc describe pod/my-app-1-akdlg
Examiner les journaux d'un module d'application :
$ oc logs -f pod/my-app-1-akdlg
Interroger des logs spécifiques dans un pod d'application en cours d'exécution. Les logs qui sont envoyés à stdout sont collectés par le framework OpenShift Logging et sont inclus dans la sortie de la commande précédente. La requête suivante n'est nécessaire que pour les journaux qui ne sont pas envoyés à stdout.
S'il est possible d'accéder à un journal d'application sans les privilèges de l'administrateur dans un module, concaténer le fichier journal comme suit :
$ oc exec my-app-1-akdlg -- cat /var/log/my-application.log
Si l'accès root est nécessaire pour consulter le journal d'une application, vous pouvez démarrer un conteneur de débogage avec les privilèges root, puis consulter le fichier journal à partir du conteneur. Démarrez le conteneur de débogage à partir de l'objet
DeploymentConfig
du projet. Les utilisateurs de pods s'exécutent généralement avec des privilèges non root, mais l'exécution de pods de dépannage avec des privilèges root temporaires peut s'avérer utile lors de l'investigation d'un problème :$ oc debug dc/my-deployment-configuration --as-root -- cat /var/log/my-application.log
NoteVous pouvez accéder à un shell interactif avec un accès root dans le pod de débogage si vous exécutez
oc debug dc/<deployment_configuration> --as-root
sans ajouter-- <command>
.
Tester les fonctionnalités d'une application de manière interactive et exécuter des outils de diagnostic, dans un conteneur d'application avec un shell interactif.
Démarrer un shell interactif sur le conteneur d'application :
$ oc exec -it my-app-1-akdlg /bin/bash
- Tester les fonctionnalités de l'application de manière interactive à partir de l'interpréteur de commandes. Par exemple, vous pouvez exécuter la commande du point d'entrée du conteneur et observer les résultats. Ensuite, vous pouvez tester les modifications directement à partir de la ligne de commande, avant de mettre à jour le code source et de reconstruire le conteneur d'application par le biais du processus S2I.
Exécuter les binaires de diagnostic disponibles dans le conteneur.
NoteLes privilèges root sont nécessaires pour exécuter certains binaires de diagnostic. Dans ce cas, vous pouvez démarrer un pod de débogage avec un accès root, basé sur l'objet
DeploymentConfig
d'un pod problématique, en exécutantoc debug dc/<deployment_configuration> --as-root
. Ensuite, vous pouvez exécuter les binaires de diagnostic en tant que root à partir du pod de débogage.
Si les binaires de diagnostic ne sont pas disponibles dans un conteneur, vous pouvez exécuter les binaires de diagnostic d'un hôte dans l'espace de noms d'un conteneur en utilisant
nsenter
. L'exemple suivant exécuteip ad
dans l'espace de noms d'un conteneur, en utilisant le binaireip
de l'hôte.Entrez dans une session de débogage sur le nœud cible. Cette étape instancie un pod de débogage appelé
<node_name>-debug
:$ oc debug node/my-cluster-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.Déterminer l'ID du conteneur cible :
# crictl ps
Déterminer l'ID du processus du conteneur. Dans cet exemple, l'ID du conteneur cible est
a7fe32346b120
:# crictl inspect a7fe32346b120 --output yaml | grep 'pid:' | awk '{print $2}'
Exécutez
ip ad
dans l'espace de noms du conteneur, en utilisant le binaireip
de l'hôte. Cet exemple utilise31150
comme ID de processus du conteneur. La commandensenter
entre dans l'espace de noms d'un processus cible et exécute une commande dans son espace de noms. Comme le processus cible dans cet exemple est l'ID de processus d'un conteneur, la commandeip ad
est exécutée dans l'espace de noms du conteneur à partir de l'hôte :# nsenter -n -t 31150 -- ip ad
NoteL'exécution des binaires de diagnostic d'un hôte dans l'espace de noms d'un conteneur n'est possible que si vous utilisez un conteneur privilégié tel qu'un nœud de débogage.
7.8.4. Ressources supplémentaires
- Pour plus d'informations sur la stratégie de construction S2I, voir la section Construction de source à image (S2 I).