Produktioun-prett Biller fir k8s

Dës Geschicht ass iwwer wéi mir Container an engem Produktiounsëmfeld benotzen, speziell Kubernetes. Den Artikel ass gewidmet fir Metriken a Logbicher aus Containeren ze sammelen, souwéi Biller ze bauen.

Produktioun-prett Biller fir k8s

Mir sinn vun der Fintech Firma Exness, déi Servicer fir Online Handel a Fintech Produkter fir B2B a B2C entwéckelt. Eis R&D huet vill verschidden Teams, d'Entwécklungsdepartement huet 100+ Mataarbechter.

Mir vertrieden d'Team déi verantwortlech ass fir d'Plattform fir eis Entwéckler fir Code ze sammelen an ze lafen. Besonnesch si mir verantwortlech fir Metriken, Logbicher an Eventer vun Uwendungen ze sammelen, ze späicheren an ze berichten. Mir bedreiwen de Moment ongeféier dräi dausend Docker Container an engem Produktiounsëmfeld, halen eis 50 TB Big Data Storage, a bidden architektonesch Léisungen déi ronderëm eis Infrastruktur gebaut sinn: Kubernetes, Rancher, a verschidde ëffentlech Cloud Ubidder. 

Eis Motivatioun

Wat brennt? Keen kann äntweren. Wou ass d'Häerz? Et ass schwéier ze verstoen. Wéini ass et gebrannt? Dir kënnt erausfannen, awer net direkt. 

Produktioun-prett Biller fir k8s

Firwat stinn e puer Container, während anerer gefall sinn? Wéi eng Container war Schold? No allem sinn d'Äussere vun de Container d'selwecht, awer bannen huet jidderee säin eegene Neo.

Produktioun-prett Biller fir k8s

Eis Entwéckler sinn kompetent Kärelen. Si maachen gutt Servicer déi Gewënn un d'Firma bréngen. Awer et gi Feeler wann Container mat Uwendungen verschwonnen sinn. Ee Container verbraucht ze vill CPU, en aneren verbraucht d'Netzwierk, en Drëttel verbraucht I / O Operatiounen, an de véierte ass komplett onkloer wat et mat Sockets mécht. Et fällt alles an d'Schëff sinkt. 

Agenten

Fir ze verstoen wat dobannen geschitt, hu mir décidéiert Agenten direkt a Container ze placéieren.

Produktioun-prett Biller fir k8s

Dës Agenten sinn Restriktiounsprogrammer déi Container an esou engem Zoustand halen datt se sech net briechen. Agente si standardiséiert, an dëst erlaabt eng standardiséiert Approche fir d'Behälter ze servéieren. 

An eisem Fall mussen d'Agenten Logbicher an engem Standardformat ubidden, markéiert a gedrosselt. Si sollten eis och standardiséierte Metriken ubidden, déi aus enger Geschäftsapplikatiounsperspektiv erweiderbar sinn.

Agenten bedeiten och Utilities fir Operatioun an Ënnerhalt, déi a verschiddene Orchestratiounssystemer funktionnéiere kënnen, déi verschidde Biller ënnerstëtzen (Debian, Alpine, Centos, etc.).

Endlech mussen d'Agenten einfach CI / CD ënnerstëtzen déi Docker Dateien enthält. Soss fällt d'Schëff auserneen, well Container fänken un "kromme" Schinne geliwwert ze ginn.

Bauen Prozess an Zil Bild Apparat

Fir alles standardiséiert a verwaltbar ze halen, muss eng Zort Standardbauprozess gefollegt ginn. Dofir hu mir beschloss Container vu Container ze sammelen - dëst ass Rekursioun.

Produktioun-prett Biller fir k8s

Hei sinn d'Container duerch zolidd Konturen duergestallt. Zur selwechter Zäit hunn se décidéiert Verdeelungskits an hinnen ze setzen, sou datt "Liewen net wéi Hambieren schéngt." Firwat dat gemaach gouf, wäerte mir hei ënnen erklären.
 
D'Resultat ass e Build-Tool - e Versiounsspezifesche Container deen spezifesch Verdeelungsversioune a spezifesch Skriptversioune referéiert.

Wéi benotze mir et? Mir hunn en Docker Hub deen e Container enthält. Mir spigelen et an eisem System fir vun externen Ofhängegkeeten lass ze ginn. D'Resultat ass e Container mat giel markéiert. Mir erstellen eng Schabloun fir all d'Verdeelungen a Skripte ze installéieren déi mir brauchen an de Container. Duerno setze mir e prett-ze-benotzen Bild zesummen: Entwéckler setzen Code an e puer vun hiren eegene speziellen Ofhängegkeeten an. 

