Top 10 Docker logging gotchas jokaisen Docker käyttäjän pitäisi tietää

yksi ensimmäisistä komennoista Docker käyttäjät oppivat jälkeen ”docker run” on ”docker lokit” — mutta tiesitkö, että ”docker lokit” komento ei aina toimi? Se voi kuulostaa uskomattomalta, mutta se on totta. Saamme lisätietoja syistä myöhemmin.

Docker muutti sovellusten käyttöönoton lisäksi myös lokinhallinnan työnkulkua. Sen sijaan, että lokit kirjoitettaisiin tiedostoihin, kontit kirjoittavat lokit konsolille (stdout/stderr) ja Docker Logging Drivers välittävät lokit määränpäähänsä. Tarkista vastaan Docker Github kysymyksiä nopeasti osoittaa, että käyttäjillä on erilaisia ongelmia käsiteltäessä Docker lokit.

Docker Logging Drivers overview

lokkien hallinta Docker-ohjaimella näyttää olevan hankalaa ja vaatii syvempää tietämystä Docker loging Driver-toteutuksista ja vaihtoehdoista ihmisten raportoimien ongelmien ratkaisemiseksi. Joten mitkä ovat top 10 Docker logging gotchas, jokaisen Docker käyttäjän pitäisi tietää?

aloitetaan yleiskatsauksella Telakointiohjaimista ja vaihtoehdoista lokien lähettämiseksi keskitettyihin Lokinhallintaratkaisuihin, kuten Elastic Stack (entinen ELK Stack) tai Sematext Cloud.

Dockerin alkuaikoina konttilokit olivat saatavilla vain Docker remote API: n kautta eli ”docker lokit” – komennolla ja muutamilla edistyneillä tukkilähettäjillä. Myöhemmin Docker esitteli logging driverit liitännäisinä, jolloin Docker avasi integraatiot erilaisilla lokinhallintatyökaluilla. Nämä kirjausajurit toteutetaan binäärilaajennuksina docker-taustaprosessissa. Äskettäin, plugin arkkitehtuuri sai laajennettu ajaa kirjaaminen plugins ulkoisina prosesseina, joka voisi rekisteröityä plugins ja hakea lokit kautta Linux FIFO tiedostoja. Tällä hetkellä docker-binääreillä toimitetut kirjautumisohjaimet ovat binäärisiä lisäosia, mutta tämä saattaa muuttua lähitulevaisuudessa.

satamatyöntekijät vastaanottavat konttilokit ja välittävät ne etäkohteisiin tai tiedostoihin. Oletuslokiajuri on ”json-tiedosto”. Se tallentaa kontti lokit JSON muodossa paikalliselle levylle. Docker on plugin arkkitehtuuri kirjaamisen ajurit, joten on olemassa liitännäisiä avoimen lähdekoodin työkaluja ja kaupallisia työkaluja saatavilla:

  • Journald – säilölokien säilyttäminen järjestelmälehdessä
  • Syslog Driver – supporting UDP, TCP, TLS
  • Fluentd – supporting TCP – tai Unix socket connections to fluentd
  • Splunk – HTTP/HTTPS forwarding to Splunk server
  • Gelf-UDP log forwarding to Graylog2

täydellinen lokinhallintaratkaisu edellyttää lisätyökaluja:

  • log jäsennin rakennelokkeihin, tyypillisesti osa tukkien lähettäjiä (fluentd, rsyslog, logstash, logagent, …)
  • Log indeksointi, visualisointi ja hälytys:
    • Elasticsearch and Kibana (Elastic Stack, tunnetaan myös nimellä ELK stack),
    • Splunk,
    • Logentries,
    • Loggly,
    • Sumologic,
    • Graylog OSS / Enterprise
    • Sematext Cloud / yritys
    • ja paljon muuta …

jos haluat lähettää lokit johonkin taustajärjestelmään, sinun on ehkä valittava lokiohjain tai kirjaustyökalu, joka tukee valitsemaasi Lokinhallintaratkaisua. Jos työkalu tarvitsee Syslog input, Voit valita Syslog ajuri.

1.Docker lokit-komento toimii vain JSON-tiedostojen Kirjausohjaimella

oletuslokiohjain ” json-tiedosto ”kirjoittaa lokit paikalliselle levylle, ja json-tiedosto-ohjain on ainoa, joka toimii rinnakkain” docker lokit ” – komennon kanssa. Heti yksi käyttää vaihtoehtoisia kirjaus ajurit, kuten Syslog, Gelf tai Splunk, Docker lokit API puhelut alkavat epäonnistua, ja ”docker lokit” komento näyttää virhe raportointi rajoitukset sijaan näyttää lokit konsolin. Paitsi docker lokikomento epäonnistuu, mutta monet muut työkalut Docker API lokit, kuten Docker käyttöliittymät kuten Portainer tai log collection containers kuten Logspout eivät pysty näyttämään kontti lokit tässä tilanteessa.

