Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan

Iki 2019, lan kita isih ora duwe solusi standar kanggo agregasi log ing Kubernetes. Ing artikel iki, kita pengin, nggunakake conto saka praktik nyata, kanggo nuduhake panelusuran kita, masalah ditemoni lan solusi.

Nanging, pisanan, aku bakal nggawe reservasi supaya para pelanggan sing beda ngerti perkara sing beda-beda kanthi ngumpulake log:

  • wong pengin ndeleng keamanan lan audit log;
  • wong - logging terpusat saka kabeh infrastruktur;
  • lan kanggo sawetara, iku cukup kanggo ngumpulake mung log aplikasi, ora kalebu, contone, balancers.

Ing ngisor iki minangka potongan ing ngisor iki babagan carane kita ngetrapake macem-macem "dhaptar kepinginan" lan kesulitan apa sing kita temoni.

Teori: babagan alat logging

Latar mburi babagan komponen sistem logging

Logging wis suwe banget, amarga metodologi kanggo ngumpulake lan nganalisa log wis dikembangake, sing saiki digunakake. Mbalik ing taun 1950-an, Fortran ngenalake analog saka aliran input / output standar, sing mbantu programmer debug programe. Iki minangka log komputer pisanan sing nggawe urip luwih gampang kanggo programer ing jaman kasebut. Dina iki kita ndeleng komponen pisanan saka sistem logging - sumber utawa "produser" log.

Ilmu komputer ora mandheg: jaringan komputer muncul, kluster pisanan ... Sistem kompleks sing dumadi saka sawetara komputer wiwit bisa digunakake. Saiki administrator sistem dipeksa ngumpulake log saka sawetara mesin, lan ing kasus khusus bisa nambah pesen kernel OS yen perlu kanggo neliti kegagalan sistem. Kanggo njlèntrèhaké sistem koleksi log terpusat, ing awal 2000s diterbitake RFC 3164, sing standarisasi remote_syslog. Iki minangka komponen penting liyane sing katon: kolektor log lan panyimpenan.

Kanthi nambah volume log lan introduksi teknologi web sing nyebar, muncul pitakonan babagan log apa sing kudu ditampilake kanthi gampang kanggo pangguna. Piranti konsol sing prasaja (awk / sed / grep) wis diganti karo sing luwih maju nonton log - komponen katelu.

Amarga mundhak ing volume log, liyane dadi cetha: log dibutuhake, nanging ora kabeh. Lan log sing beda-beda mbutuhake tingkat pengawetan sing beda: sawetara bisa ilang sajrone sedina, dene liyane kudu disimpen nganti 5 taun. Dadi, komponen kanggo nyaring lan nuntun aliran data ditambahake menyang sistem logging - ayo diarani saringan.

Panyimpenan uga wis nggawe lompatan gedhe: saka file biasa menyang database relasional, banjur menyang panyimpenan berorientasi dokumen (contone, Elasticsearch). Dadi panyimpenan dipisahake saka kolektor.

Pungkasane, konsep log wis berkembang dadi jinis acara abstrak sing pengin dilestarekake kanggo sejarah. Utawa, yen sampeyan kudu nindakake investigasi utawa nggawe laporan analitis ...

Akibaté, ing wektu sing relatif cendhak, koleksi log wis berkembang dadi subsistem penting, sing bisa diarani minangka salah sawijining subbagian ing Big Data.

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan
Yen biyen cetakan biasa bisa cukup kanggo "sistem logging," saiki kahanan wis owah banget.

Kubernetes lan log

Nalika Kubernetes teka ing infrastruktur kasebut, masalah ngumpulake log sing wis ana uga ora ngliwati. Ing sawetara cara, dadi luwih nglarani: ngatur platform infrastruktur ora mung disederhanakake, nanging uga rumit ing wektu sing padha. Akeh layanan lawas wis mulai migrasi menyang layanan mikro. Ing konteks log, iki dibayangke ing akeh sumber log, siklus urip khusus, lan kabutuhan kanggo nglacak hubungan kabeh komponen sistem liwat log ...

