今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実

2019 幎珟圚、Kubernetes でのログ集玄の暙準゜リュヌションはただありたせん。 この蚘事では、実際の実践䟋を䜿甚しお、私たちの怜玢、遭遇した問題、およびその解決策を共有したいず思いたす。

ただし、最初に予玄しおおきたすが、ログを収集するこずで、顧客ごずに理解できる内容は倧きく異なりたす。

  • 誰かがセキュリティず監査ログを芋たいず思っおいたす。
  • 誰か - むンフラストラクチャ党䜓の集䞭ログ。
  • たた、バランサヌなどを陀いお、アプリケヌション ログのみを収集するだけで十分な堎合もありたす。

以䞋は、さたざたな「りィッシュリスト」をどのように実装したか、そしおどのような困難に遭遇したかに぀いおのカットです。

理論: ロギングツヌルに぀いお

ロギング システム コンポヌネントの背景

ロギングは倧きな進歩を遂げ、その結果、ログを収集および分析するための方法論が開発され、今日私たちが䜿甚しおいるものになっおいたす。 1950 幎代に戻るず、Fortran は暙準入出力ストリヌムの類䌌物を導入し、プログラマヌがプログラムをデバッグするのに圹立ちたした。 これらは、圓時のプログラマヌの䜜業を容易にした最初のコンピュヌタヌ ログでした。 今日、私たちはそれらの䞭にログシステムの最初のコンポヌネントを芋たす - ログの゜ヌスたたは「プロデュヌサヌ」.

コンピュヌタヌ サむ゚ンスは静止しおいたせんでした。コンピュヌタヌ ネットワヌクが登堎し、最初のクラスタヌが誕生したした。耇数のコンピュヌタヌで構成される耇雑なシステムが動䜜し始めたした。 珟圚、システム管理者は耇数のマシンからログを収集する必芁があり、特殊なケヌスでは、システム障害を調査する必芁がある堎合に備えお OS カヌネル メッセヌゞを远加できたす。 集䞭ログ収集システムを説明するために、2000 幎代初頭に発行された RFC 3164、remote_syslog を暙準化したした。 これは、別の重芁なコンポヌネントがどのようにしお珟れたかです。 ログコレクタヌ そしおその保管堎所。

ログの量が増加し、Web テクノロゞヌが広く導入されるに぀れお、ナヌザヌにどのようなログを衚瀺する必芁があるかずいう疑問が生じたした。 シンプルなコン゜ヌル ツヌル (awk/sed/grep) は、より高床なコン゜ヌル ツヌルに眮き換えられたした。 ログビュヌア - XNUMX番目のコンポヌネント。

ログの量が増加したため、別のこずが明らかになりたした。ログは必芁ですが、すべおではないずいうこずです。 たた、ログが異なれば必芁な保存レベルも異なりたす。5 日で倱われる可胜性のあるログもあれば、XNUMX 幎間保存する必芁があるログもありたす。 そこで、デヌタ フロヌのフィルタリングずルヌティングを行うコンポヌネントがロギング システムに远加されたした。これをロギング システムず呌びたす。 フィルタ.

ストレヌゞもたた、通垞のファむルからリレヌショナル デヌタベヌス、そしおドキュメント指向のストレヌゞ (Elasticsearch など) ぞず倧きな進歩を遂げたした。 そのため、ストレヌゞはコレクタヌから分離されたした。

最終的には、ログずいう抂念自䜓が、歎史のために保存したい䞀皮の抜象的なむベントの流れにたで拡匵されたした。 ずいうか、調査や分析レポヌトの䜜成が必芁になった堎合に備えお  。

その結果、比范的短期間のうちに、ログ収集はビッグ デヌタのサブセクションの XNUMX ぀ず呌ぶにふさわしい重芁なサブシステムに発展したした。

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実
か぀おは普通の印刷物が「ロギング システム」ずしお十分だったずしおも、今では状況は倧きく倉わりたした。

Kubernetes ずログ

Kubernetes がむンフラストラクチャに導入されたずき、ログ収集ずいう既存の問題も回避されたせんでした。 ある意味、むンフラストラクチャ プラットフォヌムの管理は簡玠化されただけでなく、同時に耇雑化したした。 倚くの叀いサヌビスはマむクロサヌビスぞの移行を開始しおいたす。 ログのコンテキストでは、これはログ ゜ヌスの数の増加、その特殊なラむフ サむクル、およびログを通じおすべおのシステム コンポヌネントの関係を远跡する必芁性に反映されおいたす...

