Vi gÄr igenom grunderna för loggning i Docker och Kubernetes, och dÀrefter diskuterar vi tvÄ verktyg som kan anvÀndas pÄ produktion: Grafana Loki och EFK-stacken (Elasticsearch + Fluent Bit + Kibana).
InnehĂ„llet i artikeln Ă€r en sammanfattning frĂ„n . Om det finns ett intresse och sĂ€rskilt ett produktionsbehov kan du gĂ„ en fullstĂ€ndig utbildning â anmĂ€l dig till kursen om .

Loggning i Docker
PÄ Kubernetes-nivÄ körs applikationer i pods, men pÄ en lÀgre nivÄ fungerar de vanligtvis i Docker. DÀrför behöver vi konfigurera loggningen sÄ att vi samlar loggar frÄn containrar. Eftersom Docker startar containrarna mÄste vi förstÄ hur loggningen fungerar pÄ Docker-nivÄ.
Jag hoppas att varje lÀsare vet: applikationsloggar ska skrivas till stdout/stderr, och inte inuti containern. Loggarna aggregeras av Docker Daemon, och den arbetar bara med de loggar som skickas till stdout/stderr. Dessutom medför det att skriva loggar inuti containern problem: containern svÀller av den vÀxande loggen (eftersom det troligen inte finns nÄgon Logrotate i containern), och Docker Daemon har ingen aning om denna logg.
Docker har flera loggdrivrutiner eller plugins för att samla loggar frÄn containrar. I den gratisversionen Docker Community Edition (CE) finns det fÀrre loggdrivrutiner Àn i den kommersiella Docker Enterprise Edition (EE).

Jag har aldrig anvÀnt Docker EE i praktiken: pÄ Southbridge försöker vi hÄlla oss till Open Source-lösningar, och dessutom behöver vÄra kunder inte de flesta av de extra funktionerna i Docker EE.
Loggdrivrutiner i Docker CE:
local â skrivning av loggar till interna filer i Docker Daemon;
json-file â skapande av json-loggar i varje containers mapp;
journald â skicka loggar till journald.
InstÀllningarna för loggning i Docker finns i filen daemon.json.
I fĂ€ltet 'log-driver' anger man pluginen, och i fĂ€ltet 'log-opts' â dess instĂ€llningar. I exemplet ovan Ă€r pluginen 'json-file' angiven, med en loggstorleksbegrĂ€nsning â 'max-size': '10m'; begrĂ€nsningen för antal filer (roteringsinstĂ€llningar) â 'max-file': '3'; samt vĂ€rden som kommer att knytas till loggarna.

Vissa instÀllningar för loggdrivrutinen kan anges via kommandoradsverktyget. Detta Àr praktiskt om en sÀrskild container mÄste startas med en annan loggdrivrutin.
SÄ hÀr ser loggningsschemat ut i Docker:

SÄ hÀr fungerar schemat: loggdrivrutinen, till exempel json-file, skapar filer. Loggsamlare (Rsyslog, Fluentd, Logagent och andra) samlar dessa filer och överför dem för lagring i Elastic, Sematext eller andra lagringslösningar.
Egenskaper för loggning i Kubernetes
Förenklat ser loggningen i Kubernetes ut sÄ hÀr: det finns en pod, i vilken en container körs, och containern skickar loggar till stdout/stderr. Sedan skapar Docker en fil och skriver loggarna, som kan roteras sedan.

