Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit

Et ass 2019, a mir hunn nach ëmmer keng Standardléisung fir Log-Aggregatioun a Kubernetes. An dësem Artikel wëlle mir, mat Beispiller aus der realer Praxis, eis Sichen deelen, begéinte Probleemer an hir Léisungen.

Wéi och ëmmer, als éischt wäert ech reservéieren datt verschidde Cliente ganz verschidde Saache verstinn andeems se Logbicher sammelen:

  • een wëll Sécherheets- an Auditprotokoller gesinn;
  • een - zentraliséiert Logged vun der ganzer Infrastruktur;
  • a fir e puer ass et genuch fir nëmmen Applikatiounsprotokoller ze sammelen, ausser, zum Beispill, Balancer.

Drënner ass de Schnëtt hei ënnen iwwer wéi mir verschidde "Wonschlëschten" implementéiert hunn a wéi eng Schwieregkeeten mir begéint hunn.

Theorie: iwwer Logged Tools

Hannergrond iwwer d'Komponente vun engem Logsystem

Logging ass e laange Wee komm, als Resultat vun deem Methodologien fir Logbicher ze sammelen an ze analyséieren entwéckelt goufen, dat ass wat mir haut benotzen. Zréck an den 1950er huet de Fortran en Analog vu Standard Input / Output Streams agefouert, wat dem Programméierer gehollef huet säi Programm ze debuggen. Dëst waren déi éischt Computerprotokoller déi d'Liewe méi einfach gemaach hunn fir Programméierer vun deenen Zäiten. Haut gesi mir an hinnen den éischte Bestanddeel vum Logsystem - Quell oder "Produzent" vu Logbicher.

D'Informatik huet net stoe bliwwen: Computernetzwierker koumen op, déi éischt Stärekéip ... Komplex Systemer, déi aus verschiddene Computere besteet, hunn ugefaang ze schaffen. Elo sinn d'Systemadministrateuren gezwongen Logbicher vu verschiddene Maschinnen ze sammelen, an a spezielle Fäll kënnen se OS Kernel Messagen derbäi setzen am Fall wou se e Systemfehler ënnersicht hunn. Fir zentraliséiert Log Sammelsystemer ze beschreiwen, am fréien 2000er gouf et publizéiert RFC 3164, déi standardiséiert Remote_syslog. Dëst ass wéi en anere wichtege Bestanddeel erschéngt: aloggen Sammler an hir Stockage.

Mat der Erhéijung vum Volume vun de Logbicher an der verbreeter Aféierung vu Webtechnologien ass d'Fro opgestan wéi eng Logbicher bequem fir de Benotzer gewise ginn. Einfach Konsol Tools (awk/sed/grep) goufen duerch méi fortgeschratt ersat aloggen Zuschauer - drëtt Komponent.

Wéinst der Erhéijung vum Volume vun de Logbicher ass eppes anescht kloer ginn: Logbicher sinn néideg, awer net all. A verschidde Logbicher erfuerderen verschidden Niveaue vun der Erhaalung: e puer kënnen an engem Dag verluer ginn, anerer mussen 5 Joer gespäichert ginn. Also, e Bestanddeel fir d'Filterung an d'Routing vun Datenstroum gouf an de Logsystem bäigefüügt - loosst eis et nennen filteren.

Storage huet och e grousse Sprong gemaach: vu reegelméissegen Dateien op relational Datenbanken, an dann op dokumentorientéiert Späichere (zum Beispill Elasticsearch). Also gouf d'Lagerung vum Sammler getrennt.

Schlussendlech ass d'Konzept vun engem Logbicher erweidert zu enger Aart vun abstrakte Stroum vun Eventer, déi mir fir d'Geschicht bewahren wëllen. Oder éischter, am Fall wou Dir musst eng Enquête maachen oder en analytesche Bericht opstellen ...

Als Resultat huet sech an enger relativ kuerzer Zäit d'Logkollektioun zu engem wichtegen Ënnersystem entwéckelt, dee mat Recht ee vun den Ënnersektiounen a Big Data genannt ka ginn.

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit
Wann eemol gewéinlech Drécker fir e "Protokollsystem" duergeet, elo huet d'Situatioun vill geännert.

Kubernetes a Logbicher

