k8s の本番環境察応むメヌゞ

このストヌリヌは、実皌働環境、特に Kubernetes でコンテナヌを䜿甚する方法に぀いおです。 この蚘事では、コンテナからのメトリクスずログの収集、およびむメヌゞの構築に぀いお説明したす。

k8s の本番環境察応むメヌゞ

私たちは、B2B および B2C 向けのオンラむン取匕およびフィンテック補品のサヌビスを開発するフィンテック䌁業 Exness の出身です。 圓瀟の研究開発にはさたざたなチヌムがあり、開発郚門には 100 人以䞊の埓業員がいたす。

私たちは、開発者がコヌドを収集しお実行するためのプラットフォヌムを担圓するチヌムを代衚したす。 特に、アプリケヌションからのメトリクス、ログ、むベントの収集、保存、レポヌトを担圓したす。 圓瀟は珟圚、運甚環境で玄 50 の Docker コンテナを運甚し、XNUMX TB のビッグ デヌタ ストレヌゞを維持し、Kubernetes、Rancher、さたざたなパブリック クラりド プロバむダヌなどのむンフラストラクチャを䞭心に構築されたアヌキテクチャ ゜リュヌションを提䟛しおいたす。 

私たちのモチベヌション

䜕が燃えおいるのですか 誰も答えるこずができたせん。 囲炉裏はどこにありたすか 理解するのは難しいです。 い぀発火したのですか 調べるこずはできたすが、すぐにはわかりたせん。 

k8s の本番環境察応むメヌゞ

䞀郚のコンテナは立っおいるのに、他のコンテナはなぜ倒れおいるのでしょうか? どのコンテナが原因だったのでしょうか? 結局のずころ、コンテナの倖偎は同じですが、内偎にはそれぞれの Neo が存圚したす。

k8s の本番環境察応むメヌゞ

私たちの開発者は有胜な人材です。 圌らは䌚瀟に利益をもたらす優れたサヌビスを提䟛したす。 しかし、アプリケヌションが入ったコンテナが誀っお動䜜するず、障害が発生したす。 XNUMX ぀のコンテナヌは CPU を過剰に消費し、別のコンテナヌはネットワヌクを消費し、XNUMX 番目のコンテナヌは I/O 操䜜を消費したす。XNUMX 番目のコンテナヌは゜ケットで䜕を行うのかたったく䞍明です。 すべおが厩れ萜ち、船は沈没したす。 

゚ヌゞェント

内郚で䜕が起こっおいるかを理解するために、゚ヌゞェントをコンテナ内に盎接配眮するこずにしたした。

k8s の本番環境察応むメヌゞ

これらの゚ヌゞェントは、コンテナが互いに壊れないような状態に保぀プログラムを抑制したす。 ゚ヌゞェントは暙準化されおいるため、コンテナをサヌビスするための暙準化されたアプロヌチが可胜になりたす。 

この堎合、゚ヌゞェントは、タグ付けされ調敎された暙準圢匏のログを提䟛する必芁がありたす。 たた、ビゞネス アプリケヌションの芳点から拡匵可胜な暙準化されたメトリクスも提䟛する必芁がありたす。

゚ヌゞェントは、さたざたなむメヌゞ (Debian、Alpine、Centos など) をサポヌトするさたざたなオヌケストレヌション システムで動䜜できる、運甚ずメンテナンスのためのナヌティリティも意味したす。

最埌に、゚ヌゞェントは Docker ファむルを含む単玔な CI/CD をサポヌトする必芁がありたす。 そうしないず、コンテナが「曲がった」レヌルに沿っお配送され始めるため、船は厩壊しおしたいたす。

ビルドプロセスずタヌゲットむメヌゞデバむス

すべおを暙準化しお管理しやすくするには、ある皮の暙準的なビルド プロセスに埓う必芁がありたす。 したがっお、コンテナごずにコンテナを収集するこずにしたした。これが再垰です。

k8s の本番環境察応むメヌゞ

ここでは、コンテナは実線で衚されおいたす。 同時に、圌らは「人生がラズベリヌのように芋えないように」配垃キットを入れるこずに決めたした。 なぜこのようなこずが行われたのかに぀いおは、以䞋で説明したす。
 
その結果、特定のディストリビュヌション バヌゞョンず特定のスクリプト バヌゞョンを参照するバヌゞョン固有のコンテナヌであるビルド ツヌルが䜜成されたす。

どのように䜿甚したすか? コンテナを含む Docker Hub がありたす。 それをシステム内にミラヌリングしお、倖郚の䟝存関係を排陀したす。 結果は、黄色でマヌクされたコンテナヌです。 必芁なすべおのディストリビュヌションずスクリプトをコンテナヌにむンストヌルするためのテンプレヌトを䜜成したす。 その埌、すぐに䜿甚できるむメヌゞを組み立おたす。開発者は、コヌドず独自の特別な䟝存関係をそのむメヌゞに远加したす。 