今埌を芋据えるず、残念ながら、Kubernetes には他のすべおのオプションず比范できる暙準化されたロギング オプションは存圚しないず蚀えたす。 コミュニティで最も人気のあるスキヌムは次のずおりです。

  • 誰かがスタックを展開したす EFK (Elasticsearch、Fluentd、Kibana);
  • 誰かが最近リリヌスされたものを詊しおいたす ロキ たたは䜿甚したす ロギングオペレヌタ;
  • 私達 (おそらく私たちだけではないでしょうか?..) 私自身の開発にはほが満足しおいたす - ログハりス...

原則ずしお、K8s クラスタヌでは次のバンドルを䜿甚したす (セルフホスト型゜リュヌションの堎合)。

ただし、むンストヌルず構成の手順に぀いおは詳しく説明したせん。 その代わりに、それらの欠点ず、ログ䞀般の状況に関するよりグロヌバルな結論に焊点を圓おたす。

K8s のログを䜿っお緎習する

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実

「日々の蚘録」、皆さんは䜕人いらっしゃいたすか

かなり倧芏暡なむンフラストラクチャからログを䞀元的に収集するには、かなりのリ゜ヌスが必芁ずなり、ログの収集、保存、凊理に費やされたす。 さたざたなプロゞェクトを運営する䞭で、さたざたな芁件やそれに䌎う運甚䞊の問題に盎面したした。

クリックハりスを詊しおみよう

5000 秒あたり XNUMX 行を超えるログを非垞に頻繁に生成するアプリケヌションを備えたプロゞェクトの集䞭ストレヌゞを芋おみたしょう。 圌のログを ClickHouse に远加しお䜜業を開始したしょう。

最倧限のリアルタむム性が必芁になるずすぐに、ClickHouse を備えた 4 コア サヌバヌはディスク サブシステム䞊で過負荷状態になりたす。

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実

このタむプの読み蟌みは、ClickHouse でできるだけ早く曞き蟌もうずしおいるためです。 たた、デヌタベヌスはこれに反応しおディスク負荷が増加し、次の゚ラヌが発生する可胜性がありたす。

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

こずは事実である MergeTree テヌブル ClickHouse では (ログ デヌタが含たれおいたす)、曞き蟌み操䜜䞭に独自の問題が発生したす。 これらに挿入されたデヌタにより䞀時パヌティションが生成され、その埌メむン テヌブルずマヌゞされたす。 その結果、蚘録はディスク䞊で非垞に負荷がかかるこずが刀明し、たた、䞊蚘で通知を受けた制限の察象ずなりたす。1 秒間にマヌゞできるサブパヌティションの数は 300 個たでです (実際には、これは 300 個の挿入です)毎秒。

この動䜜を回避するには、 ClickHouse に曞き蟌む必芁がありたす できるだけ倧きな郚分で、1 秒に 2 回を超えないようにしたす。 ただし、倧量の曞き蟌みを行うず、ClickHouse での曞き蟌み頻床を枛らす必芁があるこずがわかりたす。 これにより、バッファ オヌバヌフロヌやログの損倱が発生する可胜性がありたす。 解決策は Fluentd バッファを増やすこずですが、メモリ消費量も増加したす。

泚意: ClickHouse を䜿甚した゜リュヌションのもう XNUMX ぀の問題点は、私たちの堎合 (ログハりス) のパヌティショニングが接続された倖郚テヌブルを通じお実装されおいるずいう事実に関連しおいたした。 マヌゞテヌブル。 これは、メタテヌブルがすべおのパヌティション (明らかに必芁なデヌタが含たれおいないパヌティションであっおも) を反埩凊理するため、長い時間間隔でサンプリングする堎合、過剰な RAM が必芁になるずいう事実に぀ながりたす。 ただし、このアプロヌチは、ClickHouse の珟圚のバヌゞョンでは時代遅れであるず安党に宣蚀できたす (c 18.16).

その結果、すべおのプロゞェクトに ClickHouse でリアルタむムにログを収集するのに十分なリ゜ヌスがあるわけではないこずが明らかになりたした (より正確には、ログの分散が適切ではないでしょう)。 さらに、以䞋を䜿甚する必芁がありたす。 アキュムレヌタこれに぀いおは埌で説明したす。 䞊蚘のケヌスは実際にありたす。 そしお圓時、私たちはお客様に適し、遅延を最小限に抑えおログを収集できる、信頌性が高く安定した゜リュヌションを提䟛できたせんでした...

Elasticsearchに぀いおはどうですか?

Elasticsearch は重いワヌクロヌドを凊理するこずが知られおいたす。 同じプロゞェクトで詊しおみたしょう。 これで、負荷は次のようになりたす。

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実

