2015-08-07 14 views
33

Ich versuche jetzt, einen einfachen Container mit Shell (/ bin/bash) auf Kubernetes Cluster auszuführen.Wie kann ich Container auf Kubernetes laufen lassen?

Ich dachte, dass es eine Möglichkeit gibt, Container auf Docker-Container mit Hilfe von Pseudo-Tty und Trennen-Option (-td Option auf docker run Befehl) ausgeführt werden.

Für Beispiel

$ sudo docker run -td ubuntu:latest

Gibt es eine Möglichkeit, wie dies in Kubernetes?

Ich habe wie

unter Verwendung kubectl run-container Befehl Container versucht mit

kubectl run-container test_container ubuntu:latest --replicas=1

aber Behälter verlässt in wenigen Sekunden (nur ohne Optionen mit docker run Befehl wie Start ich oben erwähnt.) Und ReplicationController es startet wieder wiederholt .

Gibt es eine Möglichkeit, Container auf Kubernetes wie -td Optionen in docker run Befehl ausgeführt zu halten?

+0

Dieses Bild (wie [Kubernetes docs] (https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#dns) suggeriert) ist ziemlich praktisch: ' kubectl run curl --image = radial/busyboxplus: curl -i --tty' –

Antwort

18

Ein Container wird beendet, wenn der Hauptprozess beendet wird. Doing so etwas wie:

docker run -itd debian 

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 Behälter für die Prüfung für ein paar Minuten wollen, würde ich tun:

docker run -d debian sleep 300 

was den Vorteil hat, dass der Behälter wird automatisch beendet, wenn Sie es vergessen. Alternativ könnten Sie etwas in eine while-Schleife einfügen, um es für immer laufen zu lassen, oder einfach eine Anwendung wie top ausführen. All dies sollte in Kubernetes leicht zu machen sein.

Die eigentliche Frage ist, warum möchten Sie das tun? Ihr Container sollte einen Dienst bereitstellen, dessen Prozess den Container im Hintergrund laufen lässt.

+0

Vielen Dank für Ihre Antwort. Ich versuche nun das Verhalten von Containern zu verstehen, wobei Dutzende von Containern gleichzeitig laufen. Eine Endlosschleife und andere schwere Befehle verhindern, dass ich weiß, wie sich Container verhalten. Das ist der Grund, warum ich einfache Container wie nur running/bin/bash brauche. – springwell

+0

Für jetzt werde ich versuchen, 'cat' ohne Argumente und' top' und 'sleep' mit Argument von großer Zahl zu laufen. – springwell

+7

'sleep infinity' funktioniert in vielen Fällen (nicht busybox) – rwilson04

5

Ich konnte dies mit dem Befehl sleep infinity in Kubernetes, die den Container geöffnet zu erhalten. Alternativen finden Sie unter this answer, wenn das nicht funktioniert.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/11368189) – Will

+1

@Will Sicher es tut. '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, wenn dieser bestimmte Befehl nicht funktioniert – rwilson04

+0

Dies war von der Überprüfung. Wenn Sie der Antwort den Kommentartext hinzufügen, dann ist das eine qualitative Antwort :) Mein anfängliches Flag/Commend basierte auf der Aussage, dass Ihr Kommentar nicht erfolgreich war, was mich zu der Annahme brachte, dass dies ein Kommentar sein sollte. Eine schnelle Bearbeitung und Upvoted hinzugefügt. – Will

32

Sie könnten diese CMD in Ihrem Dockerfile verwenden:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait" 

Dieser Ihre Container am Leben halten, bis sie erzählt wird, zu stoppen. Wenn Sie trap and wait verwenden, wird Ihr Container sofort auf eine Stoppanforderung reagieren. Ohne Trap/Wait Stop dauert ein paar Sekunden.

+0

Ich verwende das gleiche auf Kubernetes Bereitstellung Yaml für Debugging-Zwecke – sdkks

18

Container sollen vollständig ausgeführt werden. Sie müssen Ihrem Container eine Aufgabe zuweisen, die niemals abgeschlossen wird.So etwas sollte funktionieren:

apiVersion: v1 
kind: Pod 
metadata: 
    name: ubuntu 
spec: 
    containers: 
    - name: ubuntu 
    image: ubuntu:latest 
    # Just spin & wait forever 
    command: [ "/bin/bash", "-c", "--" ] 
    args: [ "while true; do sleep 30; done;" ] 
+0

Arbeitete wie ein Charme, danke – SergeyB

5
  1. In Ihrem Dockerfile diesen Befehl verwenden:

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. Bauen Sie Ihr Docker Bild.

  3. Schieben Sie es zu Ihrem Cluster oder ähnlichem, nur um sicherzustellen, dass das Bild verfügbar ist.
  4. kubectl run debug-container -it --image=<your-image>
0

In meinem Fall eine Hülse mit einem initContainer konnte nicht initialisiert werden. Running docker ps -a und dann docker logs exited-container-id-here gab mir eine Protokollmeldung, die kubectl logs podname nicht angezeigt wurde. Rätsel gelöst :-)