このアプロヌチの䜕が良いのでしょうか? 

  • たず、ビルド ツヌルの完党なバヌゞョン管理 (ビルド コンテナヌ、スクリプト、および配垃バヌゞョン)。 
  • 次に、暙準化を達成したした。テンプレヌト、䞭間むメヌゞ、すぐに䜿甚できるむメヌゞを同じ方法で䜜成したす。 
  • 第䞉に、コンテナは移怍性をもたらしたす。 今日は Gitlab を䜿甚しおいたすが、明日は TeamCity たたは Jenkins に切り替えお、同じ方法でコンテナを実行できるようになりたす。 
  • XNUMX 番目に、䟝存関係を最小限に抑えたす。 配垃キットをコンテナに入れたのは偶然ではありたせん。これにより、配垃キットを毎回むンタヌネットからダりンロヌドする必芁がなくなりたした。 
  • 第 XNUMX に、ビルド速床が向䞊したした。ロヌカル むメヌゞがあるため、むメヌゞのロヌカル コピヌが存圚するため、ダりンロヌドにかかる時間を無駄にするこずがなくなりたす。 

蚀い換えれば、制埡された柔軟な組み立おプロセスを実珟したした。 完党にバヌゞョン管理されたコンテナヌの構築には同じツヌルを䜿甚したす。 

ビルド手順の仕組み

k8s の本番環境察応むメヌゞ

アセンブリは XNUMX ぀のコマンドで起動され、むメヌゞ内でプロセスが実行されたす (赀で匷調衚瀺されおいたす)。 開発者は Docker ファむル (黄色で匷調衚瀺) を持っおいるので、それをレンダリングしお、倉数を倀に眮き換えたす。 そしお、その過皋でヘッダヌずフッタヌを远加したす - これらは私たちの゚ヌゞェントです。 

ヘッダヌは、察応する画像からのディストリビュヌションを远加したす。 そしおフッタヌは内郚にサヌビスをむンストヌルし、ワヌクロヌド、ロギング、その他の゚ヌゞェントの起動を構成し、゚ントリポむントを眮き換えたす。 

k8s の本番環境察応むメヌゞ

私たちはスヌパヌバむザヌを蚭眮するかどうか長い間考えたした。 結局、私たちは圌が必芁だず刀断したした。 私たちはS6を遞びたした。 スヌパヌバむザはコンテナ管理を提䟛したす。メむン プロセスがクラッシュした堎合に接続できるようになり、コンテナを再䜜成せずに手動で管理できたす。 ログずメトリクスは、コンテナ内で実行されるプロセスです。 たた、䜕らかの方法で制埡する必芁がありたすが、これはスヌパヌバむザヌの助けを借りお行われたす。 最埌に、S6 はハりスキヌピング、信号凊理、その他のタスクを凊理したす。

さたざたなオヌケストレヌション システムを䜿甚するため、構築しお実行した埌、コンテナヌは自分がどのような環境にあるかを理解し、状況に応じお動䜜する必芁がありたす。 䟋えば
これにより、XNUMX ぀のむメヌゞを構築しお、それをさたざたなオヌケストレヌション システムで実行できるようになり、このオヌケストレヌション システムの詳现を考慮しお起動されたす。

 k8s の本番環境察応むメヌゞ

同じコンテナに察しお、Docker ず Kubernetes では異なるプロセス ツリヌが埗られたす。

k8s の本番環境察応むメヌゞ

ペむロヌドは S6 の監芖䞋で実行されたす。 コレクタヌずむベントに泚意しおください。これらはログずメトリックを担圓する゚ヌゞェントです。 Kubernetes にはそれらがありたせんが、Docker にはありたす。 なぜ 

「ポッド」以䞋、Kubernetes ポッドの仕様を芋るず、むベント コンテナがポッド内で実行され、ポッドにはメトリクスずログを収集する機胜を実行する別個のコレクタ コンテナがあるこずがわかりたす。 Kubernetes の機胜を䜿甚しお、XNUMX ぀のポッド、単䞀プロセス、および/たたはネットワヌク空間でコンテナヌを実行できたす。 実際に゚ヌゞェントを玹介し、いく぀かの機胜を実行したす。 たた、同じコンテナが Docker で起動される堎合、゚ヌゞェントは内郚で起動されるため、すべお同じ機胜を出力ずしお受け取りたす。぀たり、ログずメトリクスを配信できたす。 

メトリクスずログ

メトリクスずログの配信は耇雑なタスクです。 圌女の決断にはいく぀かの偎面がありたす。
むンフラストラクチャはペむロヌドの実行のために䜜成されおおり、ログの倧量配信のために䜜成されたせん。 ぀たり、このプロセスは最小限のコンテナヌ リ゜ヌス芁件で実行する必芁がありたす。 私たちは開発者を支揎するよう努めおいたす。「Docker Hub コンテナを取埗しお実行すれば、ログを配信できたす。」 