LÄt oss övervÀga egenskaperna hos loggning i Kubernetes.
Spara loggar mellan distributioner. Detta Ă€r ett obligatoriskt villkor för korrekt loggning. Om loggar inte sparas mellan distributionerna, kommer loggarna frĂ„n den tidigare versionen att skrivas över vid en ny version av applikationen, och om containern startas om kan det ocksĂ„ medföra förlust av loggar. Kubernetes har en nyckel â previous, som lĂ„ter oss se loggarna frĂ„n applikationen före den senaste omstarten av Pod, men inte djupare.
Aggreggera loggar frÄn alla instanser. Om mikrotjÀnster hostas i molnet Àr det molnleverantören som ansvarar för systemets övervakning. Om mikrotjÀnsterna ligger pÄ egen hÄrdvara mÄste vi förutom loggar frÄn containrar ocksÄ samla loggar frÄn systemet.
Tidigare fanns det inga bra verktyg för att samla loggar bĂ„de frĂ„n systemet och frĂ„n mikrotjĂ€nster. Vanligtvis anvĂ€nde ett verktyg för att samla systemloggar (till exempel Rsyslog), och ett annat â loggar frĂ„n Docker (till exempel journal-bit med instĂ€llningen av loggdrivrutinen Docker till journald). Vi försökte anvĂ€nda journal-bit â för att samla loggar bĂ„de frĂ„n containrar (i loggdrivrutinen Docker ange att loggar ska skrivas till journald) och frĂ„n systemet (i CentOS 7 finns redan systemd och journald). Lösningen fungerar, men Ă€r inte perfekt. Om det finns mĂ„nga loggar börjar journal-bit att lagga och meddelanden gĂ„r förlorade.
Experimenten fortsatte â och en annan metod hittades. I CentOS 7 dupliceras de huvudsakliga systemloggarna (messages, audit, secure) i var-log som filer. I Docker kan loggar ocksĂ„ konfigureras för att sparas i json-filer. DĂ€rmed kan dessa filer frĂ„n CentOS 7 och Docker samlas in tillsammans.
Med tiden blev ELK Stack-lösningen populÀr. Det Àr en kombination av flera verktyg: Elasticsearch, Logstash och Kibana.
Elasticsearch lagrar loggar frÄn containrar, Logstash samlar loggar frÄn instanser, och Kibana möjliggör bearbetning av de mottagna loggarna, och skapandet av grafer baserat pÄ dem. Under en tid anvÀnde man aktivt ELK Stack, men enligt min Äsikt passerar dess tid. Jag kommer senare att berÀtta varför.
LÀgg till metadata. Pods, applikationer och containrar kan köras överallt. Dessutom kan ett enda program ha flera instanser. Loggarna skrivs i ett och samma format, och vi mÄste kunna förstÄ vilken replika som skriver vilken logg och i vilket namespace den befinner sig. DÀrför behöver loggarna metadata.
Analysera loggar. Det Àr intressant, men kostnaderna för att stödja logg- och övervakningssystemet kan överstiga kostnaderna för sjÀlva applikationen. NÀr du har tiotusentals och hundratusentals loggar per sekund kÀnns det rimligt, men du mÄste ÀndÄ kÀnna till grÀnsen. Ett sÀtt att hitta denna grÀns Àr att analysera loggar.
Som regel behöver du inte samla in och lagra alla loggar; du bör endast skicka en del för lagring â till exempel loggar med status "warning" eller "error". Om det handlar om loggar frĂ„n nginx eller ingress-kontrollanter kan du endast skicka loggar vars status skiljer sig frĂ„n 200. Men detta Ă€r inte ett universellt rĂ„d: om du bygger nĂ„gon form av analys pĂ„ Nginx-loggar, bör du uppenbarligen samla in dem.
Att blint filtrera loggar rekommenderas inte, eftersom de filtrerade data kan vara otillrÀckliga för en normal analys. à andra sidan kan det vara vÀrt att utföra analys pÄ metriknivÄ istÀllet för loggningsnivÄ. DÄ behöver du inte lagra hundratusentals rader med kod 200. En av metoderna Àr att fÄ information om trafik och fel frÄn metrik-data frÄn ingress-kontrollanter.
Generellt sett krÀvs det en noggrann eftertanke: vad vill du lagra och hur lÀnge, annars uppstÄr en situation dÀr loggningssystemet tar mer resurser Àn huvudprojektet.
Det finns fortfarande ingen standardlösning för loggning. Till skillnad frÄn övervakning, dÀr det finns en mest spridd lösning, Prometheus, finns det ingen standard inom loggning.
I denna förelÀsning kommer vi att granska tvÄ verktyg: ett populÀrt och ett som vinner mark. Förutom dem finns det fler, men i denna artikel kommer vi inte att beröra dem.
Med tanke pÄ alla ovan nÀmnda egenskaper kan loggning i Kubernetes nu framstÀllas i följande schema:

Det kvarstĂ„r en logg frĂ„n containern och rotation, men en agent-samlare dyker upp som plockar upp loggarna och skickar dem för lagring (i schemat â till Logging Backend). Agenten körs pĂ„ varje nod och Ă€r vanligtvis igĂ„ng i Kubernetes.
LÄt oss nu titta pÄ verktygen för loggning.
Grafana Loki
har dykt upp nyligen men har redan blivit ganska vÀlkÀnt. Dess fördelar: enkel installation, lÄg resursanvÀndning, ingen installation av Elasticsearch krÀvs eftersom den lagrar data i TSDB (tidsseriedatabas). I den tidigare artikeln skrev jag att Prometheus lagrar data i en sÄdan databas och det Àr en av mÄnga likheter mellan de tvÄ produkterna. Utvecklarna hÀvdar till och med att Loki Àr "Prometheus för loggningens vÀrld".
Ett kort avbrott om TSDB för dem som inte har lÀst. : TSDB hanterar utmÀrkt lagring av stora mÀngder data och tidsserier, men Àr inte avsedd för lÄngvarig lagring. Om du av nÄgon anledning behöver lagra loggar lÀngre Àn tvÄ veckor, Àr det bÀst att konfigurera överföring till en annan databas.
En annan fördel med Loki Àr att Grafana anvÀnds för att visualisera data. Mycket bekvÀmt: i Grafana kan vi se övervakningsdata och dÀr Àven, genom att ansluta Loki, se loggar. Diagrams kan byggas baserat pÄ loggar.
Arkitekturen för Loki ser ungefÀr ut sÄ hÀr:

Med hjĂ€lp av DaemonSet deployeras en agent â Promtail eller Fluent Bit â pĂ„ alla servrar i klustret. Agenten samlar loggar. Loki hĂ€mtar dem och lagrar dem i TSDB. Metadata lĂ€ggs omedelbart till loggarna, vilket Ă€r praktiskt: man kan filtrera efter Pods, namespaces, container-namn och till och med etiketter.
Loki fungerar i det bekanta grĂ€nssnittet Grafana. Loki har till och med ett eget frĂ„gesprĂ„k, som kallas LogQL â namnet och syntaxen liknar PromQL i Prometheus. I Loki-grĂ€nssnittet finns det tips med frĂ„gor, sĂ„ det Ă€r inte nödvĂ€ndigt att kunna dem utantill.

Loki i Grafana-grÀnssnittet
Genom att anvÀnda filter kan man i Loki hitta koder ("400", "404" och alla andra); se loggar frÄn hela noden; filtrera bort alla loggar som innehÄller ordet "error". Om du klickar pÄ en logg kommer en kortinformation med all information om hÀndelsen att öppnas.
I Loki finns det tillrÀckligt med verktyg för att hÀmta de nödvÀndiga loggarna, Àven om det Àr sant att det tekniskt sett kunde ha funnits fler. Just nu utvecklas Loki aktivt och blir mer populÀrt.
Elastic + Fluent Bit + Kibana (EFK Stack)
EFK-stapeln Àr en mer klassisk och samtidigt mycket populÀr loggningslösning.
I början av artikeln nĂ€mndes ELK (Elasticsearch + Logstash + Kibana), men detta stack har blivit förĂ„ldrat pĂ„ grund av Logstashs ineffektivitet och resurskrav. IstĂ€llet har man börjat anvĂ€nda den lĂ€ttare och mer effektiva Fluentd, och efter en tid fick den sĂ€llskap av â en Ă€nnu lĂ€ttare och Ă€nnu mer effektiv insamlingsagent.
Om vi ska tro pĂ„ utvecklarna, sĂ„ Ă€r Fluent Bit mer Ă€n 100 gĂ„nger bĂ€ttre i prestanda Ă€n Fluentd: "dĂ€r Fluentd anvĂ€nder 20 MB RAM, kommer Fluent Bit att anvĂ€nda 150 kB" â ett direkt citat frĂ„n dokumentationen. Med detta i Ă„tanke har Fluent Bit börjat anvĂ€ndas mer frekvent.
Fluent Bit har fÀrre funktioner Àn Fluentd, men uppfyller de grundlÀggande behoven, sÄ vi anvÀnder huvudsakligen Fluent Bit.
Arbetsflödet för EFK-stacken: agenten samlar loggar frÄn alla poddar (vanligtvis en DaemonSet som körs pÄ alla servrar i klustret) och skickar dem till lagring (Elasticsearch, PostgreSQL eller Kafka). Kibana ansluter till lagringen och hÀmtar all nödvÀndig information.

presenterar informationen i ett bekvÀmt webbgrÀnssnitt. Det finns diagram, filter och mycket mer.

Baserat pÄ loggar kan man skapa hela instrumentpaneler.

Möjligheterna hos Fluent Bit
Eftersom Fluent Bit vanligtvis Àr mindre kÀnt Àn Logstash, ska vi titta lite nÀrmare pÄ det. Fluent Bit kan logiskt delas in i 6 moduler, och vissa av modulerna kan utökas med plugins som ökar dess funktioner.

Input-modulen samlar in loggar frÄn filer, systemd-tjÀnster och Àven frÄn tcp-socket (det Àr bara att ange en endpoint, sÄ börjar Fluent Bit hÀmta dÀrifrÄn). Dessa möjligheter Àr tillrÀckliga för att samla loggar bÄde frÄn systemet och frÄn containrar.
I produktion anvÀnder vi oftast plugins (det kan riktas mot en mapp med loggar) och (man kan sÀga Ät det frÄn vilka tjÀnster som ska samla loggar).
Parser-modulen anpassar loggar till ett gemensamt format. Som standard Àr Nginx-loggar strÀngar. Med hjÀlp av en plugin kan denna strÀng omvandlas till JSON: specificera fÀlt och deras vÀrden. Det Àr mycket enklare att arbeta med JSON Àn med strÀngloggar, eftersom man fÄr mer flexibla sorteringsmöjligheter.
Filter-modulen. PÄ denna nivÄ filtreras oönskade loggar bort. Till exempel skickas endast loggar med vÀrdet "warning" eller med specifika etiketter till lagring. De utvalda loggarna gÄr till bufferten.
Buffer-modulen. Fluent Bit har tvÄ typer av buffertar: minnesbuffert och diskbuffert. Bufferten Àr ett tillfÀlligt lager för loggar som behövs vid fel eller krascher. Alla vill spara pÄ RAM, sÄ diskbuffert vÀljs vanligtvis. Men det Àr viktigt att notera att loggarna fortfarande laddas upp till minnet innan de sparas pÄ disken.
Routing/Output-modulen innehÄller regler och adresser för att skicka loggar. Som nÀmnts kan loggar skickas till Elasticsearch, PostgreSQL eller till exempel Kafka.
Intressant nog kan loggar frÄn Fluent Bit skickas till Fluentd. DÄ den förstnÀmnda Àr mer lÀttviktig och mindre funktionell kan loggar samlas in och skickas till Fluentd, dÀr de kan bearbetas ytterligare med hjÀlp av extra plugins och skickas till lagringsplatser.
Om du planerar att anvĂ€nda ElasticsearchâŠ
Avslutningsvis tvÄ tips för dem som planerar att anvÀnda Elasticsearch som logglagring i produktion.
- Konfigurera aviseringar med hjÀlp av . Detta program plockar ut viktiga meddelanden frÄn den allmÀnna loggströmmen och skickar alerts via e-post eller andra kanaler. TyvÀrr har det nyligen kommit .
- Rota loggar med hjĂ€lp av applikationen eller genom att anropa Elasticsearch API. I princip gör Elastic nu betydande framsteg nĂ€r det gĂ€ller att hantera livscykeln av index utan att anvĂ€nda externa verktyg. Generellt sett finns det ingen mening med att lagra loggar lĂ€nge: det Ă€r osannolikt att nĂ„gon logg kommer att behövas efter tvĂ„ veckor â om den verkligen Ă€r kritisk, kommer den med största sannolikhet att ha bearbetats inom tvĂ„ veckor. I vĂ€rsta fall kan gamla loggar arkiveras och skickas nĂ„gonstans för lĂ„ngtidslagring. Jag har hört talas om speciella loggar som enligt lag mĂ„ste förvaras i upp till 5 Ă„r. Jag har personligen inte stött pĂ„ det, men jag skulle inte jĂ€mföra sĂ„dan information med vanliga loggar, och kanske till och med förvara dem separat.
FortsĂ€ttning följerâŠ
Författare: Marcel Ibraev, certifierad Kubernetes-administratör, praktiserande ingenjör pÄ företaget , talare och kursutvecklare .
KĂ€lla: habr.com
