Top 10 logowanie Dockera gotchas każdy użytkownik Dockera powinien wiedzieć

jednym z pierwszych poleceń użytkowników Dockera po „uruchomieniu Dockera „jest” docker logs „— ale czy wiesz, że polecenie” Docker logs ” nie zawsze działa? To może brzmieć niesamowicie, ale to prawda. O przyczynach dowiemy się później.

Docker zmienił nie tylko sposób wdrażania aplikacji, ale także sposób zarządzania dziennikami. Zamiast zapisywać dzienniki do plików, kontenery zapisują dzienniki do konsoli (stdout/stderr), a Sterowniki Docker Logging przesyłają dzienniki do miejsca docelowego. Sprawdzenie problemów z Docker Github szybko pokazuje, że użytkownicy mają różne problemy podczas radzenia sobie z dziennikami Dockera.

Docker Logging drivers overview

Zarządzanie dziennikami za pomocą Dockera wydaje się trudne i wymaga głębszej wiedzy na temat implementacji sterowników Docker Logging oraz alternatyw, aby rozwiązać problemy zgłaszane przez użytkowników. Więc jakie są TOP 10 Docker logging gotchas, każdy użytkownik Docker powinien wiedzieć?

zacznijmy od przeglądu sterowników logowania Dockera i opcji wysyłania dzienników do scentralizowanych rozwiązań zarządzania dziennikami, takich jak Elastic Stack (dawny stos ELK) lub Sematext Cloud.

na początku Dockera dzienniki kontenerów były dostępne tylko za pośrednictwem zdalnego API Docker, tj. za pomocą polecenia „docker logs”i kilku zaawansowanych spedytorów dzienników. Później Docker wprowadził sterowniki rejestrowania jako wtyczki, aby otworzyć Docker do integracji z różnymi narzędziami do zarządzania dziennikami. Te sterowniki logowania są zaimplementowane jako wtyczki binarne w Demonie docker. Ostatnio Architektura wtyczek została rozszerzona, aby uruchamiać wtyczki rejestrujące jako zewnętrzne procesy, które mogą rejestrować się jako wtyczki i pobierać logi za pośrednictwem plików FIFO Linuksa. Obecnie sterowniki logowania dostarczane z plikami binarnymi Dockera są wtyczkami binarnymi, ale może to się zmienić w najbliższej przyszłości.

sterowniki Docker logging otrzymują dzienniki kontenerów i przesyłają je do zdalnych miejsc docelowych lub plików. Domyślny sterownik logowania to „JSON-file”. Przechowuje dzienniki kontenerów w formacie JSON na dysku lokalnym. Docker ma architekturę wtyczek do logowania sterowników, więc dostępne są wtyczki do narzędzi open source i komercyjnych:

  • Journald – przechowywanie logów kontenerów w dzienniku systemowym
  • sterownik Syslog – obsługa UDP, TCP, TLS
  • Fluentd – obsługa połączeń gniazd TCP lub Unix do fluentd
  • Splunk – przekazywanie HTTP/HTTPS do serwera Splunk
  • Gelf – przekazywanie logów UDP do Graylog2

aby uzyskać kompletne rozwiązanie do zarządzania logami, należy zaangażować dodatkowe narzędzia:

  • Log parser do logów struktury, zazwyczaj część nadawców logów (fluentd, rsyslog, logstash, logagent,…)
  • indeksowanie logów, wizualizacja i alerty:
    • Elasticsearch i Kibana (Elastic Stack, znany również jako ELK stack),
    • Splunk,
    • Logentries,
    • Loggly,
    • Sumologic,
    • Graylog OSS / Enterprise
    • Sematext Cloud / Enterprise
    • i wiele innych …

aby wysyłać logi do jednego z backendów, może być konieczne wybranie sterownika rejestrowania lub narzędzia do rejestrowania, które obsługuje wybrane rozwiązanie do zarządzania dziennikami. Jeśli Twoje narzędzie wymaga wejścia Syslog, możesz wybrać sterownik syslog.

1.Polecenie Docker logs działa tylko ze sterownikiem rejestrowania plików json

domyślny sterownik rejestrowania ” JSON-file „zapisuje dzienniki na dysk lokalny, A sterownik json-file jest jedynym, który działa równolegle z poleceniem” Docker logs”. Gdy tylko ktoś używa alternatywnych sterowników logowania, takich jak Syslog, Gelf lub Splunk, wywołania API Docker logs zaczynają zawodzić, a polecenie „Docker logs” pokazuje błąd raportowania ograniczeń zamiast wyświetlania dzienników na konsoli. Nie tylko polecenie Docker log nie powiedzie się, ale wiele innych narzędzi wykorzystujących Docker API dla dzienników, takich jak interfejsy użytkownika Docker, takie jak Portainer lub kontenery kolekcji dzienników, takie jak Logspout, nie jest w stanie pokazać dzienników kontenerów w tej sytuacji.