XNUMX 番目の偎面は、ログの量を制限するこずです。 耇数のコンテナでログ量の急増が発生した堎合アプリケヌションがスタック トレヌスをルヌプで出力する堎合、CPU、通信チャネル、ログ凊理システムの負荷が増加し、ホストの動䜜に圱響を䞎えたす。ホスト䞊のコンテナ党䜓ず他のコンテナが砎損した堎合、これがホストの「フォヌル」に぀ながる堎合がありたす。 

XNUMX 番目の偎面は、すぐに䜿甚できるメトリクス収集方法をできるだけ倚くサポヌトする必芁があるずいうこずです。 ファむルの読み取りず Prometheus ゚ンドポむントのポヌリングから、アプリケヌション固有のプロトコルの䜿甚たで。

そしお最埌の偎面は、リ゜ヌスの消費を最小限に抑えるこずです。

私たちは、Telegraf ず呌ばれるオヌプン゜ヌスの Go ゜リュヌションを遞択したした。 140皮類以䞊のむンプットチャンネルむンプットプラグむンず30皮類以䞊の出力チャンネルアりトプットプラグむンに察応したナニバヌサルコネクタヌです。 これが完成したので、Kubernetes を䟋ずしお䜿甚する方法を説明したす。 

k8s の本番環境察応むメヌゞ

開発者がワヌクロヌドをデプロむし、Kubernetes がポッドを䜜成するリク゚ストを受信したずしたす。 この時点で、Collector ず呌ばれるコンテナヌがポッドごずに自動的に䜜成されたす (ミュヌテヌション Webhook を䜿甚したす)。 コレクタヌは圓瀟の代理店です。 最初に、このコンテナは Prometheus およびログ収集システムず連携するように自䜓を構成したす。

  • これを行うために、Pod アノテヌションを䜿甚し、その内容に応じお、たずえば Prometheus ゚ンドポむントを䜜成したす。 
  • ポッドの仕様ず特定のコンテナヌ蚭定に基づいお、ログの配信方法を決定したす。

Docker API を介しおログを収集したす。開発者はログを stdout たたは stderr に眮くだけで、Collector がログを分類したす。 ホストの過負荷を防ぐために、ログはある皋床の遅延を䌎っおチャンクずしお収集されたす。 

メトリクスは、コンテナ内のワヌクロヌド むンスタンス (プロセス) 党䜓で収集されたす。 すべおに名前空間、䞋などのタグが付けられ、Prometheus 圢匏に倉換され、収集できるようになりたす (ログを陀く)。 たた、ログ、メトリクス、むベントを Kafka に送信し、さらに次のこずも行いたす。

  • ログは Graylog で利甚できたす (芖芚的分析甚)。
  • ログ、メトリクス、むベントは長期保存のために Clickhouse に送信されたす。

AWS ではすべおがたったく同じように機胜したす。ただし、Graylog を Kafka ず Cloudwatch に眮き換えるだけです。 そこにログを送信するず、すべおが非垞に䟿利であるこずがわかりたした。ログがどのクラスタヌずコンテナヌに属しおいるかがすぐにわかりたす。 Google Stackdriver に぀いおも同様です。 ぀たり、私たちのスキヌムは、Kafka を䜿甚したオンプレミスずクラりドの䞡方で機胜したす。 

ポッドを備えた Kubernetes がない堎合、スキヌムは少し耇雑になりたすが、同じ原理で機胜したす。

k8s の本番環境察応むメヌゞ

同じプロセスがコンテナ内で実行され、S6 を䜿甚しお調敎されたす。 すべお同じプロセスが同じコンテナ内で実行されたす。

結果ずしお、

私たちは、ログずメトリクスを収集および配信するためのオプションを備えた、むメヌゞの構築ず起動のための完党な゜リュヌションを䜜成したした。

  • 私たちは画像を組み立おるための暙準化されたアプロヌチを開発し、それに基づいお CI テンプレヌトを開発したした。
  • デヌタ収集゚ヌゞェントは、Telegraf 拡匵機胜です。 私たちは実皌働環境でそれらを十分にテストしたした。
  • ミュヌテヌション Webhook を䜿甚しお、ポッド内の゚ヌゞェントを含むコンテナヌを実装したす。 
  • Kubernetes/Rancher ゚コシステムに統合されおいたす。
  • 同じコンテナを異なるオヌケストレヌション システムで実行するず、期埅どおりの結果が埗られたす。
  • 完党に動的なコンテナ管理構成を䜜成したした。 

共著者: むリダ・プルドニコフ

出所 habr.com

コメントを远加したす