Wat ass gutt un dëser Approche? 

  • Als éischt, voll Versiounskontroll vu Build Tools - Build Container, Skript a Verdeelungsversioune. 
  • Zweetens hu mir Standardiséierung erreecht: mir erstellen Templates, Zwëschen a prett-ze-benotzen Bild op déiselwecht Manéier. 
  • Drëttens, Container ginn eis Portabilitéit. Haut benotze mir Gitlab, a muer wäerte mir op TeamCity oder Jenkins wiesselen a mir kënnen eis Container op déiselwecht Manéier lafen. 
  • Véierten, Ofhängegkeeten ze minimiséieren. Et war keen Zoufall datt mir Verdeelungskits an de Container geluecht hunn, well dëst erlaabt eis ze vermeiden datt se all Kéier vum Internet eroflueden. 
  • Fënneftens ass d'Baugeschwindegkeet eropgaang - d'Präsenz vu lokalen Kopien vu Biller erlaabt Iech Zäit beim Download ze vermeiden, well et e lokalt Bild gëtt. 

An anere Wierder, mir hunn e kontrolléierten a flexibelen Montageprozess erreecht. Mir benotzen déiselwecht Tools fir all komplett Versioune Container ze bauen. 

Wéi eis Bauprozedur funktionnéiert

Produktioun-prett Biller fir k8s

D'Versammlung gëtt mat engem Kommando gestart, de Prozess gëtt am Bild ausgefouert (rout markéiert). Den Entwéckler huet eng Docker-Datei (giel markéiert), mir maachen et, ersetzen Variablen mat Wäerter. A laanscht de Wee addéiere mir Header a Fousszeilen - dat sinn eis Agenten. 

Header füügt Verdeelunge vun den entspriechende Biller un. A Fousszeilen installéiert eis Servicer dobannen, konfiguréiert de Start vun der Aarbechtsbelaaschtung, Logging an aner Agenten, ersetzt den Entréespunkt, etc. 

Produktioun-prett Biller fir k8s

Mir hu laang geduecht, ob mir e Supervisor installéiere sollen. Um Enn hu mir decidéiert datt mir hien brauchen. Mir hunn S6 gewielt. De Supervisor stellt Containerverwaltung: erlaabt Iech domat ze verbannen wann den Haaptprozess ofbriechen a gëtt manuell Gestioun vum Container ouni et nei ze kreéieren. Logbicher a Metriken si Prozesser déi am Container lafen. Si mussen och iergendwéi kontrolléiert ginn, a mir maachen dat mat Hëllef vun engem Supervisor. Schlussendlech këmmert de S6 sech ëm Haushalt, Signalveraarbechtung an aner Aufgaben.

Well mir verschidde Orchestratiounssystemer benotzen, nodeems se gebaut a lafen, muss de Container verstoen wat Ëmfeld et ass an no der Situatioun handelen. Zum Beispill:
Dëst erlaabt eis e Bild ze bauen an et a verschiddene Orchestratiounssystemer lafen, an et gëtt lancéiert andeems d'Spezifizitéiten vun dësem Orchestratiounssystem berücksichtegt ginn.

 Produktioun-prett Biller fir k8s

Fir dee selwechte Container kréie mir verschidde Prozessbeem an Docker a Kubernetes:

Produktioun-prett Biller fir k8s

D'Notzlaascht gëtt ënner der Opsiicht vum S6 ausgefouert. Opgepasst op Sammler an Eventer - dëst sinn eis Agenten verantwortlech fir Logbicher a Metriken. Kubernetes huet se net, awer Docker. Firwat? 

Wa mir d'Spezifikatioun vum "Pod" kucken (nodréiglech - Kubernetes Pod), wäerte mir gesinn datt den Eventbehälter an engem Pod ausgefouert gëtt, deen e separaten Sammlerbehälter huet, deen d'Funktioun ausféiert fir Metriken a Logbicher ze sammelen. Mir kënnen d'Fäegkeete vu Kubernetes benotzen: Container an engem Pod lafen, an engem eenzege Prozess an / oder Netzwierkraum. Eigentlech Är Agenten virstellen an e puer Funktiounen ausféieren. A wann dee selwechte Container am Docker lancéiert gëtt, kritt en all déiselwecht Fäegkeeten als Output, dat heescht, et wäert fäeg sinn Logbicher a Metriken ze liwweren, well d'Agenten intern lancéiert ginn. 

Metriken a Logbicher

Metriken a Logbicher liwweren ass eng komplex Aufgab. Et gi verschidde Aspekter zu hirer Entscheedung.
D'Infrastruktur ass erstallt fir d'Ausféierung vun der Notzlaascht, an net fir d'Mass Liwwerung vu Logbicher. Dat ass, dëse Prozess muss mat minimale Container Ressource Ufuerderunge gemaach ginn. Mir striewen eis Entwéckler ze hëllefen: "Kritt en Docker Hub Container, lafen et a mir kënnen d'Logbicher liwweren." 

