Teraz próbuję uruchomić prosty kontener z powłoką (/ bin / bash) w klastrze Kubernetes.
Pomyślałem, że istnieje sposób na utrzymanie kontenera działającego na kontenerze Dockera za pomocą pseudo-tty
opcji i odłączania ( -td
opcja na docker run
polecenie).
Na przykład,
$ sudo docker run -td ubuntu:latest
Czy jest taka opcja w Kubernetes?
Próbowałem uruchomić kontener za pomocą kubectl run-container
polecenia takiego jak:
kubectl run-container test_container ubuntu:latest --replicas=1
Ale kontener wychodzi na kilka sekund (podobnie jak uruchomienie docker run
komendą bez opcji, o których wspomniałem powyżej). ReplicationController uruchamia go ponownie wielokrotnie.
Czy istnieje sposób, aby kontener działał na Kubernetes, tak jak -td
opcje w docker run
poleceniu?
docker
containers
kubernetes
google-kubernetes-engine
Springwell
źródło
źródło
kubectl run curl --image=radial/busyboxplus:curl -i --tty
Odpowiedzi:
Kontener kończy pracę, gdy kończy się jego główny proces. Robię coś takiego:
trzymanie kontenera otwarte to szczerze mówiąc hack, którego należy używać tylko do szybkich testów i przykładów. Jeśli potrzebujesz pojemnika do testowania przez kilka minut, zrobiłbym:
Co ma tę zaletę, że pojemnik automatycznie wyjdzie, jeśli o nim zapomnisz. Alternatywnie możesz umieścić coś takiego w
while
pętli, aby działało na zawsze, lub po prostu uruchomić aplikację, taką jaktop
. Wszystko to powinno być łatwe do zrobienia w Kubernetes.Prawdziwe pytanie brzmi: dlaczego chcesz to zrobić? Twój kontener powinien zapewniać usługę, której proces będzie utrzymywał kontener działający w tle.
źródło
cat
bez argumentów itop
orazsleep
z argumentem dużej liczbie.sleep infinity
działa w wielu przypadkach (nie busybox)Kontenery mają biegać do końca. Musisz zapewnić swojemu kontenerowi zadanie, które nigdy się nie zakończy. Coś takiego powinno działać:
źródło
ubuntu
i wypróbowałembash
obraz, ale nie mogłem go uruchomić. Masz jakiś pomysł, jak zrobić to samo zbash
obrazem?{"name": "util", "image": "alpine", "command": [ "/bin/sh", "-c", "--" ], "args": [ "while true; do sleep 30; done;" ]}
(tylko json, ponieważ yaml nie zostanie sformatowany w komentarzach). Ważnym bitem jest/bin/sh
zamiast/bin/bash
.Możesz użyć tego CMD w
Dockerfile
:Utrzyma to pojemnik przy życiu, dopóki nie zostanie nakazany, aby się zatrzymać. Użycie pułapki i czekania spowoduje, że kontener natychmiast zareaguje na żądanie zatrzymania . Bez pułapki / oczekiwania zatrzymanie zajmie kilka sekund.
W przypadku obrazów opartych na busybox (używanych w obrazach alpejskich) sen nie zna argumentu nieskończoności. To obejście daje taką samą natychmiastową odpowiedź na
docker stop
podobne w powyższym przykładzie:źródło
W swoim pliku Dockerfile użyj tego polecenia:
Zbuduj swój obraz Dockera.
źródło
Aby POD działał, powinien wykonywać określone zadanie, w przeciwnym razie Kubernetes uzna go za niepotrzebny i dlatego się zatrzymuje. Istnieje wiele sposobów utrzymywania działania POD.
Napotkałem podobne problemy, gdy potrzebowałem POD-a tylko do ciągłego działania bez wykonywania żadnej użytecznej operacji. Oto dwa sposoby, w jakie to zadziałało:
Chociaż pierwsza opcja jest łatwiejsza niż druga i może wystarczyć, nie jest to najlepsza opcja. Ponieważ istnieje ograniczenie co do liczby sekund, które zamierzasz przypisać w poleceniu uśpienia. Ale kontener z nieskończoną pętlą biegnącą w środku nigdy nie jest zamykany.
Jednak opiszę oba sposoby (biorąc pod uwagę, że korzystasz z kontenera busybox):
1. Polecenie uśpienia
2. Nieskończona pętla
Uruchom następujące polecenie, aby uruchomić pod:
Mam nadzieję, że to pomoże!
źródło
Udało mi się zmusić to do pracy za pomocą polecenia
sleep infinity
w Kubernetes, które utrzyma kontener otwarty. Zapoznaj się z tą odpowiedzią, aby poznać alternatywne rozwiązania, gdy to nie działa.źródło
sleep infinity
utrzymuje kontener otwarty, zapewniając ten sam typ funkcjonalności, o jaki pyta pytanie (dla większości typów kontenerów). Zawiera również link do alternatyw dla przypadków, gdy to konkretne polecenie nie działaNajprostsze polecenie, jakie może być dla manifestu pod K8s, aby uruchamiać kontener na zawsze:
źródło
Użyj tego polecenia wewnątrz pliku Dockerfile, aby utrzymać działanie kontenera w klastrze K8s:
źródło
W moim przypadku inicjalizacja poda z initContainer nie powiodła się. Uruchomiony,
docker ps -a
a następniedocker logs exited-container-id-here
dał mi komunikat dziennika, którykubectl logs podname
nie został wyświetlony. Zagadka rozwiązana :-)źródło
Można to osiągnąć na wiele różnych sposobów, ale jednym z najbardziej eleganckich jest:
źródło
Moje kilka centów w tej sprawie. Zakładając, że
kubectl
działa, najbliższe polecenie, które byłoby równoważne z poleceniem dockera, o którym wspomniałeś w swoim pytaniu, byłoby mniej więcej takie.Powyższe polecenie utworzy pojedynczy
Pod
wdefault
przestrzeni nazw i wykonasleep
polecenie zinfinity
argumentem - w ten sposób będziesz miał proces działający na pierwszym planie, utrzymując kontener przy życiu.Afterwords możesz wchodzić w interakcje
Pod
, uruchamiająckubectl exec
polecenie.Ta technika jest bardzo przydatna do tworzenia zasobu Poda i debugowania ad-hoc.
źródło
--restart=Never
, po prostu zadzwońkubectl run ubuntu --image=ubuntu -- sleep infinity