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?
kubernetes
Luzifer
quelle
quelle
kubectl logs -f <pod_name>
damit könnte das Startproblem (Server / Container) sein.kubectl get events
zu sehen, was die Quetschschleife verursacht.Antworten:
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.
quelle
quelle
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 werdenkubectl -n <namespace-name> logs -p <pod name>
die Protokolle der im Pod ausgeführten Anwendung angezeigt.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:
quelle
tailf
hat bei mir nicht funktioniert, aber das hat funktioniert (unter Alpine Linux):--command /usr/bin/tail -- -f /dev/null
kubectl run <deployment name> -n <namespace> --image <image> --command tailf /dev/null
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
Docker
dieses 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:
quelle
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
initialDelaySeconds
auf 120 Sekunden erhöht habe , da meineSpringBoot
Anwendung viel Initialisierung erfordert. In der Dokumentation wird die Standardeinstellung 0 nicht erwähnt ( https://kubernetes.io/docs/api-reference/v1.9/#probe-v1-core ).Eine sehr gute Erklärung über diesen Werten ist gegeben durch Was ist der Standardwert von initialDelaySeconds .
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.
quelle
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:
Stellen Sie sicher, dass Sie
--namespace mynamespace
dem Befehl bei Bedarf ein Argument hinzufügenDie in der Ausgabe des Befehls angezeigten Ereignisse zeigten, warum mein Pod immer wieder abstürzte.
quelle
Fügen Sie in Ihrer yaml-Datei Befehls- und Argumentzeilen hinzu:
Funktioniert bei mir.
quelle
In meinem Fall war das Problem das, was Steve S. erwähnte:
Ich hatte nämlich eine Java-Anwendung,
main
die 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 vonmain
intry { ... } 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 FunktionSecurityManager
mit einem überschriebenen verwendencheckExit
, um das Beenden zu verhindern (oder den Anrufer zu protokollieren). Siehe https://stackoverflow.com/a/5401319/204205 .)quelle
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:
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:
alles fing an zu arbeiten.
quelle
Ich habe dieses Problem gelöst und die Speicherressource erhöht
quelle
Ich hatte das gleiche Problem und jetzt habe ich es endlich gelöst. Ich verwende keine Docker-Compose-Datei. Ich habe diese Zeile gerade in meine Docker-Datei eingefügt und es hat funktioniert.
Referenz: https://github.com/GoogleContainerTools/skaffold/issues/3882
quelle
Versuchen Sie, den Pod erneut auszuführen und auszuführen
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.
quelle
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
quelle
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.
quelle