Den zweeten Aspekt ass d'Begrenzung vum Volume vu Logbicher. Wann e Stroum am Volume vun de Logbicher a verschiddene Container geschitt (d'Applikatioun gëtt e Stack-Trace an enger Loop eraus), erhéicht d'Laascht op der CPU, Kommunikatiounskanäl a Logveraarbechtungssystem, an dëst beaflosst d'Operatioun vum Host als eng ganz an aner Behälter um Host, dann heiansdo féiert dat zum "Fall" vum Host. 

Den drëtten Aspekt ass datt et néideg ass sou vill Metrikensammlungsmethoden wéi méiglech aus der Këscht z'ënnerstëtzen. Vum Liesen vun Dateien a Polling vum Prometheus-Endpunkt fir Applikatiounspezifesch Protokoller ze benotzen.

An de leschten Aspekt ass d'Ressourceverbrauch ze minimiséieren.

Mir hunn eng Open-Source Go-Léisung mam Numm Telegraf gewielt. Dëst ass en universelle Connector dee méi wéi 140 Aarte vun Input Channels (Input Plugins) an 30 Aarte vun Output Channels (Output Plugins) ënnerstëtzt. Mir hunn et finaliséiert an elo wäerte mir Iech soen wéi mir et benotze mat Kubernetes als Beispill. 

Produktioun-prett Biller fir k8s

Loosst eis soen datt en Entwéckler eng Aarbechtslaascht ofsetzt an de Kubernetes kritt eng Ufro fir e Pod ze kreéieren. Zu dësem Zäitpunkt gëtt e Container genannt Collector automatesch fir all Pod erstallt (mir benotze Mutatiounswebhook). Collector ass eisen Agent. Am Ufank konfiguréiert dëse Container sech fir mat Prometheus an dem Log Sammelsystem ze schaffen.

  • Fir dëst ze maachen, benotzt et Pod-Annotatiounen, a ofhängeg vun hirem Inhalt erstellt, soen, e Prometheus Endpunkt; 
  • Baséierend op der Pod Spezifizéierung a spezifesche Container Astellungen, decidéiert et wéi Logbicher liwweren.

Mir sammelen Logbicher iwwer d'Docker API: Entwéckler mussen se just an stdout oder stderr setzen, an de Collector wäert et sortéieren. Logbicher ginn a Stécker mat e puer Verspéidung gesammelt fir méiglech Host Iwwerlaascht ze vermeiden. 

Metriken ginn iwwer Aarbechtsbelaaschtungsinstanzen (Prozesser) a Container gesammelt. Alles ass markéiert: Nummraum, ënner, a sou weider, an dann an Prometheus Format ëmgewandelt - a gëtt fir Sammlung verfügbar (ausser fir Logbicher). Mir schécken och Logbicher, Metriken an Eventer op Kafka a weider:

  • Logbicher sinn am Graylog verfügbar (fir visuell Analyse);
  • Logbicher, Metriken, Eventer ginn op Clickhouse geschéckt fir laangfristeg Lagerung.

Alles funktionnéiert genau d'selwecht an AWS, nëmme mir ersetzen Graylog duerch Kafka mat Cloudwatch. Mir schécken d'Protokoller dohinner, an alles ass ganz bequem: et ass direkt kloer wéi ee Cluster a Container si gehéieren. Datselwecht ass wouer fir Google Stackdriver. Dat ass, eise Schema funktionnéiert souwuel on-premise mat Kafka an an der Wollek. 

Wa mir keng Kubernetes mat Pods hunn, ass de Schema e bësse méi komplizéiert, awer et funktionnéiert op déiselwecht Prinzipien.

Produktioun-prett Biller fir k8s

Déiselwecht Prozesser ginn am Container ausgefouert, si gi mat S6 orchestréiert. All déiselwecht Prozesser lafen am selwechte Container.

Als Resultat,

Mir hunn eng komplett Léisung erstallt fir Biller ze bauen an ze lancéieren, mat Optiounen fir Logbicher a Metriken ze sammelen an ze liwweren:

  • Mir hunn eng standardiséierter Approche entwéckelt fir Biller ze montéieren, a baséiert op deem mir CI Templates entwéckelt hunn;
  • Datesammlungsagenten sinn eis Telegraf Extensiounen. Mir hunn se gutt an der Produktioun getest;
  • Mir benotzen Mutatioun Webhook Container mat Agenten an pods ëmsetzen; 
  • Integréiert an de Kubernetes/Rancher-Ökosystem;
  • Mir kënnen déiselwecht Container a verschiddene Orchestratiounssystemer ausféieren an d'Resultat kréien, déi mir erwaarden;
  • Erstellt eng komplett dynamesch Containerverwaltungskonfiguratioun. 

Co-auteur: Ilya Prudnikov

Source: will.com

Setzt e Commentaire