Katso tämä numero.

Docker Syslog-ajuri voi estää konttien käyttöönoton ja menettää lokit, kun Syslog-palvelin ei ole tavoitettavissa

Docker Syslog-ajurin käyttäminen TCP: llä tai TLS: llä on luotettava tapa toimittaa lokit. Syslog-kirjausohjain vaatii kuitenkin vakiintuneen TCP-yhteyden Syslog-palvelimeen, kun säiliö käynnistyy. Jos tätä yhteyttä ei saada luotua konttien käynnistysaikaan, konttien käynnistys epäonnistuu virheilmoituksella, kuten

docker: Error response from daemon: kirjausohjaimen alustaminen epäonnistui: dial TCP

tämä tarkoittaa, että tilapäinen verkko-ongelma tai korkea verkon latenssi voi estää konttien käyttöönoton. Lisäksi, uudelleenkäynnistys Syslog server voisi repiä alas kaikki kontit kirjautuminen TCP / TS Keski Syslog server, mikä on ehdottomasti tilanne välttää.

Katso tämä numero.

3. Docker syslog ajuri menettää Lokit, Kun kohde on alhaalla

samanlainen kuin edellä, aiheuttaa menetys lokit on puuttuva kyky Docker lokit ajurit puskuroida lokit levylle, kun niitä ei voida toimittaa kauko kohteisiin. Tässä on mielenkiintoinen aihe katsella.

4. Docker logging ajurit eivät tue monirivisiä lokit kuten error stack jälkiä

kun puhumme lokit, useimmat ihmiset ajattelevat yksinkertainen yhden rivin lokit, sanoa kuten Nginx tai Apache lokit. Lokit voivat kuitenkin kattaa myös useita linjoja. Esimerkiksi poikkeusjäljet kattavat tyypillisesti useita rivejä, joten auttaaksemme Tukkijälkien käyttäjiä olemme jakaneet, miten pinojälkiä käsitellään Tukkijäljellä.

asiat eivät ole sen paremmin konttien maailmassa, jossa asiat mutkistuvat entisestään, koska kaikkien konteissa toimivien sovellusten lokit päätyvät samaan ulostuloon – stdoutiin. Ei ihme nähdä kysymys #22920 suljettu ” suljettu. En välitä.”niin monet pettyivät. Onneksi, on olemassa työkaluja, kuten Sematext Docker agentti, joka voi jäsentää multi-line lokit ulos laatikosta, sekä soveltaa mukautettuja multi-line kuvioita.

Docker service logs-komento roikkuu ei-json-lokiohjaimen kanssa

vaikka json-files-ohjain vaikuttaa vankalta, muut lokiohjaimet voivat valitettavasti silti aiheuttaa ongelmia Docker Swarm-tilassa. Katso tätä GitHub-numeroa.

Docker daemon kaatuu, jos fluentd-demoni on poissa ja puskuri on täynnä

toinen skenaario, jossa lokausohjain aiheuttaa ongelmia, kun etäkohde ei ole tavoitettavissa — tässä erityistapauksessa lokausohjaimet heittävät poikkeuksia, jotka aiheuttavat Docker-demonin kaatumisen.

Docker container juuttuu luotuun tilaan Splunk-ohjaimen vikaantuessa

jos Splunk-palvelin palauttaa 504: n kontin käynnistyessä, kontti on itse asiassa käynnistynyt, mutta docker ilmoittaa kontin epäonnistuneen käynnistyksessä. Kun tässä tilassa, kontti ei enää näy docker ps, ja kontti prosessi ei voi pysäyttää docker tappaa. Ainoa tapa pysäyttää prosessi on tappaa se manuaalisesti.

Katso tämä numero.

Docker lokit ohitetaan / puuttuvat sovelluslokit (journald driver)

käy ilmi, että tämä ongelma johtuu journaldin nopeusrajoituksista, joita on nostettava, koska Docker luo lokit kaikille käynnissä oleville sovelluksille ja journald saattaa ohittaa joitain lokeja nopeudenrajoitusasetustensa vuoksi. Joten ole tietoinen journaldin asetuksista, kun liität Dockerin siihen.

Gelf-ajuriongelmat

Gelf-kirjausohjaimesta puuttuu TCP-tai TLS-vaihtoehto ja se tukee vain UDP: tä, mikä voi olla riski, että lokiviestit irtoavat UDP-pakettien pudotessa. Jotkut asiat raportoivat ongelma DNS resoluutiota/välimuistiin GELF ajurit joten lokit voidaan lähettää ”Nirvana” kun Graylog server IP muuttuu — ja tämä voi tapahtua nopeasti käyttämällä säiliö käyttöönottoja.