Wéi de Kubernetes an d'Infrastruktur komm ass, huet de schonn existente Problem fir Logbicher ze sammelen och net ëmgaang. Op e puer Weeër gouf et nach méi schmerzhaf: d'Gestioun vun der Infrastrukturplattform war net nëmme vereinfacht, mee och gläichzäiteg komplizéiert. Vill al Servicer hunn ugefaang op Mikroservicer ze migréieren. Am Kontext vu Logbicher spigelt sech dëst an der wuessender Zuel vu Logquellen, hirem speziellen Liewenszyklus, an der Bedierfnes fir d'Relatiounen vun all Systemkomponenten duerch Logbicher ze verfolgen ...

Wann ech no vir kucken, kann ech soen datt et elo leider keng standardiséierte Loggingsoptioun fir Kubernetes gëtt, déi gënschteg mat allen aneren vergläichen. Déi populärste Schemaen an der Gemeinschaft sinn wéi follegt:

  • een rullt de Stack aus EFK (Elasticsearch, Fluentd, Kibana);
  • een probéiert déi kierzlech verëffentlecht Loki oder benotzt Logbicher Bedreiwer;
  • нас (a vläicht net nëmmen eis? ..) Ech si gréisstendeels zefridden mat menger eegener Entwécklung - Loghaus...

Als Regel benotze mir déi folgend Bündelen a K8s Cluster (fir selbsthostéiert Léisungen):

Wéi och ëmmer, ech wäert net op Instruktioune fir hir Installatioun a Konfiguratioun wunnen. Amplaz wäert ech op hir Mängel konzentréieren a méi global Conclusiounen iwwer d'Situatioun mat Logbicher am Allgemengen.

Praxis mat Logbicher an K8s

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit

"Alldag Logbicher", wéivill vun iech sinn do?..

Zentraliséierter Sammlung vu Logbicher aus enger zimlech grousser Infrastruktur erfuerdert bedeitend Ressourcen, déi op d'Sammelen, d'Späicheren an d'Veraarbechtung vun de Logbicher ausginn. Wärend der Operatioun vu verschiddene Projete ware mir mat verschiddenen Ufuerderungen an Operatiounsproblemer konfrontéiert, déi dovunner entstinn.

Loosst eis ClickHouse probéieren

Loosst eis eng zentraliséiert Lagerung op engem Projet kucken mat enger Applikatioun déi Logbicher ganz aktiv generéiert: méi wéi 5000 Linnen pro Sekonn. Loosst eis ufänken mat senge Logbicher ze schaffen, se op ClickHouse bäizefügen.

Soubal maximal Echtzäit erfuerderlech ass, gëtt de 4-Core Server mat ClickHouse schonn um Disk Subsystem iwwerlaascht:

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit

Dës Zort Luede ass wéinst der Tatsaach datt mir probéieren sou séier wéi méiglech am ClickHouse ze schreiwen. An d'Datebank reagéiert op dëst mat enger verstäerkter Diskbelaaschtung, wat déi folgend Feeler verursaache kann:

DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts

Punkt ass, datt MergeTree Dëscher an ClickHouse (si enthalen Logdaten) hunn hir eege Schwieregkeeten während Schreiwen Operatiounen. D'Daten, déi an hinnen agefouert ginn, generéieren eng temporär Partition, déi dann mat der Haapttabell fusionéiert gëtt. Als Resultat ass d'Opnahm op der Disk ganz usprochsvoll, an et ass och ënnerleien der Limitatioun, déi mir iwwer Uebst uewe kruten: net méi wéi 1 Ënnerpartitionen kënnen an 300 Sekonn fusionéiert ginn (tatsächlech sinn dat 300 Inserts) pro Sekonn).

Fir dëst Verhalen ze vermeiden, soll op ClickHouse schreiwen an esou grouss wéi méiglech Stécker an net méi wéi 1 mol all 2 Sekonnen. Wéi och ëmmer, a grousse Burst schreiwen suggeréiert datt mir manner dacks am ClickHouse schreiwen. Dëst, am Tour, kann zu engem Puffer Iwwerschwemmung a Verloscht vu Logbicher féieren. D'Léisung ass de Fluentd Puffer ze erhéijen, awer da wäert de Gedächtnisverbrauch och eropgoen.

