Uruchomienie kubectl logs
pokazuje mi stderr / stdout jednego kontenera Kubernetes.
Jak mogę uzyskać zagregowane stderr / stdout zestawu podów, najlepiej tych utworzonych przez określony kontroler replikacji?
Uruchomienie kubectl logs
pokazuje mi stderr / stdout jednego kontenera Kubernetes.
Jak mogę uzyskać zagregowane stderr / stdout zestawu podów, najlepiej tych utworzonych przez określony kontroler replikacji?
Odpowiedzi:
Możesz używać etykiet
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
teraz (od Kubernetes 1.12+ / kubectl
1.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.
Stworzyłem mały skrypt basha o nazwie, kubetail
któ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 .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
szczegółową dokumentacją: kt -h
Niesamowite!
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
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/
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
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”.
Jedną z opcji jest skonfigurowanie rejestrowania klastra za pośrednictwem Fluentd / ElasticSearch, jak opisano na https://kubernetes.io/docs/user-guide/logging/elasticsearch/ . Gdy logi są w ES, można łatwo zastosować filtry w Kibanie, aby wyświetlić logi z niektórych kontenerów.
Możesz uzyskać pomoc od kubectl logs -h
i według informacji,
kubectl logs -f deployment/myapp -c myapp --tail 100
-c
to nazwa kontenera i --tail
pokaż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ć -l
i określić etykietę, ale jednocześnie -f
nie będzie ona używana.
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>
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
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.
Używam tego polecenia.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
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