Docker ei tue useita lokiohjaimia

olisi kiva saada lokit tallennettua paikallisesti palvelimelle ja mahdollisuus lähettää ne etäpalvelimille. Tällä hetkellä Docker ei tue useita lokiohjaimia, joten käyttäjät joutuvat valitsemaan yhden lokiohjaimen. Ei ole helppo päätös tietäen eri asioita lueteltu tässä viestissä.

That ’ s it! Nämä ovat 10 parasta Satamatyöntekijääni!

Katso myös: jatkuva toimitus Jenkinsin kanssa & Docker Security: hyvät, huonot ja tilannepäivitys

vaihtoehtoja Docker Log Drivereille

niin monia ongelmia Docker Log Driversin ympärillä, onko vaihtoehtoja? On käynyt ilmi, että on-Docker API perustuva loki Lähettäjät pelastus!pelastukseksi.

Tässä muutamia hyviä syitä tarkastella tällaisia vaihtoehtoja:

  1. JSON-tiedostoajuri on oletusarvo ja luotettava, lokeista on aina saatavilla paikallinen kopio, ja ”docker lokit” ja Docker API vaativat lokit vain toimivat.
  2. kyky suodattaa lokit erilaisilla dynaamisilla kriteereillä, kuten kuvan nimi tai tarrat
  3. paremmat metatiedot, joilla on täysi pääsy Docker API: iin
  4. ei kaatumisriskiä Docker Daemoniin, koska tällaiset lokin Lähettäjät voisivat toimia säiliössä, jossa resurssien käyttö ja levytilan kulutus ovat rajalliset (esim. laita puskurihakemisto taltioon ja aseta hyödyllisiä rajoja)

Katsotaanpa kahta suositeltua Docker API-pohjaista lokin keräystyökalua: Logspout ja Sematext Docker Agent. Molemmat ovat avointa lähdekoodia.

huomaa, että kolmas työkalu, joka sopii enemmän tai vähemmän tähän kategoriaan, on elastinen Filebeat. Filebeat kerää lokitiedostoja, jotka ovat JSON-tiedostolokiohjaimen tuottamia, vain säiliöiden metadatan rikastus tapahtuu Docker API-puhelujen kautta.

Logspout tarjoaa useita lähtöjä ja voi reitittää lokit eri konteista eri kohteisiin muuttamatta sovellussäiliön kirjausasetuksia. Se käsittelee ANSI-Pakojaksoja (kuten lokien värikoodeja), jotka voivat olla ongelmallisia Kokotekstin haussa Elasticsearchissa.

kuten Logspout, Sematext Docker Agent (sda) on API-pohjainen, tukee lokin reititystä ja käsittelee ANSI Escape sekvenssejä koko tekstin hakua varten. Kuitenkin Sematext Docker agentti on itse asiassa enemmän kuin vain yksinkertainen lokin lähettäjä.

SDA huolehtii monista Docker-käyttäjien esiin nostamista kysymyksistä, kuten monirivisestä lokista, lokimuodon tunnistuksesta ja lokin jäsennyksestä, täydellisistä metatiedon rikastusastioista (tarrat, geoip, parvi ja Kubernetes erityiset metatiedot), levyn puskuroinnista ja luotettavista toimituksista TLS: n kautta. Se on avointa lähdekoodia GitHubissa, sitä voidaan käyttää elastisen pinon tai Sematext-pilven kanssa ja se voi kerätä konttilokien lisäksi myös konttitapahtumia sekä Docker host-ja container-mittareita.

erot kolmen JSON-tiedostoajurin ja Docker Remote API: n kanssa hyvin toimivan kirjausratkaisun välillä

suositus

API-pohjaisten loggereiden selkeä suositus saattaa muuttua tulevaisuudessa, kun Docker-loki-ajurit paranevat ajan myötä ja Unix socket-liitännäismekanismi mahdollistaa uusien loki-ajuritoteutusten suorittamisen erillisinä prosesseina. Tämä ominaisuus todella parantaa Dockers kirjautuminen plugin arkkitehtuuri ja on hyvä merkki siitä, että Docker ottaa kirjaaminen kysymyksiä vakavasti.

harkitse sillä välin Docker API-pohjaisia lokinkerääjiä, kuten Sematext Docker Agent ja Logspout, jotta vältyt törmäämästä ongelmiin Docker lokkien kanssa, kuten tässä kuvatut 10 gotchaa.

Vastaa

Sähköpostiosoitettasi ei julkaista.