Remarque: En anere problemateschen Aspekt vun eiser Léisung mat ClickHouse war am Zesummenhang mat der Tatsaach datt d'Partitionéierung an eisem Fall (Loghaus) duerch extern Dëscher verbonne gëtt. Dësch fusionéieren. Dëst féiert zu der Tatsaach datt wann Dir grouss Zäitintervaller probéieren, exzessiv RAM erfuerderlech ass, well de Metatable duerch all Partitionen iteréiert - och déi, déi offensichtlech net déi néideg Donnéeën enthalen. Wéi och ëmmer, elo kann dës Approche sécher als obsolet deklaréiert ginn fir aktuell Versioune vu ClickHouse (c 18.16).

Als Resultat gëtt et kloer datt net all Projet genuch Ressourcen huet fir Logbicher an Echtzäit am ClickHouse ze sammelen (méi präzis, hir Verdeelung wäert net passend sinn). Zousätzlech, musst Dir benotzen Akkulator, op déi mir spéider zréckkommen. De Fall uewen beschriwwen ass real. An zu där Zäit konnte mir net eng zouverlässeg a stabil Léisung ubidden, déi dem Client passt an eis erlaabt Logbicher mat minimaler Verzögerung ze sammelen ...

Wat iwwer Elasticsearch?

Elasticsearch ass bekannt fir schwéier Aarbechtsbelaaschtungen ze handhaben. Loosst eis et am selwechte Projet probéieren. Elo gesäit d'Laascht esou aus:

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit

Elasticsearch konnt den Datestroum verdauen, awer esou Bänn ze schreiwen benotzt d'CPU staark. Dëst gëtt decidéiert duerch d'Organisatioun vun engem Cluster. Technesch ass dëst kee Problem, awer et stellt sech eraus datt just fir d'Operatioun vum Log Sammelsystem mir schonn ongeféier 8 Kären benotzen an eng zousätzlech héich gelueden Komponent am System hunn ...

Bottom Line: Dës Optioun kann gerechtfäerdegt ginn, awer nëmmen wann de Projet grouss ass a seng Gestioun prett ass fir bedeitend Ressourcen op engem zentraliséierte Logsystem ze verbréngen.

Da stellt sech eng natierlech Fro:

Wéi eng Logbicher si wierklech gebraucht?

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit Loosst eis probéieren d'Approche selwer z'änneren: Logbicher solle gläichzäiteg informativ sinn an net ofdecken jiddwereen Event am System.

Loosst eis soen datt mir en erfollegräichen Online Store hunn. Wéi eng Logbicher si wichteg? Sou vill Informatioun wéi méiglech ze sammelen, zum Beispill vun engem Bezuelungspaart, ass eng super Iddi. Awer net all d'Logbicher aus dem Bildschnëttservice am Produktkatalog si fir eis kritesch: nëmme Feeler a fortgeschratt Iwwerwaachung si genuch (zum Beispill de Prozentsaz vu 500 Feeler, déi dës Komponent generéiert).

Also mir sinn zu der Conclusioun komm, datt zentraliséiert Logbicher ass net ëmmer gerechtfäerdegt. Ganz dacks wëll de Client all d'Logbicher op enger Plaz sammelen, och wann tatsächlech aus dem ganze Log nëmmen e bedingte 5% vu Messagen erfuerderlech sinn, déi fir d'Geschäft kritesch sinn:

  • Heiansdo ass et genuch fir ze konfiguréieren, soen, nëmmen d'Gréisst vum Containerprotokoll an de Feelersammler (zum Beispill Sentry).
  • Eng Feelernotifikatioun an e grousse lokale Logbuch selwer kënnen dacks genuch sinn fir Tëschefäll z'ënnersichen.
  • Mir haten Projeten, déi exklusiv funktionell Tester a Fehlersammlungssystemer gemaach hunn. Den Entwéckler huet keng Logbicher als solch gebraucht - si hunn alles vu Feelerspuren gesinn.

Illustratioun vum Liewen

Eng aner Geschicht kann als gutt Beispill déngen. Mir kruten eng Ufro vum Sécherheetsteam vun engem vun eise Clienten, déi schonn eng kommerziell Léisung benotzt huet, déi laang virun der Aféierung vu Kubernetes entwéckelt gouf.

