Jak uzyskać dzienniki ze wszystkich podów kontrolera replikacji Kubernetes?

123

Uruchomienie kubectl logspokazuje mi stderr / stdout jednego kontenera Kubernetes.

Jak mogę uzyskać zagregowane stderr / stdout zestawu podów, najlepiej tych utworzonych przez określony kontroler replikacji?

Torsten Bronger
źródło
pamiętaj, że nie ustawienie argumentu tail podczas korzystania z selektora spowoduje domyślną długość każdego dziennika strąka na 10 linii
chachan

Odpowiedzi:

176

Możesz używać etykiet

kubectl logs -l app=elasticsearch
Adrian Ng
źródło
21
Dobre rozwiązanie i najprawdopodobniej wystarczające do udzielenia odpowiedzi na pierwotne pytanie, ale nie będzie to koniec: „błąd: dozwolony jest tylko jeden z następujących elementów: follow (-f) lub selector (-l)”.
Nestor Urquiza
3
Nie --all-namespaces.
Eric Walker
Jaka będzie kolejność tych dzienników? Mam na myśli, że jeśli jest wiele strąków, a każdy strąk będzie miał własne dzienniki. Jeśli więc wyświetlane są dzienniki ze wszystkich, to w jakiej kolejności będą wyświetlane i jak zidentyfikować moduł źródłowy w określonym wierszu dziennika?
Shubham
6
Wygląda na to, że działa to -fteraz (od Kubernetes 1.12+ / kubectl1.12+). Również @Shubham - wyświetla wiadomości w otrzymanej kolejności, nie ma tagów ani niczego w wierszach dziennika. Służy to tylko do szybkiego debugowania. Jeśli potrzebujesz więcej szczegółów dziennika, musisz wysłać swoje dzienniki do centralnego systemu rejestrowania, takiego jak EFK, SumoLogic, Datadog itp.
geerlingguy
1
Czy mimo wszystko można zrobić to samo za pomocą panelu Kubernetes.
mchawre
70

Stworzyłem mały skrypt basha o nazwie, kubetailktóry to umożliwia. Na przykład, aby dostosować wszystkie dzienniki dla podów o nazwie „app1”, możesz wykonać:

kubetail app1

Możesz znaleźć skrypt tutaj .

Johan
źródło
Zainstalowałem go z: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesszczegółową dokumentacją: kt -hNiesamowite!
Khalil Gharbaoui
Niesamowite. Mam kilka pytań. `` `` 1. Czy możemy śledzić dzienniki wielu podów należących do różnych wdrożeń? Coś w rodzaju „kt -l aplikacja = usługa1, aplikacja = usługa2”. 2. Jak zapisać je wszystkie do pliku? Robiąc to "kt -l app = service1` >> filename.log" zapisuje do niego tylko nazwy podów. 3. Czy ogranicza się to również w przypadku wdrożeń autoskalowania? ``
Vasudev
19

Możesz pobrać dzienniki z wielu kontenerów, używając etykiet, jak zasugerował Adrian Ng:

kubectl logs --selector app=yourappname

W przypadku, gdy masz kapsułę z wieloma kontenerami, powyższe polecenie zakończy się niepowodzeniem i będziesz musiał określić nazwę kontenera:

kubectl logs --selector app=yourappname --container yourcontainername

Uwaga: jeśli chcesz zobaczyć, które etykiety są dla Ciebie dostępne, poniższe polecenie wyświetli je wszystkie:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... gdzie wynik będzie wyglądał mniej więcej tak

map [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]

Pamiętaj, że niektóre etykiety mogą nie być udostępniane przez inne pody - wybranie „aplikacji” wydaje się najłatwiejsze

Jean Spector
źródło
13

Aby oprzeć się na poprzedniej odpowiedzi, jeśli dodasz -f, możesz dostosować dzienniki.

kubectl logs -f deployment/app
Ruben
źródło
10

Wcześniej dostępne rozwiązania nie są optymalne. Sam zespół kubernetes dostarczył jakiś czas temu rozwiązanie o nazwie stern.

stern app1

Dopasowuje również wyrażenia regularne i domyślnie wykonuje tail i -f (follow). Miłą zaletą jest to, że pokazuje on również kapsułę, która wygenerowała dziennik.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Pobierz plik binarny go-binary dla systemu Linux lub zainstaluj go przez brew dla OSX.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern

Wiedeń
źródło
6

Używam tego prostego skryptu, aby uzyskać dziennik z podów wdrożenia:

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

Streszczenie scenariusza

Użycie: log_deployment.sh "nazwa-wdrożenia".

Skrypt wyświetli następnie dziennik wszystkich podów, które zaczynają się od tej „nazwy wdrożenia”.

Martlark
źródło
4

Możesz uzyskać pomoc od kubectl logs -hi według informacji,

kubectl logs -f deployment/myapp -c myapp --tail 100

-cto nazwa kontenera i --tailpokaże najnowsze wiersze num ,, ale spowoduje to wybranie jednego zasobnika wdrożenia, a nie wszystkich zasobników. Należy o tym pamiętać.

kubectl logs -l app=myapp -c myapp --tail 100

Jeśli chcesz wyświetlić dzienniki wszystkich podów, możesz użyć -li określić etykietę, ale jednocześnie -fnie będzie ona używana.

zimmer
źródło
3

Możesz to również zrobić za pomocą nazwy usługi.

Najpierw spróbuj znaleźć nazwę usługi odpowiedniego zasobnika, która odpowiada wielu zasobom tej samej usługi. kubectl get svc.

Następnie uruchom następujące polecenie, aby wyświetlić dzienniki z każdego kontenera.

kubectl logs -f service/<service-name>
Ostre
źródło
2

W tym przykładzie można zamienić <namespace>i, <app-name>aby uzyskać dzienniki, gdy w poda jest zdefiniowanych wiele kontenerów.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
Gokul Gunasekaran
źródło
1

Jeśli strąki mają znaczącą nazwę, można użyć prostego zwykłego starego uderzenia:

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

Objaśnienie: Zapętlaj przeglądanie uruchomionych podów o nazwie zawierającej „nodejs”. Śledź dziennik każdego z nich równolegle (pojedynczy znak ampersand działa w tle), upewniając się, że jeśli którykolwiek z podów zawiedzie, całe polecenie zostanie zakończone (podwójny znak ampersand). Połącz strumienie z każdego z poleceń ogona w unikalny strumień. Eval jest potrzebny do uruchomienia tego dynamicznie budowanego polecenia.

Nestor Urquiza
źródło
-1

Używam tego polecenia.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
Muhammad Naeem
źródło
1
Witaj! Chociaż to polecenie może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie spowodowałoby więcej głosów pozytywnych. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia.
Brian
-4

Nie jestem pewien, czy to nowa rzecz, ale w przypadku wdrożeń można to zrobić w następujący sposób:

kubectl logs deployment/app1
Rasmus Rømer
źródło
8
Kiedy otrzymujesz dzienniki przez wdrożenie, wybiera jeden z replikowanych podów (wybiera losowo), ale nie wszystkie.
Akhil Bojedla
Głosowanie w dół, ponieważ powoduje to wybranie tylko jednego poda
Maximilian