Les déploiements Kubernetes (K8s) présentent souvent des défis sous divers angles, notamment les pods, les services, l'entrée, les clusters qui ne répondent pas, les plans de contrôle et la configuration haute disponibilité. Le pod Kubernetes est la plus petite unité déployable de l'écosystème Kubernetes, encapsulant un ou plusieurs conteneurs qui partagent des ressources et des réseaux. Les pods sont conçus pour exécuter une seule instance d'une application ou d'un processus, et sont créés et supprimés selon les besoins. Les pods sont essentiels pour la mise à l'échelle, la mise à jour et la maintenance des applications dans un environnement K8.
Traduit de Master Kubernetes Pods : Stratégies de dépannage avancées , auteur Aucun.
Cet article explore les défis rencontrés par les pods Kubernetes et les étapes de dépannage à suivre. Certains des messages d'erreur rencontrés lors de l'exécution de pods Kubernetes incluent :
- ImagePullBackoff
- ErrImagePull
- Nom d'image invalide
- CrashLoopBackOff
Parfois, vous ne rencontrerez même pas les erreurs répertoriées, mais constaterez quand même que votre pod échoue. Tout d'abord, il est important de noter que lors du débogage d'une ressource Kubernetes, vous devez comprendre la référence de l'API . Il explique comment les différentes API Kubernetes sont définies et comment fonctionnent plusieurs objets dans un pod/déploiement. La documentation est clairement définie dans la référence API sur le site Kubernetes . Dans ce cas, lors du débogage du pod, sélectionnez l'objet pod dans la référence API pour en savoir plus sur le fonctionnement du pod. Il définit les champs qui entrent dans le pod, à savoir la version, le type, les métadonnées, la spécification et le statut. Kubernetes fournit également un aide-mémoire avec un guide des commandes requises.
conditions préalables
Cet article suppose que les lecteurs remplissent les conditions suivantes :
- Type installé pour la démonstration du scénario
- Compréhension intermédiaire de l'architecture Kubernetes
- Outil de ligne de commande Kubectl
Erreur de pod Kubernetes - ImagePullBackoff
Cette erreur apparaît pour trois raisons différentes :
- Image invalide
- Balise invalide
- Autorisations invalides
Ces situations surviennent lorsque vous ne disposez pas des informations correctes sur l'image. Vous n'êtes peut-être pas non plus autorisé à extraire l'image de son référentiel (dépôt privé). Pour démontrer cela dans l'exemple ci-dessous, nous créons un déploiement nginx :
➜ ~ kubectl create deploy nginx --image=nginxdeployment.apps/nginx created
Une fois le pod exécuté, obtenez le nom du pod :
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-8f458dc5b-hcrsh 1/1 Running 0 100s
Copiez le nom du pod en cours d'exécution et obtenez plus d'informations à ce sujet :
➜ ~ kubectl describe pod nginx-8f458dc5b-hcrsh
Name: nginx-8f458dc5b-hcrsh
hable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m43s default-scheduler Successfully assigned default/nginx-8f458dc5b-hcrsh to k8s-troubleshooting-control-plane
Normal Pulling 2m43s kubelet Pulling image "nginx"
Normal Pulled 100s kubelet Successfully pulled image "nginx" in 1m2.220189835s
Normal Created 100s kubelet Created container nginx
Normal Started 100s kubelet Started container nginx
L'image a été extraite avec succès. Votre pod Kubernetes fonctionne sans erreur.
Pour démontrer ImagePullBackoff, modifiez le fichier YAML de déploiement et spécifiez une image inexistante :
➜ kubectl edit deploy nginx
containers:
-image: nginxdoestexist
imagePullPolicy: Always
name: nginx
Le nouveau pod n'a pas été déployé avec succès
➜ ~ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5b847fdb95-mx4pq 0/1 ErrImagePull 0 3m40s
nginx-8f458dc5b-hcrsh 1/1 Running 0 38m
Erreur ImagePullBackoff affichée
➜ ~ kubectl describe pod nginx-6f46cbfbcb-c92bl
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 88s default-scheduler Successfully assigned default/nginx-6f46cbfbcb-c92bl to k8s-troubleshooting-control-plane
Normal Pulling 40s (x3 over 88s) kubelet Pulling image "nginxdoesntexist"
Warning Failed 37s (x3 over 85s) kubelet Failed to pull image "nginxdoesntexist": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxdoesntexist:latest": failed to resolve reference "docker.io/library/nginxdoesntexist:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Warning Failed 37s (x3 over 85s) kubelet Error: ErrImagePull
Normal BackOff 11s (x4 over 85s) kubelet Back-off pulling image "nginxdoesntexist"
Warning Failed 11s (x4 over 85s) kubelet Error: ImagePullBackOff
Erreur du pod Kubernetes : l'image a été extraite mais le pod est en attente.
Chaque fois que vous exécutez K8 dans un environnement de production, l'administrateur K8 alloue des quotas de ressources à chaque espace de noms en fonction des exigences des espaces de noms exécutés dans le cluster. Les espaces de noms sont utilisés pour la séparation logique au sein d'un cluster.
L'erreur « Image extraite, mais le pod est toujours en attente » est générée lorsque les spécifications du quota de ressources ne répondent pas aux exigences minimales de l'application dans le pod. Dans l'exemple suivant, créez un espace de noms appelé paiements :
➜ ~ kubectl create ns payments
namespace/payments created
Créer des quotas de ressources à l'aide de spécifications pertinentes
➜ ~ cat resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 4Gi
Attribuer des quotas de ressources aux paiements d'espace de noms
➜ ~ kubectl apply -f resourcequota.yaml -n paymentsresourcequota/compute-resources created
Quota de ressources/ressources de calcul créées
Créez un nouveau déploiement dans un espace de noms avec des restrictions de quota de ressources :
kubectl create deploy nginx --image=nginx -n paymentsdeployment.apps/nginx created
Bien que le déploiement ait été créé avec succès, aucun pod n'existe :
➜ ~ kubectl get pods -n payments
No resources found in payments namespace
Le déploiement est créé, mais il n'y a aucun pod à l'état prêt, aucun pod à mettre à jour et aucun pod disponible :
➜ ~ kubectl get deploy -n payments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 0 0 7m4s
Pour déboguer davantage, décrivez le déploiement de nginx. Échec de la création du pod :
➜ ~ kubectl describe deploy nginx -n payments
Name: nginx
Namespace: payments
CreationTimestamp: Wed, 24 May 2023 21:37:55 +0300
Labels: app=nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 1 desired | 0 updated | 0 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
ReplicaFailure True FailedCreate
Progressing False ProgressDeadlineExceeded
OldReplicaSets: <none>
NewReplicaSet: nginx-8f458dc5b (0/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set nginx-8f458dc5b to 1
Une analyse plus approfondie des événements Kubernetes a révélé une mémoire insuffisante requise pour la création de pods.
➜ ~ kubectl get events --sort-by=/metadata.creationTimestamp
Cette erreur se produit lorsque votre image est extraite avec succès et que votre conteneur est créé, mais que votre configuration d'exécution échoue. Par exemple, si vous disposez d'une application Python fonctionnelle qui tente d'écrire dans un dossier qui n'existe pas ou qui n'est pas autorisée à écrire dans le dossier. Initialement, l'application s'exécute puis rencontre une erreur. Si une panique se produit dans la logique de votre application, le conteneur s'arrêtera. Le conteneur ira dans CrashLoopBackOff. Finalement, vous observez que le déploiement n'a pas de pods, c'est-à-dire qu'il y a un pod, mais il n'est pas en cours d'exécution et génère une erreur CrashLoopbackoff.
Les sondes de vivacité et de préparation ont échoué
La détection d'activité détecte si un pod est entré dans un état endommagé et ne peut plus fournir de trafic. Kubernetes redémarrera le Pod pour vous. Les sondes de préparation vérifient si votre application est prête à gérer le trafic. Les sondes de préparation garantissent que votre application récupère toute la configuration requise à partir de la carte de configuration et démarre ses threads. Ce n'est qu'après avoir terminé ce processus que votre application sera prête à recevoir du trafic. Si votre application rencontre une erreur au cours de ce processus, elle entrera également dans CrashLoopBackoff.
Commencez le dépannage !
Cet article fournit une présentation des techniques de dépannage pour les pods Kubernetes. Il traite des erreurs courantes rencontrées lors du déploiement de pods et fournit des solutions pratiques pour résoudre ces erreurs. Il fournit également un aperçu des pages de référence et des aide-mémoire qui sont essentiels pour comprendre le fonctionnement de Kubernetes et identifier et résoudre efficacement les problèmes. En suivant les conseils fournis dans cet article, les lecteurs peuvent améliorer leurs compétences de dépannage et simplifier le déploiement et la gestion de leurs pods Kubernetes.
J'ai décidé d'abandonner l'open source Hongmeng Wang Chenglu, le père de l'open source Hongmeng : L'open source Hongmeng est le seul événement logiciel industriel d'innovation architecturale dans le domaine des logiciels de base en Chine - OGG 1.0 est publié, Huawei contribue à tout le code source. Google Reader est tué par la "montagne de merde de code" Ubuntu 24.04 LTS est officiellement publié Avant la sortie officielle de Fedora Linux 40, les développeurs Microsoft : les performances de Windows 11 sont "ridiculement mauvaises", Ma Huateng et Zhou Hongyi se serrent la main, "éliminant les rancunes" Des sociétés de jeux bien connues ont publié de nouvelles réglementations : les cadeaux de mariage des employés ne doivent pas dépasser 100 000 yuans. Pinduoduo a été condamné pour concurrence déloyale. Indemnisation de 5 millions de yuans.Cet article a été publié pour la première fois sur Yunyunzhongsheng ( https://yylives.cc/ ), tout le monde est invité à le visiter.