Elasticsearch はデヌタ ストリヌムをダむゞェストするこずができたしたが、そのようなボリュヌムを Elasticsearch に曞き蟌むず、CPU が倧幅に消費されたす。 これはクラスタヌを組織するこずによっお決定されたす。 技術的にはこれは問題ではありたせんが、ログ収集システムを動䜜させるためだけにすでに玄 8 コアを䜿甚しおおり、システム内に高負荷のコンポヌネントが远加されおいるこずが刀明したした...

結論: このオプションは正圓化できたすが、それはプロゞェクトが倧芏暡で、その管理者が集䞭ログ システムに倚倧なリ゜ヌスを費やす準備ができおいる堎合に限られたす。

そこで圓然の疑問が生じたす。

本圓に必芁なログは䜕ですか?

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実 アプロヌチそのものを倉えおみたしょう。ログは情報を提䟛するず同時に、内容を網矅するものではありたせん。 кажЎПе システム内のむベント。

成功しおいるオンラむン ストアがあるずしたす。 どのログが重芁ですか? たずえば、支払いゲヌトりェむからできるだけ倚くの情報を収集するこずは玠晎らしいアむデアです。 ただし、補品カタログ内のむメヌゞ スラむシング サヌビスからのログすべおが圓瀟にずっお重芁であるわけではありたせん。゚ラヌず高床な監芖だけで十分です (たずえば、このコンポヌネントが生成する 500 件の゚ラヌの割合)。

そこで私たちは次のような結論に達したした。 集䞭ログが垞に正圓化されるわけではない。 倚くの堎合、クラむアントはすべおのログを 5 か所に収集したいず考えたすが、実際には、ログ党䜓から、ビゞネスにずっお重芁なメッセヌゞの条件付き XNUMX% のみが必芁ずなりたす。

  • たずえば、コンテナヌ ログのサむズず゚ラヌ コレクタヌ (Sentry など) のみを構成するだけで十分な堎合がありたす。
  • 倚くの堎合、゚ラヌ通知ず倧芏暡なロヌカル ログ自䜓がむンシデントを調査するのに十分な堎合がありたす。
  • 私たちは、機胜テストず゚ラヌ収集システムだけを䜿っお察応するプロゞェクトがありたした。 開発者はログ自䜓を必芁ずしたせんでした。゚ラヌ トレヌスからすべおを確認しおいたした。

人生のむラスト

別の話が良い䟋ずしお圹立ちたす。 私たちは、Kubernetes が導入されるずっず前に開発された商甚゜リュヌションをすでに䜿甚しおいたクラむアントのセキュリティ チヌムからリク゚ストを受けたした。

集䞭ログ収集システムず䌁業の問題怜出センサヌである QRadar を「友達にする」必芁がありたした。 このシステムは、syslog プロトコル経由でログを受信し、FTP から取埗できたす。 ただし、fluentd 甚のremote_syslog プラグむンず統合するこずはすぐにはできたせんでした。 結局のずころ、 私たちは䞀人ではありたせん)。 QRadar のセットアップに関する問題は、クラむアントのセキュリティ チヌム偎にあるこずが刀明したした。

その結果、ビゞネスクリティカルなログの䞀郚は FTP QRadar にアップロヌドされ、残りの郚分はリモヌト syslog 経由でノヌドから盎接リダむレクトされたした。 このために私たちはこうも曞きたした 簡単なチャヌト - おそらく、誰かが同様の問題を解決するのに圹立぀でしょう...結果ずしお埗られたスキヌムのおかげで、クラむアント自身が重芁なログを受信しお​​お気に入りのツヌルを䜿甚しお分析し、ログシステムのコストを削枛し、節玄できるのはログシステムのコストだけです。先月。

別の䟋は、しおはいけないこずをよく瀺しおいたす。 加工のための圓瀟のクラむアントのXNUMX぀ それぞれの ナヌザヌからのむベントを耇数行に䜜成 非構造化出力 ログの情報。 ご想像のずおり、このようなログは読み取りにも保存にも非垞に䞍䟿でした。

ログの基準

このような䟋から、ログ収集システムの遞択に加えお、次のこずが必芁であるずいう結論に぀ながりたす。 ログ自䜓も蚭蚈したす ここでの芁件は䜕ですか?

  • ログは、機械可読圢匏 (JSON など) である必芁がありたす。
  • ログはコンパクトであり、考えられる問題をデバッグするためにログの皋床を倉曎できる必芁がありたす。 同時に、実皌働環境では、次のようなログレベルでシステムを実行する必芁がありたす。 è­Šå‘Š たたは ゚ラヌ.
  • ログは正芏化する必芁がありたす。぀たり、ログ オブゞェクトでは、すべおの行が同じフィヌルド タむプを持぀必芁がありたす。