Ing ngarep, aku bisa nyatakake yen saiki, sayangé, ora ana pilihan logging standar kanggo Kubernetes sing bakal dibandhingake karo kabeh liyane. Skema sing paling populer ing komunitas yaiku:

  • wong unrolls tumpukan EFK (Elasticsearch, Fluentd, Kibana);
  • wong nyoba sing bubar dirilis Loki utawa migunakake Operator logging;
  • kita (lan mbok menawa ora mung kita?..) Aku umume puas karo pangembanganku dhewe - omah log...

Minangka aturan, kita nggunakake bundel ing ngisor iki ing kluster K8s (kanggo solusi sing di-host dhewe):

Nanging, aku ora bakal tetep ing pandhuan kanggo instalasi lan konfigurasi. Nanging, aku bakal fokus ing shortcomings lan kesimpulan global liyane babagan kahanan karo log ing umum.

Laku karo log ing K8s

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan

"Log saben dina", sampeyan ana pira?..

Koleksi log terpusat saka infrastruktur sing cukup gedhe mbutuhake sumber daya sing akeh, sing bakal digunakake kanggo ngumpulake, nyimpen lan ngolah log. Sajrone operasi macem-macem proyek, kita ngadhepi macem-macem syarat lan masalah operasional sing kedadeyan.

Ayo coba ClickHouse

Ayo goleki panyimpenan terpusat ing proyek kanthi aplikasi sing ngasilake log kanthi aktif: luwih saka 5000 baris per detik. Ayo miwiti nggarap log dheweke, nambahake menyang ClickHouse.

Sanalika wektu nyata maksimum dibutuhake, server 4-inti karo ClickHouse bakal kakehan ing subsistem disk:

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan

Jinis loading iki amarga kita nyoba nulis ing ClickHouse kanthi cepet. Lan database nanggepi iki kanthi nambah beban disk, sing bisa nyebabake kesalahan ing ngisor iki:

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

Titik iku Tabel MergeTree ing ClickHouse (padha ngemot data log) duwe kesulitan dhewe sajrone operasi nulis. Data sing dilebokake menyang dheweke nggawe partisi sementara, sing banjur digabung karo tabel utama. Akibaté, rekaman kasebut dadi nuntut banget ing disk, lan uga tundhuk watesan sing ditampa ing ndhuwur: ora luwih saka 1 subpartisi bisa digabung ing 300 detik (nyatane, iki 300 sisipan. per detik).

Kanggo nyegah prilaku kasebut, kudu nulis menyang ClickHouse ing bêsik sabisa lan ora luwih saka 1 wektu saben 2 detik. Nanging, nulis ing bledosan gedhe nuduhake yen kita kudu nulis kurang kerep ing ClickHouse. Iki, ing siji, bisa mimpin kanggo overflow buffer lan mundhut saka log. Solusi kanggo nambah buffer Fluentd, nanging banjur konsumsi memori uga bakal nambah.

komentar: Aspek masalah liyane saka solusi kita karo ClickHouse ana hubungane karo kasunyatan manawa partisi ing kasus kita (loghouse) dileksanakake liwat tabel eksternal sing disambungake Gabung meja. Iki ndadékaké kasunyatan sing nalika sampling interval wektu gedhe, RAM gedhe banget dibutuhake, amarga metatable iterates liwat kabeh sekat - malah sing temenan ora ngemot data perlu. Nanging, saiki pendekatan iki bisa diumumake kanthi aman kanggo versi ClickHouse saiki (c 18.16).

Akibaté, dadi cetha yen ora saben proyek nduweni sumber daya sing cukup kanggo ngumpulake log ing wektu nyata ing ClickHouse (luwih tepat, distribusi kasebut ora cocok). Kajaba iku, sampeyan kudu nggunakake аккумулятор, sing bakal kita bali mengko. Kasus kasebut ing ndhuwur nyata. Lan ing wektu iku, kita ora bisa menehi solusi sing dipercaya lan stabil sing cocog karo pelanggan lan ngidini kita ngumpulake log kanthi wektu tundha minimal ...

Kepiye babagan Elasticsearch?

Elasticsearch dikenal kanggo nangani beban kerja sing abot. Ayo nyoba ing proyek sing padha. Saiki beban katon kaya iki:

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan

Elasticsearch bisa nyerna aliran data, nanging nulis volume kasebut nggunakake CPU banget. Iki diputusake kanthi ngatur kluster. Secara teknis, iki ora dadi masalah, nanging ternyata mung kanggo ngoperasikake sistem koleksi log, kita wis nggunakake sekitar 8 intine lan duwe komponen tambahan sing dimuat ing sistem kasebut ...

Bottom line: pilihan iki bisa dibenerake, nanging mung yen proyek gedhe lan manajemen wis siyap nggunakake sumber daya sing signifikan ing sistem logging terpusat.

Banjur pitakonan alami muncul:

Apa log sing dibutuhake?

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan Ayo nyoba ngganti pendekatan kasebut dhewe: log kudu informatif lan ora nutupi saben acara ing sistem.

Ayo kita duwe toko online sing sukses. Apa log sing penting? Nglumpukake minangka akeh informasi sabisa, contone, saka gateway pembayaran, punika idea apik. Nanging ora kabeh log saka layanan slicing gambar ing katalog produk kritis kanggo kita: mung kasalahan lan ngawasi majeng cukup (contone, persentasi saka 500 kasalahan sing komponèn iki njedulake).

Dadi kita wis teka menyang kesimpulan sing logging terpusat ora tansah sabdho. Asring banget klien pengin ngumpulake kabeh log ing sak panggonan, sanajan nyatane, saka kabeh log, mung syarat 5% pesen sing penting kanggo bisnis sing dibutuhake:

  • Kadhangkala cukup kanggo ngatur, ngomong, mung ukuran log wadhah lan kolektor kesalahan (contone, Sentry).
  • Kabar kesalahan lan log lokal sing gedhe bisa uga cukup kanggo nyelidiki kedadeyan.
  • Kita duwe proyek sing ditindakake kanthi tes fungsional lan sistem koleksi kesalahan. Pangembang ora butuh log kaya ngono - dheweke ndeleng kabeh saka jejak kesalahan.

Ilustrasi saka urip

Crita liyane bisa dadi conto sing apik. Kita nampa panjaluk saka tim keamanan salah sawijining klien sing wis nggunakake solusi komersial sing dikembangake sadurunge Kubernetes.

Sampeyan kudu "gawe kanca" sistem koleksi log terpusat kanthi sensor deteksi masalah perusahaan - QRadar. Sistem iki bisa nampa log liwat protokol syslog lan njupuk saka FTP. Nanging, ora bisa langsung nggabungake karo plugin remote_syslog kanggo fluentd (kaya iku ternyata, kita ora piyambak). Masalah karo nyetel QRadar dadi ing sisih tim keamanan klien.

Akibaté, bagéan saka log kritis bisnis diunggah menyang FTP QRadar, lan bagean liyane dialihake liwat syslog remot langsung saka simpul. Kanggo iki kita malah nulis grafik prasaja - mbok menawa bakal mbantu wong ngatasi masalah sing padha... Thanks kanggo skema sing diasilake, klien dhewe nampa lan nganalisa log kritis (nggunakake alat favorit), lan kita bisa nyuda biaya sistem logging, mung nyimpen sasi kepungkur.

Conto liyane cukup nuduhake apa sing ora kudu ditindakake. Salah sawijining klien kita kanggo diproses saben acara teka saka pangguna, digawe multiline output unstructured informasi ing log. Kaya sing sampeyan duga, log kasebut pancen ora trep kanggo diwaca lan disimpen.

Kriteria kanggo log

Conto kasebut nyebabake kesimpulan yen saliyane milih sistem koleksi log, sampeyan kudu uga ngrancang log dhewe! Apa syarat ing kene?

  • Log kudu ing format sing bisa diwaca mesin (contone, JSON).
  • Log kudu kompak lan kanthi kemampuan kanggo ngganti tingkat logging supaya bisa debug masalah sing bisa ditindakake. Ing wektu sing padha, ing lingkungan produksi sampeyan kudu mbukak sistem kanthi tingkat logging kaya Warning utawa Kesalahan.
  • Log kudu dinormalisasi, yaiku, ing obyek log, kabeh baris kudu duwe jinis lapangan sing padha.