zobacz ten problem.

sterownik Docker syslog może blokować wdrażanie kontenerów i tracić dzienniki, gdy serwer Syslog nie jest dostępny

używanie sterownika Docker syslog z TCP lub TLS jest niezawodnym sposobem dostarczania dzienników. Jednak sterownik logowania Syslog wymaga nawiązania połączenia TCP z serwerem syslog podczas uruchamiania kontenera. Jeśli tego połączenia nie można nawiązać podczas uruchamiania kontenera, uruchomienie kontenera nie powiedzie się z Komunikatem o błędzie, takim jak

docker: error response from daemon: Failed to initialize logging driver: dial TCP

oznacza to, że tymczasowy problem z siecią lub wysokie opóźnienie sieci może zablokować wdrażanie kontenerów. Ponadto ponowne uruchomienie serwera Syslog może spowodować usunięcie wszystkich kontenerów rejestrujących się przez TCP / TS do centralnego serwera Syslog, czego zdecydowanie należy unikać.

zobacz ten problem.

3. Sterownik Docker syslog traci logi, gdy miejsce docelowe jest niedostępne

podobnie jak w przypadku powyższego problemu, przyczyną utraty dzienników jest brak możliwości buforowania dzienników na dysku przez sterowniki Docker logging, gdy nie można ich dostarczyć do zdalnych miejsc docelowych. Oto ciekawy temat do obejrzenia.

4. Sterowniki Docker logging nie obsługują dzienników wieloliniowych, takich jak śledzenie stosu błędów

kiedy mówimy o dziennikach, większość ludzi myśli o prostych dziennikach jednoliniowych, powiedzmy jak dzienniki nginx lub Apache. Jednak dzienniki mogą również obejmować wiele linii. Na przykład ślady WYJĄTKÓW zazwyczaj obejmują wiele linii, więc aby pomóc użytkownikom Logstash, podzieliliśmy się sposobem obsługi śladów stosu za pomocą Logstash.

nie jest lepiej w świecie kontenerów, gdzie sprawy stają się jeszcze bardziej skomplikowane, ponieważ dzienniki ze wszystkich aplikacji działających w kontenerach są wysyłane do tego samego wyjścia – stdout. Nic dziwnego, widząc numer # 22920 zamknięty z „Zamknięte. Nie obchodzi mnie to.”rozczarowałem tak wielu ludzi. Na szczęście istnieją narzędzia, takie jak Sematext Docker Agent, które mogą analizować logi Wielowierszowe po wyjęciu z pudełka, a także stosować niestandardowe wzorce Wielowierszowe.

polecenie dzienniki usługi Docker zawiesza się z innym sterownikiem rejestrowania json

podczas gdy sterownik plików json wydaje się solidny, inne sterowniki dziennika mogą niestety nadal powodować problemy z trybem Docker Swarm. Zobacz ten problem z GitHub.

Demon Dockera zawiesza się, jeśli Demon fluentd zniknął, a bufor jest pełny

inny scenariusz, w którym sterownik rejestrujący powoduje problemy, gdy zdalne miejsce docelowe nie jest osiągalne — w tym konkretnym przypadku, sterowniki rejestrujące wyrzucają wyjątki, które powodują awarię demona Dockera.

kontener Docker utknie w stanie utworzonym w przypadku awarii sterownika Splunk

jeśli serwer Splunk zwróci 504 podczas uruchamiania kontenera, kontener zostanie uruchomiony, ale docker zgłosi, że kontener nie powiódł się. Po przejściu w ten stan kontener nie jest już wyświetlany w Docker ps, a proces kontenera nie może zostać zatrzymany za pomocą Docker kill. Jedynym sposobem, aby zatrzymać proces jest ręcznie go zabić.

zobacz ten problem.

dzienniki Dockera pomijanie/brakowanie dzienników aplikacji (sterownik journald)

okazuje się, że ten problem jest spowodowany limitami prędkości journalda, które należy zwiększyć, ponieważ Docker tworzy dzienniki dla wszystkich uruchomionych aplikacji, a journald może pominąć niektóre dzienniki ze względu na ustawienia ograniczenia prędkości. Należy więc pamiętać o ustawieniach journald po podłączeniu do niego Dockera.

problemy ze sterownikiem Gelf

