Meine Kubernetes-Pods stürzen immer wieder mit "CrashLoopBackOff" ab, aber ich kann kein Protokoll finden

97

Das bekomme ich immer wieder:

[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

Unten ist die Ausgabe von "beschreiben Pods" kubectl beschreiben Pods

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)"

Ich habe zwei Pods: nfs-web-07rxz, nfs-web-fdr9h, aber wenn ich "kubectl logs nfs-web-07rxz" oder mit der Option "-p" mache, sehe ich in beiden Pods kein Protokoll.

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

Dies ist meine ReplicationController-Yaml-Datei: ReplicationController-Yaml-Datei

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

Mein Docker-Image wurde aus dieser einfachen Docker-Datei erstellt:

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

Ich verwende meinen Kubernetes-Cluster auf CentOs-1611, Kube-Version:

[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"}

Wenn ich das Docker-Image mit "Docker-Run" ausführe, konnte ich das Image ohne Probleme ausführen, nur über Kubernetes bekam ich den Absturz.

Kann mir jemand helfen, wie kann ich debuggen, ohne ein Protokoll zu sehen?

Luzifer
quelle
1
Können Sie versuchen , dem Pod Yaml einen Befehl hinzuzufügen?
Sukumar
1
Überprüfen Sie die Protokolle kubectl logs -f <pod_name>damit könnte das Startproblem (Server / Container) sein.
Vishrant
Sie können auch laufen, um kubectl get eventszu sehen, was die Quetschschleife verursacht.
Margach Chris

Antworten:

74

Wie @Sukumar kommentierte, muss Ihre Docker-Datei über einen Befehl zum Ausführen verfügen oder Ihr ReplicationController muss einen Befehl angeben.

Der Pod stürzt ab, weil er startet und sofort beendet wird. Kubernetes startet neu und der Zyklus wird fortgesetzt.

Steve Sloka
quelle
1
Was kann der Grund sein, wenn wir die richtige Docker-Datei hinzugefügt haben und trotzdem den Fehler erhalten? Ich erhalte den gleichen Fehler, auch wenn ich den Befehl ordnungsgemäß hinzugefügt habe. Und wenn ich das unabhängige Docker-Image ohne Kubernetes-Bereitstellung teste, erhalte ich die Ausgabe. Es ist also kein Problem mit Dockerfile. Es hat etwas mit der Bereitstellung zu tun? Hier habe ich das gesamte Problem hinzugefügt, mit dem ich konfrontiert bin: stackoverflow.com/questions/56001352/… . Können Sie sich das bitte ansehen?
Jacob
1
Es gibt einen wirklich guten Blog, der ausführlich beschreibt, was ein CrashLoopBackoff bedeutet und in welchen verschiedenen Fällen dies passieren kann: managekube.com/kubernetes/pod/failure/crashloopbackoff/k8sbot/…
gar
46
kubectl -n <namespace-name> describe pod <pod name>

kubectl -n <namespace-name> logs -p  <pod name> 
user128364
quelle
46
Obwohl diese Befehle das Problem möglicherweise lösen (oder nicht lösen), sollte eine gute Antwort immer eine Erklärung enthalten, wie das Problem gelöst wird.
BDL
Der erste Befehl kubectl -n <namespace-name> describe pod <pod name>beschreibt Ihren Pod, mit dem Fehler bei der Pod-Erstellung und beim Ausführen des Pods wie Ressourcenmangel usw. angezeigt werden können. Mit dem zweiten Befehl werden kubectl -n <namespace-name> logs -p <pod name>die Protokolle der im Pod ausgeführten Anwendung angezeigt.
Iamabhishek
13

Ich musste einen Pod für nachfolgende kubectl exec- Aufrufe am Laufen halten, und wie die obigen Kommentare zeigten, wurde mein Pod von meinem k8s-Cluster getötet, weil er alle seine Aufgaben ausgeführt hatte. Ich habe es geschafft, meinen Pod am Laufen zu halten, indem ich einfach mit einem Befehl gegen den Pod getreten habe, der nicht automatisch gestoppt wurde, wie in:

kubectl run YOUR_POD_NAME -n YOUR_NAMESPACE --image SOME_PUBLIC_IMAGE:latest --command tailf /dev/null
hmacias
quelle
7
tailfhat bei mir nicht funktioniert, aber das hat funktioniert (unter Alpine Linux):--command /usr/bin/tail -- -f /dev/null
Jakub Holý
1
Es ist kein Pod-Name. Es ist der Bereitstellungsname. kubectl run <deployment name> -n <namespace> --image <image> --command tailf /dev/null
Gabriel Wu
8

Auf dieser Seite stirbt der Container, nachdem alles korrekt ausgeführt wurde, stürzt jedoch ab, da alle Befehle beendet wurden. Entweder stellen Sie Ihre Dienste in den Vordergrund oder Sie erstellen ein Keep-Alive-Skript. Auf diese Weise zeigt Kubernetes, dass Ihre Anwendung ausgeführt wird. Wir müssen beachten, dass Dockerdieses Problem in der Umgebung nicht auftritt. Nur Kubernetes möchte eine laufende App.

Update (ein Beispiel):

So vermeiden Sie CrashLoopBackOff beim Starten eines Netshoot- Containers:

kubectl run netshoot --image nicolaka/netshoot -- sleep infinity
Julien Nyambal
quelle
7

Wenn Sie eine Anwendung haben, deren Bootstrap langsamer dauert, kann dies mit den Anfangswerten der Bereitschafts- / Lebendigkeitssonden zusammenhängen. Ich habe mein Problem gelöst, indem ich den Wert initialDelaySecondsauf 120 Sekunden erhöht habe , da meine SpringBootAnwendung viel Initialisierung erfordert. In der Dokumentation wird die Standardeinstellung 0 nicht erwähnt ( 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

Eine sehr gute Erklärung über diesen Werten ist gegeben durch Was ist der Standardwert von initialDelaySeconds .

Der Algorithmus zur Überprüfung des Zustands oder der Bereitschaft funktioniert wie folgt:

  1. warten auf initialDelaySeconds
  2. Führen Sie eine Überprüfung durch und warten Sie timeoutSecondsauf eine Zeitüberschreitung, wenn die Anzahl der fortgesetzten Erfolge größer ist als die Anzahl der successThresholdzurückgegebenen Erfolge
  3. Wenn die Anzahl der fortgesetzten Fehler größer ist als der failureThresholdRückgabefehler, warten Sie andernfalls periodSecondsund starten Sie eine neue Prüfung

In meinem Fall kann meine Anwendung jetzt auf sehr klare Weise booten, sodass ich weiß, dass ich kein periodisches Crashloopbackoff bekomme, da es manchmal an der Grenze dieser Raten liegt.

Marcello de Sales
quelle
Du hast mir viele Stunden gespart! Danke dir. Meine Sondenzeit betrug 90s und es würde nicht einmal den Pod starten lassen.
Abhinav Pandey
6

Mein Pod stürzte immer wieder ab und ich konnte die Ursache nicht finden. Glücklicherweise gibt es einen Bereich, in dem kubernetes alle Ereignisse speichert, die vor dem Absturz meines Pods aufgetreten sind .
(#List Events sortiert nach Zeitstempel)

Um diese Ereignisse anzuzeigen, führen Sie den folgenden Befehl aus:

kubectl get events --sort-by=.metadata.creationTimestamp

Stellen Sie sicher, dass Sie --namespace mynamespacedem Befehl bei Bedarf ein Argument hinzufügen

Die in der Ausgabe des Befehls angezeigten Ereignisse zeigten, warum mein Pod immer wieder abstürzte.

Matyas
quelle
Vielen Dank! Mit diesem Tipp konnte ich feststellen, dass beim geheimen Mounten des Volumes ein Problem aufgetreten ist.
Leif John
Außerdem konnte ich feststellen, dass die zugewiesene verwaltete Identität auf dem Pod nicht korrekt war.
Jorn.Beyers
2

Fügen Sie in Ihrer yaml-Datei Befehls- und Argumentzeilen hinzu:

...
containers:
      - name: api
        image: localhost:5000/image-name 
        command: [ "sleep" ]
        args: [ "infinity" ]
...

Funktioniert bei mir.

Marcela Romero
quelle
0

In meinem Fall war das Problem das, was Steve S. erwähnte:

Der Pod stürzt ab, weil er startet und sofort beendet wird. Kubernetes startet neu und der Zyklus wird fortgesetzt.

Ich hatte nämlich eine Java-Anwendung, maindie eine Ausnahme ausgelöst hat (und etwas hat den standardmäßigen nicht erfassten Ausnahmebehandler überschrieben, sodass nichts protokolliert wurde). Die Lösung war , den Körper bringen von mainintry { ... } catch die Ausnahme einzufügen und auszudrucken. So konnte ich herausfinden, was los war und es beheben.

(Eine andere Ursache könnte ein App-Aufruf sein System.exit. Sie können eine benutzerdefinierte Funktion SecurityManagermit einem überschriebenen verwenden checkExit, um das Beenden zu verhindern (oder den Anrufer zu protokollieren). Siehe https://stackoverflow.com/a/5401319/204205 .)

Jakub Holý
quelle
0

Bei der Fehlerbehebung des gleichen Problems habe ich bei der Verwendung keine Protokolle gefunden kubeclt logs <pod_id> . Daher habe ich mich an die Knoteninstanz gewandt, um zu versuchen, den Container mit einem einfachen Docker auszuführen. Zu meiner Überraschung schlug dies ebenfalls fehl.

Beim Betreten des Containers mit:

docker exec -it faulty:latest /bin/sh

und beim Stöbern stellte ich fest, dass es nicht die neueste Version war.

Auf der Instanz war bereits eine fehlerhafte Version des Docker-Images verfügbar.

Als ich die fehlerhafte: letzte Instanz mit entfernt habe:

docker rmi faulty:latest

alles fing an zu arbeiten.

Javabeangrinder
quelle
0

Ich habe dieses Problem gelöst und die Speicherressource erhöht

  resources:
          limits:
            cpu: 1
            memory: 1Gi
          requests:
            cpu: 100m
        memory: 250Mi 
Yosra ADDALI
quelle
0

Versuchen Sie, den Pod erneut auszuführen und auszuführen

 kubectl get pods --watch

um den Status des Pods im Verlauf zu verfolgen.

In meinem Fall würde ich nur das Endergebnis "CrashLoopBackOff" sehen, aber der Docker-Container lief lokal einwandfrei. Also habe ich die Pods mit dem obigen Befehl beobachtet und gesehen, wie der Container kurz in einen OOMKilled-Zustand überging , was für mich bedeutete, dass mehr Speicher benötigt wurde.

Josh Wolff
quelle
0

Ich habe das gleiche Problem beobachtet und den Befehls- und Argumentblock in der yaml-Datei hinzugefügt. Ich kopiere ein Beispiel meiner Yaml-Datei als Referenz

 apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: ubuntu
      name: ubuntu
      namespace: default
    spec:
      containers:
      - image: gcr.io/ow/hellokubernetes/ubuntu
        imagePullPolicy: Never
        name: ubuntu
        resources:
          requests:
            cpu: 100m
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo hello; sleep 10;done"]
      dnsPolicy: ClusterFirst
      enableServiceLinks: true
amit23comp
quelle
0

Ich habe dieses Problem gelöst, indem ich Leerzeichen zwischen Anführungszeichen und Befehlswert innerhalb des Arrays entfernt habe. Dies ist passiert, weil der Container nach dem Start beendet wurde und kein ausführbarer Befehl vorhanden ist, der innerhalb des Containers ausgeführt werden soll.

['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
arjun a
quelle