Et war néideg "Frënn ze maachen" vum zentraliséierte Log Sammelsystem mam Corporate Problem Detection Sensor - QRadar. Dëse System kann Logbicher iwwer de Syslog Protokoll kréien an se vun FTP recuperéieren. Wéi och ëmmer, et war net direkt méiglech et mam Remote_syslog Plugin fir fluentd ze integréieren (wéi et sech erausstellt, mir sinn net eleng). Probleemer mat der Ariichten vun QRadar hu sech op der Säit vum Sécherheetsteam vum Client erausgestallt.

Als Resultat gouf en Deel vun de Geschäftskriteschen Logbicher op FTP QRadar eropgelueden, an den aneren Deel gouf iwwer Remote Syslog direkt vun den Noden ëmgeleet. Dofir hu mir souguer geschriwwen einfachen Diagramm - vläicht hëlleft et engem engem ähnleche Problem ze léisen ... Dank dem resultéierende Schema huet de Client selwer kritesch Logbicher kritt an analyséiert (mat senge Liiblingsinstrumenter), a mir konnten d'Käschte vum Logsystem reduzéieren, spueren nëmmen de Logbicher. leschten Mount.

En anert Beispill ass ganz indikativ fir wat net ze maachen. Ee vun eise Clienten fir Veraarbechtung vun all eenzel Evenementer kommen aus dem Benotzer, gemaach multiline onstrukturéiert Ausgang Informatiounen am Logbuch. Wéi Dir kéint roden, waren esou Logbicher extrem onbequem fir ze liesen an ze späicheren.

Critèrë fir Logbicher

Esou Beispiller féieren zu der Conclusioun, datt nieft der Auswiel vun engem Log Sammelsystem, Dir musst designen och d'Logbicher selwer! Wat sinn d'Ufuerderunge hei?

  • Logbicher mussen am Maschinn liesbare Format sinn (zum Beispill JSON).
  • Logbicher solle kompakt sinn a mat der Fäegkeet de Grad vum Logbuch z'änneren fir méiglech Probleemer ze debuggen. Zur selwechter Zäit, a Produktiounsëmfeld sollt Dir Systemer mat engem Loggingsniveau lafen wéi Opgepasst oder Feeler.
  • Logbicher muss normaliséiert ginn, dat ass, an engem Log Objet, all Linnen mussen déi selwecht Feld Typ hunn.

Onstrukturéiert Logbicher kënnen zu Probleemer mat Luede Logbicher an d'Lagerung an e komplette Stop an hirer Veraarbechtung féieren. Als Illustratioun, hei ass e Beispill mat Feeler 400, déi vill definitiv a fléissend Logbicher begéint hunn:

2019-10-29 13:10:43 +0000 [warn]: dump an error event: error_class=Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError error="400 - Rejected by Elasticsearch"

De Feeler bedeit datt Dir e Feld schéckt deem säin Typ onbestänneg ass an den Index mat enger fäerdeger Mapping. Dat einfachst Beispill ass e Feld am nginx Log mat enger Variabel $upstream_status. Et kann entweder eng Zuel oder eng String enthalen. Zum Beispill:

{ "ip": "1.2.3.4", "http_user": "-", "request_id": "17ee8a579e833b5ab9843a0aca10b941", "time": "29/Oct/2019:16:18:57 +0300", "method": "GET", "uri": "/staffs/265.png", "protocol": "HTTP/1.1", "status": "200", "body_size": "906", "referrer": "https://example.com/staff", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", "request_time": "0.001", "cache_status": "-", "upstream_response_time": "0.001, 0.007", "upstream_addr": "127.0.0.1:9000", "upstream_status": "200", "upstream_response_length": "906", "location": "staff"}
{ "ip": "1.2.3.4", "http_user": "-", "request_id": "47fe42807f2a7d8d5467511d7d553a1b", "time": "29/Oct/2019:16:18:57 +0300", "method": "GET", "uri": "/staff", "protocol": "HTTP/1.1", "status": "200", "body_size": "2984", "referrer": "-", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", "request_time": "0.010", "cache_status": "-", "upstream_response_time": "0.001, 0.007", "upstream_addr": "10.100.0.10:9000, 10.100.0.11:9000", "upstream_status": "404, 200", "upstream_response_length": "0, 2984", "location": "staff"}

D'Logbicher weisen datt de Server 10.100.0.10 mat engem 404-Fehler geäntwert huet an d'Ufro gouf op eng aner Inhaltspäicherung geschéckt. Als Resultat gouf de Wäert an de Logbicher esou:

"upstream_response_time": "0.001, 0.007"

Dës Situatioun ass sou heefeg datt et souguer eng separat verdéngt Referenzen an der Dokumentatioun.

Wat iwwer Zouverlässegkeet?

Et ginn Zäiten wou all Logbicher ouni Ausnam vital sinn. A mat dëser, déi typesch Log Kollektioun Schemaen fir K8s proposéiert / uewen diskutéiert Problemer.

Zum Beispill, fléissend kann net Logbicher aus kuerz-lieweg Container sammelen. An engem vun eise Projeten huet den Datebankmigratiounscontainer manner wéi 4 Sekonnen gelieft a gouf duerno geläscht - no der entspriechender Annotatioun:

"helm.sh/hook-delete-policy": hook-succeeded

Wéinst deem war de Migratiounsausféierungsprotokoll net an der Späichere abegraff. Politik kann an dësem Fall hëllefen. before-hook-creation.

En anert Beispill ass Docker Log Rotatioun. Loosst eis soen datt et eng Applikatioun ass déi aktiv op Logbicher schreift. Ënner normalen Bedéngungen verwalten mir all d'Logbicher ze veraarbecht, awer soubal e Problem erschéngt - zum Beispill, wéi uewen beschriwwen mat engem falschen Format - d'Veraarbechtung stoppt, an den Docker rotéiert d'Datei. D'Resultat ass datt geschäftlech kritesch Logbicher verluer kënne ginn.

Duerfir et ass wichteg fir Logbicher ze trennen, embedding déi wäertvollst direkt an d'Applikatioun schécken fir hir Sécherheet ze garantéieren. Ausserdeem wier et net iwwerflësseg fir e puer ze kreéieren "Akkumulator" vu Logbicher, déi kuerz Stockage Onverfügbarkeet iwwerliewe kann wärend kritesch Messagen spueren.

Schlussendlech däerfe mer dat net vergiessen Et ass wichteg all Subsystem richteg ze iwwerwaachen. Soss ass et einfach an eng Situatioun ze lafen an där fléissend an engem Zoustand ass CrashLoopBackOff a schéckt näischt, an dëst versprécht de Verloscht vun wichteg Informatiounen.

Conclusiounen

An dësem Artikel kucke mir net op SaaS Léisunge wéi Datadog. Vill vun de Problemer, déi hei beschriwwe ginn, goufe schonn op déi eng oder aner Manéier vu kommerziellen Firmen geléist, déi spezialiséiert sinn op Logbicher ze sammelen, awer net jidderee ka SaaS aus verschiddene Grënn benotzen (D'Haaptrei sinn Käschten an Konformitéit mat 152-FZ).

Zentraliséiert Log Sammlung am Ufank gesäit aus wéi eng einfach Aufgab, awer et ass guer net. Et ass wichteg ze erënneren datt:

  • Nëmme kritesch Komponenten mussen am Detail ageloggt ginn, während Iwwerwaachung a Feelersammlung fir aner Systemer konfiguréiert kënne ginn.
  • Logbicher an der Produktioun sollten minimal gehal ginn fir net onnéideg Belaaschtung ze addéieren.
  • Logbicher musse Maschinn liesbar sinn, normaliséiert an e strikt Format hunn.
  • Wierklech kritesch Logbicher sollen an engem getrennten Stroum geschéckt ginn, dee vun den Haapt getrennt soll ginn.
  • Et ass derwäert e Log-Akkumulator ze berücksichtegen, deen Iech vu Burst vun héijer Belaaschtung retten kann an d'Laascht op der Lagerung méi eenheetlech maachen.

Logbicher an Kubernetes (an net nëmmen) haut: Erwaardungen a Realitéit
Dës einfach Regelen, wann iwwerall applizéiert, géif erlaben de Circuiten uewen beschriwwen ze schaffen - och wann se wichteg Komponente fehlen (d'Batterie). Wann Dir net un esou Prinzipien halen, féiert d'Aufgab Iech an d'Infrastruktur ganz einfach op eng aner héich gelueden (a gläichzäiteg ineffektiv) Komponent vum System.

PS

Liest och op eisem Blog:

Source: will.com

Setzt e Commentaire