sterownikowi logowania Gelf brakuje opcji TCP lub TLS i obsługuje tylko UDP, co może być ryzykowne, aby stracić wiadomości dziennika, gdy pakiety UDP zostaną usunięte. Niektóre problemy zgłaszają problem z rozdzielczością/buforowaniem DNS ze sterownikami GELF, więc logi mogą być wysyłane do” Nirvany”, gdy zmieni się IP serwera Graylog — a to może się zdarzyć szybko za pomocą wdrożeń kontenerów.

Docker nie obsługuje wielu sterowników dziennika

dobrze byłoby mieć logi przechowywane lokalnie na serwerze i możliwość wysyłania ich na zdalne serwery. Obecnie Docker nie obsługuje wielu sterowników dziennika, więc użytkownicy są zmuszeni wybrać jeden sterownik dziennika. Niełatwa decyzja znając różne kwestie wymienione w tym poście.

to jest to! To są moje top 10 Docker Logging Gotchas!

Zobacz także: ciągłe dostarczanie sterowników Jenkins & zabezpieczenia Dockera: plusy, minusy i aktualizacja stanu

alternatywy dla sterowników Docker Log

przy tak wielu problemach związanych ze sterownikami Docker Log, czy istnieją alternatywy? Okazuje się, że są-Docker API oparte spedytorów dziennika na ratunek!na ratunek.

oto kilka dobrych powodów, aby spojrzeć na takie alternatywy:

  1. sterownik plików Json jest domyślny i niezawodny, lokalna kopia dzienników jest zawsze dostępna, a „dzienniki Dockera” i API Dockera wywołują dzienniki po prostu działają.
  2. możliwość filtrowania dzienników według różnych dynamicznych kryteriów, takich jak nazwa obrazu lub etykiety
  3. lepsze metadane, mając pełny dostęp do interfejsu API Dockera
  4. brak ryzyka awarii demona Dockera, ponieważ tacy nadawcy dzienników mogą działać w kontenerze o ograniczonym zużyciu zasobów i miejsca na dysku (np. umieść katalog bufora w woluminie i ustaw użyteczne limity)

przyjrzyjmy się dwóm zalecanym narzędziom do zbierania logów opartym na Docker API: Logspout i Sematext Docker Agent. Oba są open source.

należy pamiętać, że trzecim narzędziem, które pasuje mniej więcej do tej kategorii jest Elastic Filebeat. Filebeat zbiera pliki dziennika, generowane przez sterownik dziennika JSON-file tylko wzbogacanie metadanych kontenera odbywa się za pomocą wywołań API Docker.

Logspout zapewnia wiele wyjść i może kierować dzienniki z różnych kontenerów do różnych miejsc docelowych bez zmiany ustawień logowania kontenerów aplikacji. Obsługuje sekwencje Escape ANSI (jak kody kolorów w logach), co może być problematyczne dla wyszukiwania pełnotekstowego w Elasticsearch.

podobnie jak Logspout, Sematext Docker Agent (SDA) jest oparty na API, obsługuje routing dziennika i obsługuje sekwencje specjalne ANSI do wyszukiwania pełnotekstowego. Jednak Sematext Docker Agent jest czymś więcej niż tylko zwykłym nadawcą logów.

SDA zajmuje się wieloma problemami poruszanymi przez użytkowników Dockera, takimi jak wieloliniowe dzienniki, wykrywanie formatów dziennika i parsowanie dziennika, kompletne kontenery wzbogacania metadanych (etykiety, GeoIP, Swarm i metadane specyficzne dla Kubernetes), buforowanie dysków i niezawodna wysyłka przez TLS. Jest open source na Github, może być używany z elastycznym stosem lub chmurą Sematext i może zbierać nie tylko dzienniki kontenerów, ale także zdarzenia kontenerów, a także metryki hosta Dockera i kontenera.

różnice między trzema rozwiązaniami logowania, które działają dobrze ze sterownikiem plików json i zdalnym API Docker

zalecenie

jasne zalecenie dla rejestratorów opartych na API może się zmienić w przyszłości, ponieważ sterowniki dziennika Dockera poprawiają się z czasem, a nowy mechanizm wtyczek poprzez gniazdo Unix pozwala nowym implementacjom sterowników logowania uruchamiać się jako oddzielne procesy. Ta funkcja naprawdę poprawia architekturę wtyczek Dockera i jest dobrym znakiem, że Docker poważnie traktuje problemy z rejestrowaniem.

w międzyczasie rozważ kolektory logów oparte na Docker API, takie jak Sematext Docker Agent i Logspout, aby uniknąć problemów z dziennikami Dockera, takich jak opisane tutaj 10 gotchas.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.