Ich versuche jetzt, einen einfachen Container mit Shell (/ bin / bash) auf einem Kubernetes-Cluster auszuführen.
Ich dachte, dass es eine Möglichkeit gibt, einen Container auf einem Docker-Container laufen zu lassen, indem ich die pseudo-tty
Option ( -td
Option auf docker run
Befehl) verwende und entferne .
Beispielsweise,
$ sudo docker run -td ubuntu:latest
Gibt es eine solche Option in Kubernetes?
Ich habe versucht, einen Container mit einem kubectl run-container
Befehl wie dem folgenden auszuführen:
kubectl run-container test_container ubuntu:latest --replicas=1
Der Container wird jedoch für einige Sekunden beendet (genau wie beim Starten mit dem docker run
Befehl ohne die oben genannten Optionen). Und ReplicationController startet es wiederholt.
Gibt es eine Möglichkeit, einen Container auf Kubernetes wie die -td
Optionen im docker run
Befehl laufen zu lassen ?
quelle
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Antworten:
Ein Container wird beendet, wenn sein Hauptprozess beendet wird. So etwas tun wie:
Den Container offen zu halten ist offen gesagt ein Hack, der nur für schnelle Tests und Beispiele verwendet werden sollte. Wenn Sie nur einen Container zum Testen für ein paar Minuten benötigen, würde ich Folgendes tun:
Dies hat den Vorteil, dass der Container automatisch verlassen wird, wenn Sie ihn vergessen. Alternativ können Sie so etwas in eine
while
Schleife einfügen, damit es für immer läuft, oder einfach eine Anwendung wie ztop
. All dies sollte in Kubernetes einfach zu tun sein.Die eigentliche Frage ist, warum Sie dies tun möchten. Ihr Container sollte einen Dienst bereitstellen, dessen Prozess den Container im Hintergrund laufen lässt.
quelle
cat
ohne Argumentetop
undsleep
mit Argumenten von großer Anzahl zu laufen .sleep infinity
funktioniert in vielen Fällen (nicht Busybox)Container sollen vollständig ausgeführt werden. Sie müssen Ihrem Container eine Aufgabe zur Verfügung stellen, die niemals abgeschlossen wird. So etwas sollte funktionieren:
quelle
ubuntu
und versuchtebash
Bild kann aber nicht an der Arbeit. Irgendeine Idee, wie man dasselbe mit dembash
Bild macht?Sie können dieses CMD verwenden in
Dockerfile
:Dadurch bleibt Ihr Container am Leben, bis er zum Anhalten aufgefordert wird. Wenn Sie Trap und Wait verwenden, reagiert Ihr Container sofort auf eine Stoppanforderung . Ohne Trap / Wait dauert das Anhalten einige Sekunden.
Bei Busybox-basierten Bildern (die in alpinen Bildern verwendet werden) kennt der Schlaf das Unendlichkeitsargument nicht. Mit dieser Problemumgehung erhalten Sie die gleiche sofortige Antwort auf ein Problem
docker stop
wie im obigen Beispiel:quelle
Verwenden Sie in Ihrer Docker-Datei diesen Befehl:
Erstellen Sie Ihr Docker-Image.
quelle
Um einen POD am Laufen zu halten, sollte der POD eine bestimmte Aufgabe ausführen, andernfalls wird er von Kubernetes als unnötig angesehen und daher beendet. Es gibt viele Möglichkeiten, einen POD am Laufen zu halten.
Ich hatte ähnliche Probleme, als ich einen POD brauchte, um ununterbrochen zu laufen, ohne etwas zu tun. Die folgenden zwei Methoden haben für mich funktioniert:
Obwohl die erste Option einfacher als die zweite ist und möglicherweise die Anforderung erfüllt, ist sie nicht die beste Option. Es gibt eine Begrenzung für die Anzahl der Sekunden, die Sie im Schlafbefehl zuweisen möchten. Ein Container mit einer darin laufenden Endlosschleife wird jedoch nie verlassen.
Ich werde jedoch beide Möglichkeiten beschreiben (wenn Sie den Busybox-Container ausführen):
1. Schlafbefehl
2. Endlosschleife
Führen Sie den folgenden Befehl aus, um den Pod auszuführen:
Ich hoffe es hilft!
quelle
Ich konnte dies mit dem Befehl
sleep infinity
in Kubernetes zum Laufen bringen, der den Container offen hält. In dieser Antwort finden Sie Alternativen, wenn dies nicht funktioniert.quelle
sleep infinity
Hält den Container offen und bietet die gleiche Art von Funktionalität, nach der die Frage fragt (für die meisten Containertypen). Es bietet auch einen Link zu Alternativen für Fälle, in denen dieser bestimmte Befehl nicht funktioniertDer einfachste Befehl für k8s pod manifest, Container für immer auszuführen:
quelle
Verwenden Sie diesen Befehl in Ihrer Docker-Datei, um den Container in Ihrem K8s-Cluster am Laufen zu halten:
quelle
In meinem Fall konnte ein Pod mit einem initContainer nicht initialisiert werden. Laufen
docker ps -a
unddocker logs exited-container-id-here
gab mir dann eine Protokollmeldung, diekubectl logs podname
nicht angezeigt wurde. Geheimnis gelüftet :-)quelle
Es gibt viele verschiedene Möglichkeiten, dies zu erreichen, aber eine der elegantesten ist:
quelle
Meine wenigen Cent zu diesem Thema. Angenommen, dies
kubectl
funktioniert, dann wäre der nächste Befehl, der dem Docker-Befehl entspricht, den Sie in Ihrer Frage erwähnt haben, ungefähr so.Obige Befehl wird ein einzelnes erstellen
Pod
indefault
Namespace und wird es ausführensleep
Befehlinfinity
Argument -einer Art und Weise erhalten Sie einen Prozess haben , dass läuft im Vordergrund zu halten Container am Leben.Nachwörtern, mit denen Sie interagieren können,
Pod
indem Sie denkubectl exec
Befehl ausführen.Diese Technik ist sehr nützlich zum Erstellen einer Pod-Ressource und zum Ad-hoc-Debuggen.
quelle
--restart=Never
, rufen Sie einfach ankubectl run ubuntu --image=ubuntu -- sleep infinity