heapster+influxdbはkubernetesクラスタ内のeventを収集する

4758 ワード

コンテナの白い1枚、先日指導者は私にどのようにクラスタの中のeventを処理するかを調査しさせて、masterノードでkubectl describe資源を通じてその中のeventを見てコンテナが出会ったいくつかの問題を解決することができますが、クラスタ全体のeventデータを収集して問題を分析するにはやはり強大なオープンソースコミュニティを借りなければなりません.調査の過程でheapsterは簡単に効率的にeventを収集することができて、heapsterは主に2つの大きな機能があることを発見しました.metricsとeventer,metricsはkubernetesクラスタ内のいくつかの性能指標を収集するために使用され,eventerはクラスタ内のイベントを収集する.Heapsterツールは現在廃棄されており、kubernetesは1.8バージョンからCPU、メモリなどのリソースのmetrics情報をMetrics APIで取得することができ、ユーザーはkubectl topで直接これらのmetrics情報を取得することもできる.Metrics APIはMetrics-Serverを配備する必要があります.Metrics-ServerはKubernetes 1.9バージョン以上の優先方法ですが、クラスタevent情報収集はサポートされていません.まず、このいくつかの概念を簡単に紹介します.
Event
eventを収集するには,まずkubernetesクラスタにおけるeventの脈絡を理解しなければならない.eventのソース:kubernetesのソースコードからeventインスタンスがEventsRecorderメンバーのメソッドEvent()、Eventf()、PastEventf()によって構築されていることがわかります.また、EventsRecorderメンバーを含むコンポーネントはKubeletとControllerManagerのみであり、クラスタ内のイベントは両方のコンポーネントによって生成されていると判断できます.たとえば,登録,ログアウトなどを管理するノードコントローラは,ノードの状態変化情報をEventsとして記録する.DeploymentControllerは、ロールバック、拡張などのEventsを記録します.ControllerManagerの起動時に初期化され、実行されます.一方、Kubeletは、Podにボリュームをマウントできない、帯域幅が整っていないなど、自身の実行時のEventsを記録するほか、docker_managerのような小さなユニットは、それぞれの役割を果たし、関連Eventsを記録します.eventの行方:KubeletおよびControllerManagerコンポーネントにはEventBroadcasterのインスタンスがあり、EventBroadcasterはtの各コンポーネントからEvenを生成し、EventSink、Watcher、およびLogに渡すために使用されます.EventSinkに書き込む前に、すべてのEventsを集約するなどの操作を行います.Eventsを同一と類似の2種類に分け,それぞれEventLoggerとEventAggregatorを用いて操作する.EventLoggerは、同じEventを1つにリセットし、その出現回数をカウントする.EventAggregatorは、EventのSource、InvolvedObject、Type、Reasonドメインに基づいて、10分以内に10回発生するEventをグループ化します.これにより、システムの長時間稼働時に発生する大量のEvent衝撃etcdを回避したり、大量のメモリを消費したりすることができます.EventAggregatorとEventLoggerは、以前に生成された重複しないEventsを格納する4096サイズのLRU Cacheを採用している.Cacheの範囲外のEventsは圧縮されます.
heapster
Heapsterはオープンソースのコンテナクラスタモニタリングと性能分析ツールであり、最後のバージョンのheapsterには主に2つの機能があり、クラスタのmetricsとeventsを収集している.Kubernetesには有名な監視カメラcAdvisorがあります.各kubernetesノードでcAdvisorが実行され、自機およびコンテナの監視データ(cpu,memory,filesystem,network,uptime)が収集されます.より新しいバージョンでは、K 8 SはcAdvisor機能をkubeletコンポーネントに統合しました.各ノードは、Webアクセスを直接行うことができます.Heapsterは収集者であり、各ノード上のcAdvisorのデータをまとめ、InfluxDBなどのサードパーティツールに導く.heapsterは現在廃棄されており、代わりにkubernetesが持参したmetrics-serverであるが、metrics-serverはクラスタイベント収集をサポートしていない.ワークフロー:heapsterはまずkubernetes Masterからクラスタ内のすべてのノードの情報を取得し、これらのノード上のkubeletから有用なデータを取得し、kubelet自体のデータはcAdvisorから取得します.取得したデータはすべてheapster構成のバックエンドストレージにプッシュされ、データの可視化もサポートされます.現在、InfluxDB+grafanaなどのバックエンドストレージ+可視化方法が使用されています.
influxdb
influxdbは、リアルタイムデータを格納するために一般的に使用されるオープンソース分散シーケンス、イベント、および指標データベースです.httpインタフェースのapiを提供してデータを操作し、sqlのようなデータベース文を提供します.3つの特性があります:時間シーケンス:最大、最小、和などの時間に関連する関数を使用してメトリックを計算できます:大量のデータをリアルタイムで計算できますeventsイベント:任意のイベントデータをサポートします
heapster+influxdbによるeventの収集と格納
以上のことから、クラスタ内のeventを収集および格納するためにheapsterとinfluxdbをインストールして配置します.heapster公式gitライブラリが推奨する導入方法はpodを導入することでheapsterとinfluxdbを使用し、グラフィックス化インタフェースの展示を実現するにはgarafnaをもう1つ追加することができます.公式インストールコマンドは簡単で、持参したyamlファイルでそれぞれpod、serviceなどを起動しますが、私は実際に配置する過程でいろいろな穴に遭遇しました.一つ目はミラーリングの問題です.公式サイトからもらったいくつかのyamlファイルの中で、使用する必要があるミラーファイルを指定しましたが、gcrからミラーリングを引くことはほとんどできません.事前に時速雲の向こうでミラーを地元の倉庫に引っ張ってからtag操作することができます.docker hubの公式heapsterミラーも使用できます.2つ目はheapsterとinfluxdbの通信はDNSを経て、クラスタはDNSを配置しなければならないが、会社のテストクラスタはDNSを配置していないので、初めてみんなのテスト環境を壊すのを恐れて、私はその中の1つのメインノードのホストの上でeventerバイナリファイルをコンパイルして実行して、influxdbをインストールして収集したデータを保存して、ネット上でheapster+influxdb—+grafanaの組み合わせの配置についての文章は多くて、すべて公式サイトの方法に基づいて、以下はホストの配置過程で、ホストの上で配置します:1.Heapster配備(1)githubからgopathのsrcディレクトリの下git cloneにプロジェクトをダウンロードまたはクローンするhttps://github.com/kubernetes/heapster.git(2)eventerバイナリ実行可能ファイルをコンパイルする.Influxdb配備(1)yumソースからinfluxdbをインストールする(2)インストール後、/usr/binの下に次のファイルがあります:Influxdb influxdbサーバInflux influxdbコマンドラインクライアントinflux_inspectビューツールinflux_stress圧力テストツールinflux_tsmデータベース変換ツール(データベースをb 1またはbz 1のフォーマットからtsm 1のフォーマットに変換する)は、/var/lib/influxdbディレクトリの下に、最終的に格納データ、ファイルをdataに格納するファイルがある.tsm末尾meta格納データベースメタデータwal格納プリライトログファイル(3)構成ファイルパス:/etc/influxdb/influxdb.confには多くの構成オプションがあり、構成のみが使用されます.
[meta]   dir = "/var/lib/influxdb/meta"
[data]    dir = "/var/lib/influxdb/data"
         wal-dir = "/var/lib/influxdb/wal"

クライアントはinfluxによって起動され、入力後のコマンドライン操作は基本的にSQL文操作と同様に使用される:eventerバイナリファイルのあるディレクトリに入り、eventerを実行し、heapsterによってeventをinfluxdbに収集するバックグラウンドプロセスを作成し、influxdb起動コマンドに格納する:
./eventer
--source=kubernetes:http://master_ip:8080inClusterConfig=false&useServiceAccount=false
--sink=influxdb:http://master_ip:8086
-sourceはeventデータ入力ソースを表し、ここではmasterノードの8080ポート(apiserver)から取得される.-sinkはeventが格納しているinfluxdbのアドレスとポート番号を表します.