2018年7月12日 エンジニアリング

KubernetesとDockerのコンテナーをBeatsで監視:ログ、メトリック、メタデータ

著者 Dan Roscigno

このブログはコンテナー環境の監視に関するものです。コンテナー環境とは Google Kubernetes Engine(GKE)、 IBM Cloud Kubernetes Service 、や他のKubernetes(k8s)とDocker環境を含みます。このブログでは、IBM Cloud Kubernetes Serviceを使用しています。

KubernetesとDockerのコンテナーの監視についてなぜ説明しているのか疑問に思われるかもしれません。 確かに、クラウドプロバイダーがインフラストラクチャーを管理しているため、私はアプリのことだけを気にかければいいのかもしれません。 これは正しいかもしれませんが、私は個人的なアドバイスを受けてもYelpのレビューを確認するようなタイプの人間であり、より多くの情報を求めようとします。 アプリとその環境から利用できるすべてのログとメトリックを求めますし、それらすべてで検索、可視化、アラートを実行できるようにしたいのです。通常のコンテナーの監視はすばらしいですが、Kubernetesのイベントとメタデータを使用して、スケーリングやローリングアップデートに関する通知でアプリパフォーマンスに注釈を付けるすばらしい方法も紹介します。

先に進む前にいくつかの用語について定義させてください。

  • ログ: タイムスタンプとメッセージ。 「NGINXが13:42に開始されました」といったような典型的なログエントリ―や、「バックオフが16:20に失敗したコンテナーを再起動しているNGINXコンテナーがありました」といったようなk8sイベントが含まれます。
  • メトリック: 固定の期間に収集される数値測定。 「 eコマースサイトを通じた売上がこの10分間で5万ドルありました」または「14:00:00から14:00:10のCPU使用率が17%でした」というものです。

Kubernetesクラスターのアプリデプロイメント

たとえば、Apache HTTP Server、PHP、Redisで作られたこのようなアプリケーションを使用します。

k8s-module-1.png

さらに、アプリケーションとコンテナーインフラストラクチャーの監視のために、次のものを使用します。 

  • Elastic CloudでホストされているElasticsearch Serviceデプロイメント。
  • Beatsは、同じKubernetesクラスターのDaemonSetとして配備されるログとメトリックの軽量シッパーです。  Kubernetesクラスターで通常デプロイされているfluentdの代わりです。

ログとメトリック

上記のアプリケーションは、キャプチャーするはずの有益な情報を常に生成しているエコシステムの一部に過ぎません。以下はこれらのログとメトリックを収集するレベルです。

  1. オーケストレーション(Kubernetes)
  2. ホスト
  3. アプリケーション
  4. コンテナー(Docker)

k8s-module-2.png

データを収集するために、Beats(Filebeat、Metricbeat、Packetbeat)とアプリケーション(ApacheとRedis)のモジュール、System、Kubernetes、Dockerのモジュールを使用します。 各BeatをDaemonSetとしてデプロイし、Kubernetesが管理できるようにします。 大変なように聞こえてもパニックにならないでください。Beatsのオートディスカバーがシンプルさをキープします。  アプリケーションを監視するためのBeatsの詳細についてはこのブログと掲載のビデオで確認できます。  初歩から知りたい場合は、Elasticのコンテナー監視ページをチェックしてください。

データのインデックス、保存、検索、分析、可視化を行うために、ホストされているElasticsearch Serviceを使用しました。  Elasticsearch ServiceのElastic Cloudでのデプロイメントについては、「はじめに」のページで詳細が確認できます。 ご自身が管理しているシステムにElasticsearchとKibanaをデプロイするのも同様です。 どちらの方法でも問題ありません。

Beatsとモジュールについて触れましたが、もう少し説明しましょう。 Beatは、データをElasticsearchまたはLogstashに送信する軽量エージェントです。 Beatsは、物理システムや仮想システムのようなデータの生成元にデプロイします。たとえばDaemonSetとして(ここではこれを行いました)デプロイすることもあります。 モジュールは、共通ログフォーマットの収集、解析、インデックス、可視化を簡素化します。

ちょっとつまらなく聞こえたかもしれませんので別の言い方をします。Elasticモジュールは事前にパッケージ化されているエクスペリエンスです。 Apache HTTPD Serverの管理についてすべて知っているが、NGINXが初めてだとします。 NGINXについて知っている人に「ログで何を確認しますか? どのメトリックに注意しますか? 履歴ファイルからgrepをしてもらえますか? 」と質問するかもしれません。これらの質問に対する回答がBeatモジュールです。Kubernetes、Docker、NGINX、Apache、オペレーティングシステム、データベースなど多数のアイテムのために、ダッシュボード、保存された検索、解析、収集が事前にパッケージされています。 経験上、これは非常にパワフルな機能のセットだと言えます。

k8sモジュールは、ポッド、ノード、ボリューム、ReplicaSets、デプロイメントなどに関連するメトリックを収集します。 各メトリックには豊富なメタデータ群が付与されていて、データをアプリに結びつけることができます。 たとえば、ポッドxyzがメモリ使用量の制限に近づいていても気にしていないかもしれませんが、そのメトリックがアプリのフロントエンドに関連があると表示されれば、ビジネスに対して価値があることを認識できます。以下のビデオのパフォーマンスチャートを向上するために使用するイベント(Kubernetesイベントを上記のログ定義に含めたことを思い出してください)も収集します。

Dockerモジュールは、コンテナー、ホスト、メモリー、ネットワーク、ヘルスチェックなどに関連するメトリックを収集します。 Kubernetesモジュールのように、メタデータはアプリのパフォーマンスと環境を理解する上で非常に貴重です。

FilebeatMetricbeatには他のモジュールもたくさんあります。  さらに、Packetbeatは、Cassandra、 Flows、HTTP、MySQL、MongoDBなどのサービスの多数のダッシュボードを提供します。

データがアクション可能なインテリジェンスにどれだけ簡単に変換されるかをご確認ください。ビデオは次のような内容です。

  • Kubernetesイベントをアプリパフォーマンスメトリックで可視化
  • Metricbeat Kubernetesモジュールイベントメトリックセットを紹介
  • Kubernetesイベントをナビゲートし、カスタムな可視化を構築