web-dev-qa-db-fra.com

Mes pods kubernetes continuent de planter avec "CrashLoopBackOff" mais je ne trouve aucun journal

C'est ce que je continue de recevoir:

[root@centos-master ~]# kubectl get pods
NAME               READY     STATUS             RESTARTS   AGE
nfs-server-h6nw8   1/1       Running            0          1h
nfs-web-07rxz      0/1       CrashLoopBackOff   8          16m
nfs-web-fdr9h      0/1       CrashLoopBackOff   8          16m

Vous trouverez ci-dessous le résultat de "Des gousses" Kubectl Des gousses

Events:
  FirstSeen LastSeen    Count   From                SubobjectPath       Type        Reason      Message
  --------- --------    -----   ----                -------------       --------    ------      -------
  16m       16m     1   {default-scheduler }                    Normal      Scheduled   Successfully assigned nfs-web-fdr9h to centos-minion-2
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Created     Created container with docker id 495fcbb06836
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Started     Started container with docker id 495fcbb06836
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Started     Started container with docker id d56f34ae4e8f
  16m       16m     1   {kubelet centos-minion-2}   spec.containers{web}    Normal      Created     Created container with docker id d56f34ae4e8f
  16m       16m     2   {kubelet centos-minion-2}               Warning     FailedSync  Error syncing pod, skipping: failed to "StartContainer" for "web" with CrashLoopBackOff: "Back-off 10s restarting failed container=web pod=nfs-web-fdr9h_default(461c937d-d870-11e6-98de-005056040cc2)"

J'ai deux pods: nfs-web-07rxz, nfs-web-fdr9h, mais si je fais "kubectl logs nfs-web-07rxz" ou avec l'option "-p", je ne vois aucun journal dans les deux pods.

[root@centos-master ~]# kubectl logs nfs-web-07rxz -p
[root@centos-master ~]# kubectl logs nfs-web-07rxz

Voici mon fichier yaml replicationController: fichier yaml réplicationController

apiVersion: v1 kind: ReplicationController metadata:   name: nfs-web spec:   replicas: 2   selector:
    role: web-frontend   template:
    metadata:
      labels:
        role: web-frontend
    spec:
      containers:
      - name: web
        image: eso-cmbu-docker.artifactory.eng.vmware.com/demo-container:demo-version3.0
        ports:
          - name: web
            containerPort: 80
        securityContext:
          privileged: true

Mon image Docker a été créée à partir de ce simple fichier docker:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y nfs-common

J'exécute mon cluster kubernetes sur CentOs-1611, version kube:

[root@centos-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.0", GitCommit:"86dc49aa137175378ac7fba7751c3d3e7f18e5fc", GitTreeState:"clean", BuildDate:"2016-12-15T16:57:18Z", GoVersion:"go1.6.3", Compiler:"gc", Platform:"linux/AMD64"}

Si j'exécute l'image du menu fixe en exécutant "Exécution du menu fixe", je suis en mesure d'exécuter l'image sans problème, mais uniquement par le biais de kubernetes. 

Quelqu'un peut-il m'aider, comment puis-je déboguer sans voir aucun journal?

30
Alan Huang

Comme @Sukumar l'a commenté, vous devez que votre fichier Docker ait une commande pour pouvoir s'exécuter ou que votre ReplicationController spécifie une commande. 

Le pod se bloque car il démarre puis se termine immédiatement. Kubernetes redémarre et le cycle continue. 

31
Steve Sloka
kubectl -n <namespace-name> describe pod <pod name>

kubectl -n <namespace-name> logs -p  <pod name> 
9
user128364

J'avais besoin de garder un pod en fonctionnement pour les appels ultérieurs kubectl exec et, comme l'indiquaient les commentaires ci-dessus, mon pod était en train d'être tué par mon cluster k8s car il avait exécuté toutes ses tâches. J'ai réussi à maintenir mon pod en marche en le tapant simplement avec une commande qui ne s'arrêtait pas automatiquement, comme dans:

kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null
4
hmacias

De Cette page , le conteneur meurt après avoir tout exécuté correctement mais plante, car toutes les commandes se sont terminées. Soit vous faites fonctionner vos services au premier plan, soit vous créez un script Keep Alive. Ce faisant, Kubernetes montrera que votre application est en cours d'exécution. Nous devons noter que dans l'environnement Docker, ce problème n'est pas rencontré. Ce n'est que Kubernetes qui veut une application en cours d'exécution.

2
Julien Nyambal

Si vous avez une application dont le démarrage est plus lent, cela pourrait être lié aux valeurs initiales des sondes de disponibilité/vivacité. J'ai résolu mon problème en augmentant la valeur de initialDelaySeconds à 120s car mon application SpringBoot traitait beaucoup d'initialisation. La documentation not ne mentionne pas le 0 par défaut ( https://kubernetes.io/docs/api-reference/v1.9/#probe-v1-core )

service:
  livenessProbe:
    httpGet:
      path: /health/local
      scheme: HTTP
      port: 8888
    initialDelaySeconds: 120
    periodSeconds: 5
    timeoutSeconds: 5
    failureThreshold: 10
  readinessProbe:
    httpGet:
      path: /admin/health
      scheme: HTTP
      port: 8642
    initialDelaySeconds: 150
    periodSeconds: 5
    timeoutSeconds: 5
    failureThreshold: 10

Une très bonne explication de ces valeurs est donnée par Quelle est la valeur par défaut de initialDelaySeconds

L'algorithme de vérification de l'état de santé ou de l'état de préparation fonctionne comme suit:

  1. attendre initialDelaySeconds
  2. effectuez le contrôle et attendez timeoutSeconds pour un délai d'attente si le nombre de succès continus est supérieur à successThreshold return return
  3. si le nombre d'échecs continus est supérieur à failureThreshold renvoyer échec sinon attendez periodSeconds et démarrez une nouvelle vérification

Dans mon cas, mon application peut maintenant démarrer de manière très claire, de sorte que je sache que je n'aurai pas de crash-back périodique, car parfois ce serait à la limite de ces taux. 

1
Marcello de Sales

Dans mon cas, le problème était ce que Steve S. a mentionné:

Le pod se bloque car il démarre puis se termine immédiatement. Kubernetes redémarre et le cycle continue. 

A savoir, j'avais une application Java dont la main lançait une exception (et quelque chose a surchargé le gestionnaire d'exceptions par défaut non capturé afin que rien ne soit consigné). La solution consistait à placer le corps de main dans try { ... } catch et à imprimer l'exception. Ainsi, j'ai pu découvrir ce qui n'allait pas et le réparer.

(Une autre cause peut être quelque chose dans l'application appelant System.exit; vous pouvez utiliser une SecurityManager personnalisée avec une checkExit remplacée pour empêcher (ou connecter l'appelant de) quitter; voir https://stackoverflow.com/a/5401319/204205 .)

0
Jakub Holý

Lors du dépannage du même problème, je n’ai trouvé aucun journal lors de l’utilisation de kubeclt logs <pod_id>. Par conséquent, j’ai ssh: édité dans l’instance de noeud pour essayer d’exécuter le conteneur à l’aide du menu fixe. À ma grande surprise, cela a également échoué. 

En entrant dans le conteneur avec: 

docker exec -it faulty:latest /bin/sh

et en fouillant, j'ai trouvé que ce n'était pas la dernière version.

Une version défectueuse de l'image du menu fixe était déjà disponible sur l'instance.

Quand j'ai enlevé la dernière instance défectueuse avec:

docker rmi faulty:latest

tout a commencé à fonctionner.

0
javabeangrinder