Log unstructured bisa mimpin kanggo masalah karo loading log menyang panyimpenan lan mandeg lengkap ing pangolahan. Minangka ilustrasi, ing ngisor iki minangka conto kesalahan 400, sing akeh ditemoni ing log fluentd:

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

Kesalahan kasebut tegese sampeyan ngirim lapangan sing jinise ora stabil menyang indeks kanthi pemetaan sing wis siap. Conto sing paling gampang yaiku kolom ing log nginx kanthi variabel $upstream_status. Bisa ngemot nomer utawa senar. Tuladhane:

{ "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"}

Log nuduhake yen server 10.100.0.10 nanggapi kanthi kesalahan 404 lan panjaluk kasebut dikirim menyang panyimpenan konten liyane. Akibaté, nilai ing log dadi kaya iki:

"upstream_response_time": "0.001, 0.007"

Kahanan iki umum banget sing malah pantes kapisah referensi ing dokumentasi.

Apa babagan linuwih?

Ana wektu nalika kabeh log tanpa pangecualian penting. Lan karo iki, rencana koleksi log khas kanggo K8s ngajokaken / rembugan ndhuwur duwe masalah.

Contone, fluentd ora bisa ngumpulake log saka wadhah sing umure cendhak. Ing salah sawijining proyek, wadhah migrasi basis data urip kurang saka 4 detik lan banjur dibusak - miturut anotasi sing cocog:

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

Amarga iki, log eksekusi migrasi ora kalebu ing panyimpenan. Politik bisa mbantu ing kasus iki. before-hook-creation.

Conto liyane yaiku rotasi log Docker. Contone, ana aplikasi sing aktif nulis log. Ing kahanan normal, kita ngatur kanggo proses kabeh log, nanging sanalika masalah katon - contone, ing ndhuwur karo format salah - Processing mandheg, lan Docker muter file. Asilé log bisnis-kritis bisa ilang.

Mulane iku penting kanggo misahake lepen log, embedding ngirim sing paling terkenal langsung menyang aplikasi kanggo njamin safety sing. Kajaba iku, iku ora bakal superfluous kanggo nggawe sawetara "akumulator" saka log, sing bisa urip ora kasedhiya kanggo panyimpenan singkat nalika nyimpen pesen kritis.

Pungkasan, kita kudu ora lali Penting kanggo ngawasi subsistem apa wae kanthi bener. Yen ora, iku gampang kanggo mbukak menyang kahanan kang fluentd ing negara CrashLoopBackOff lan ora ngirim apa-apa, lan iki njanjeni mundhut informasi penting.

temonan

Ing artikel iki, kita ora ndeleng solusi SaaS kaya Datadog. Akeh masalah sing diterangake ing kene wis dirampungake kanthi cara siji utawa liyane dening perusahaan komersial sing duwe spesialisasi ing ngumpulake log, nanging ora kabeh wong bisa nggunakake SaaS amarga macem-macem alasan. (sing utama yaiku biaya lan selaras karo 152-FZ).

Koleksi log terpusat ing wiwitan katon kaya tugas sing gampang, nanging ora kabeh. Penting kanggo elinga yen:

  • Mung komponen kritis kudu mlebu ing rinci, nalika ngawasi lan koleksi kesalahan bisa diatur kanggo sistem liyane.
  • Log ing produksi kudu dijaga minimal supaya ora nambah beban sing ora perlu.
  • Log kudu bisa diwaca mesin, dinormalisasi, lan duwe format sing ketat.
  • Log kritis kudu dikirim ing aliran sing kapisah, sing kudu dipisahake saka sing utama.
  • Perlu dipikirake akumulator log, sing bisa nylametake sampeyan saka beban dhuwur lan nggawe beban ing panyimpenan luwih seragam.

Log ing Kubernetes (lan ora mung) dina iki: pangarepan lan kasunyatan
Aturan prasaja iki, yen ditrapake ing endi wae, bakal ngidini sirkuit sing diterangake ing ndhuwur bisa digunakake - sanajan ora ana komponen penting (baterei). Yen sampeyan ora netepi prinsip kasebut, tugas kasebut bakal gampang mimpin sampeyan lan infrastruktur menyang komponen sistem liyane sing dimuat (lan ora efektif).

PS

Waca uga ing blog kita:

Source: www.habr.com

Add a comment