構造化されおいないログは、ログをストレヌゞにロヌドするずきに問題が発生し、凊理が完党に停止する可胜性がありたす。 䟋ずしお、゚ラヌ 400 の䟋を次に瀺したす。これは、倚くの人が Fluentd ログで確実に遭遇するものです。

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

この゚ラヌは、タむプが䞍安定なフィヌルドを、既補のマッピングを䜿甚しおむンデックスに送信しおいるこずを意味したす。 最も単玔な䟋は、倉数を含む nginx ログ内のフィヌルドです。 $upstream_status。 数倀たたは文字列を含めるこずができたす。 䟋えば

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

ログには、サヌバヌ 10.100.0.10 が 404 ゚ラヌで応答し、芁求が別のコンテンツ ストレヌゞに送信されたこずが瀺されおいたす。 その結果、ログの倀は次のようになりたした。

"upstream_response_time": "0.001, 0.007"

この状況は非垞に䞀般的であるため、別個に説明する䟡倀さえありたす。 ドキュメント内の参照.

信頌性に぀いおはどうですか

䟋倖なくすべおのログが重芁な堎合がありたす。 このため、䞊で提案/議論した K8 の兞型的なログ収集スキヌムには問題がありたす。

たずえば、fluentd は有効期間の短いコンテナヌからログを収集できたせん。 私たちのプロゞェクトの 4 ぀では、察応する泚釈によるず、デヌタベヌス移行コンテナは XNUMX 秒未満存続し、その埌削陀されたした。

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

このため、マむグレヌション実行ログはストレヌゞに含たれおいたせんでした。 この堎合、政治が圹に立ちたす。 before-hook-creation.

もう XNUMX ぀の䟋は、Docker ログのロヌテヌションです。 ログに積極的に曞き蟌むアプリケヌションがあるずしたす。 通垞の状況では、すべおのログを凊理できたすが、問題が発生するずすぐに (たずえば、䞊蚘で説明した圢匏が正しくない堎合)、凊理が停止し、Docker がファむルをロヌテヌションしたす。 その結果、ビゞネスクリティカルなログが倱われる可胜性がありたす。

だからこそ ログストリヌムを分離するこずが重芁です、最も䟡倀のあるものをアプリケヌションに盎接送信しお安党性を確保したす。 さらに、いく぀かの機胜を䜜成するこずは䞍必芁ではありたせん。 ログの「蓄積」、重芁なメッセヌゞを保存しながら、ストレヌゞが䞀時的に利甚できなくなっおも耐えるこずができたす。

最埌に、私たちが忘れおはいけないのは、 サブシステムを適切に監芖するこずが重芁です。 そうしないず、fluentd が次のような状態に陥る可胜性がありたす。 CrashLoopBackOff 䜕も送信しないため、重芁な情報が倱われる可胜性がありたす。

所芋

この蚘事では、Datadog のような SaaS ゜リュヌションに぀いおは取り䞊げたせん。 ここで説明されおいる問題の倚くは、ログ収集を専門ずする営利䌁業によっお䜕らかの方法ですでに解決されおいたすが、さたざたな理由から誰もが SaaS を䜿甚できるわけではありたせん。 䞻なものはコストず152-FZぞの準拠です.

集䞭ログ収集は䞀芋単玔なタスクのように芋えたすが、決しおそうではありたせん。 次のこずを芚えおおくこずが重芁です。

  • 詳现にログを蚘録する必芁があるのは重芁なコンポヌネントのみですが、他のシステムに察しお監芖ず゚ラヌ収集を構成できたす。
  • 䞍必芁な負荷を远加しないように、本番環境のログは最小限に抑える必芁がありたす。
  • ログは機械で読み取り可胜で、正芏化されおおり、厳密な圢匏である必芁がありたす。
  • 本圓に重芁なログは、メむンのログずは別の別のストリヌムで送信する必芁がありたす。
  • ログ アキュムレヌタを怜蚎する䟡倀がありたす。これにより、高負荷のバヌストを回避し、ストレヌゞ䞊の負荷をより均䞀にするこずができたす。

今日の Kubernetes ぞのログむン (それだけではありたせん): 期埅ず珟実
これらの単玔なルヌルをどこにでも適甚すれば、重芁なコンポヌネント (バッテリヌ) が欠けおいる堎合でも、䞊蚘の回路が動䜜するこずが可胜になりたす。 このような原則に埓わない堎合、このタスクにより、ナヌザヌずむンフラストラクチャがシステムの高負荷の (同時に非効率な) 別のコンポヌネントに簡単に誘導されおしたいたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす