Maîtriser le dépannage du KUBERNETES POD : stratégies et scénarios avancés

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.

Cet article a été publié pour la première fois sur Yunyunzhongsheng ( https://yylives.cc/ ), tout le monde est invité à le visiter.

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.
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/6919515/blog/11054466
conseillé
Classement