ElasticオブザーバビリティでKubernetesクラスターを管理する

オペレーションエンジニア(SRE、ITマネージャー、DevOps)は、無秩序に増加するテクノロジーやデータの管理にいつも頭を悩ませています。Kubernetesの利用は加速しており、そのデプロイ先についてはAmazon Elastic Kubernetes Service(EKS)、Google Kubernetes Engine(GKE)、Azure Kubernetes Service(AKS)が大半を占めています。単一のクラウドにのみデプロイする場合もありますが、複数のKubernetesクラウドサービスにデプロイしてクラスター管理の手間が増えることもあります。クラウドプロバイダーのややこしさに加えて、デプロイした多数のサービスから生成される大量のオブザーバビリティデータやテレメトリーデータも管理しなければなりません。

Kubernetesクラスターとそこで実行されるアプリケーションで生成されるログ、メトリック、トレースからそれらのステータスや状態を把握する日々の業務は、とてつもない課題となるでしょう。しかし、オペレーションエンジニアの立場では、こうした重要なデータはすべて、問題の予防、予測、修正に欠かせません。ただ、トラブルシューティングやサポートのためにKubernetesのテレメトリーデータを可視化して分析しなければならない場合に、複数のツールに散在するメトリック、ログ、トレースの全量が不要なことは間違いありません。

Elasticオブザーバビリティは、Elasticが得意とするロギングだけでなく、多岐にわたる一元的なオブザーバビリティ機能を備えており、膨大なKubernetesのメトリックやログの管理に役立ちます。OpenTelemetryとAPMエージェントを通じてあらゆるメトリック、ログ、トレースデータを一元化することで、Kubernetesクラスターとそこで実行されるアプリケーションの稼働状況についてきめ細かなインサイトやコンテキストを得られます。

Elasticオブザーバビリティであれば、クラスターの場所(EKS、GKE、AKS、セルフマネージド)やアプリケーションに関係なく、Kubernetesの監視をシンプルに行えます。ノード、ポッド、コンテナー、アプリケーション、インフラ(AWS、GCP、Azure)のメトリック、インフラやアプリのログ、そしてアプリケーショントレースのすべてを、Elasticオブザーバビリティで監視できます。

このブログでは、以下について説明します。

  • Elastic Cloudで、ホストのログやメトリック(システムメトリック、コンテナーの統計)およびKubernetes上で実行されているあらゆるサービスのログを取り込むElastic Agent(DaemonSetとしてクラスターに簡単にデプロイ可能)を使用して、メトリックやログデータを集約して取り込む方法
  • ElasticオブザーバビリティであらゆるKubernetesクラスターコンポーネント(ポッド、ノード、サービス、名前空間など)のテレメトリーデータ(ログ、メトリック、トレース)を一元化する方法
Elastic AgentとKubernetes統合
Elastic AgentとKubernetes統合

前提条件と構成

このブログの内容を実際に試してみたい方のために、本デモに使用したコンポーネントと詳細設定を以下に挙げます。

  • Elastic Cloudにアカウントがあり、デプロイしたスタックがあること(手順はこちら)。
  • デモにはGKEを使用しましたが、Kubernetesクラスターのデプロイ先はどこでも構いません。
  • 非常に人気の高いHipsterShopデモアプリケーションのバリアントを使用しました。このアプリケーションは元々、Kubernetesを紹介するためにGoogleが作成したもので、OpenTelemetry Demoアプリをはじめとする多数のバリアントが存在します。このアプリを使用するには、こちらにアクセスして、指示に従ってデプロイしてください。Kubernetesのメトリックを取り込むためのotelcollectorをデプロイする必要はありません。これについては後ほど説明します。
  • ElasticはPrometheusとFluentDからのネイティブインジェストに対応していますが、このブログではElastic Agentを介してKubernetesクラスターから直接取り込む方法をご紹介します。ElasticでPrometheusやFluentD/bitからテレメトリーを取り込む方法については、続編のブログでご紹介する予定です。

Elasticで監視および分析できる対象

Elasticを設定してKubernetesクラスターのメトリックやログを取り込み可視化する手順について説明する前に、利便性の高いElasticのダッシュボードを簡単にご紹介します。

前述のとおり、GKE上でHipsterShopのバリアントを実行し、Kubernetes統合でElastic AgentをGKEクラスター上にDaemonSetとしてデプロイしました。エージェントをデプロイすると、ElasticはKubernetesクラスター(厳密に言えばkube-state-metrics)からメトリックの取り込みを開始し、さらにクラスターからすべてのログ情報を取り込みます。

ElasticオブザーバビリティでKubernetesのメトリックを可視化する

ここでは、Elasticオブザーバビリティに用意されている設定不要の(OOTB)Kubernetesダッシュボードをいくつかご紹介します。

Elastic Kubernetes概要ダッシュボードに表示されるHipsterShopクラスターのメトリック
Elastic Kubernetes概要ダッシュボードに表示されるHipsterShopクラスターのメトリック
ElasticオブザーバビリティのHipsterShopのdefault名前空間ポッドダッシュボード
ElasticオブザーバビリティのHipsterShopのdefault名前空間ポッドダッシュボード

Elasticには、クラスター概要ダッシュボードやポッドダッシュボードのほかにも、以下のような便利なOOTBダッシュボードが複数用意されています。

  • Kubernetes概要ダッシュボード(上図)
  • Kubernetesポッドダッシュボード(上図)
  • Kubernetesノードダッシュボード
  • Kubernetesデプロイダッシュボード
  • Kubernetes DaemonSetsダッシュボード
  • Kubernetes StatefulSetsダッシュボード
  • Kubernetes CronJob & Jobsダッシュボード
  • Kubernetesサービスダッシュボード
  • 今後定期的に追加予定

これらのダッシュボードをカスタマイズしたり、独自のダッシュボードを作成することもできます。

Elasticオブザーバビリティでログを取り扱う

KubernetesコンテナーのログとElastic Agentのログ
KubernetesコンテナーのログとElastic Agentのログ

上の図からわかるように、KubernetesクラスターでElastic Agentを使用すると、KubernetesクラスターのメトリックだけでなくKubernetesのログもすべて取得できます。

問題を予防し、予測し、修正する

Elasticはメトリックやログの管理だけでなく、クラスターテレメトリーの異常を検知および予防するのにも役立ちます。Elasticでデータの機械学習を有効にするだけで、分析作業を強化できます。下図のように、ElasticではKubernetesクラスターのログやメトリックを一元的に監視できるだけでなく、機械学習ならではの幅広い力を活用して分析や管理を強化することもできます。

Elasticオブザーバビリティでのログの異常検知
Elasticオブザーバビリティでのログの異常検知
Elasticオブザーバビリティを使用したKubernetesポッドの問題分析
Elasticオブザーバビリティを使用したKubernetesポッドの問題分析

上のグラフはログの異常検知の様子であり、9月21日~23日の期間における怪しいログを示しています。下のグラフでは、9月上旬と下旬にCPUの問題が発生したと示しているkubernetes.pod.cpu.usage.nodeメトリックを分析し、詳細を掘り下げています。クラスターテレメトリーについては、機械学習によるマルチメトリック分析と集団分析を組み合わせて、上に示した単一メトリックの問題よりも複雑な分析を実行できます。

Elasticには、Kubernetesクラスターテレメトリーの分析を強化する優れた機械学習機能が用意されています。Elasticにテレメトリーデータを取り込む方法はとても簡単であり、次のセクションでその手順について説明します。

設定手順

GKE上にデプロイしたHipsterShopアプリケーションのメトリック、ログ、トレースをElasticに取り込む方法について順を追って説明します。

まずはお好きなバージョンのHipsterShopを選んでください。前述のとおり、このデモでは、OTelがすでにあったのでOpenTelemetry-Demoのバリアントを使用しています。ただし、バリアントはこのブログ用にスリム化しました(一部の言語によるサービスを減らしました)。

手順0:Elastic Cloudのアカウントを取得する

手順1:Kubernetesクラスターを用意してKubernetesアプリをデプロイする

任意のクラウドサービスまたはローカルKubernetesプラットフォーム上のKubernetesクラスターにアプリをデプロイします。Kubernetes上でアプリを起動すると、default名前空間で以下のポッド(または何らかのバリアント)が実行されます。

NAME                                    READY   STATUS    RESTARTS   AGE
adservice-8694798b7b-jbfxt              1/1     Running   0          4d3h
cartservice-67b598697c-hfsxv            1/1     Running   0          4d3h
checkoutservice-994ddc4c4-p9p2s         1/1     Running   0          4d3h
currencyservice-574f65d7f8-zc4bn        1/1     Running   0          4d3h
emailservice-6db78645b5-ppmdk           1/1     Running   0          4d3h
frontend-5778bfc56d-jjfxg               1/1     Running   0          4d3h
jaeger-686c775fbd-7d45d                 1/1     Running   0          4d3h
loadgenerator-c8f76d8db-gvrp7           1/1     Running   0          4d3h
otelcollector-5b87f4f484-4wbwn          1/1     Running   0          4d3h
paymentservice-6888bb469c-nblqj         1/1     Running   0          4d3h
productcatalogservice-66478c4b4-ff5qm   1/1     Running   0          4d3h
recommendationservice-648978746-8bzxc   1/1     Running   0          4d3h
redis-cart-96d48485f-gpgxd              1/1     Running   0          4d3h
shippingservice-67fddb767f-cq97d        1/1     Running   0          4d3h

手順2:kube-state-metricsを有効にする

次に、kube-state-metricsを有効にする必要があります。

まず、以下のコマンドを実行します。

git clone https://github.com/kubernetes/kube-state-metrics.git

次に、サンプルディレクトリ下にあるkube-state-metricsディレクトリで、標準設定を適用します。

kubectl apply -f ./standard

これでkube-state-metricsが有効になり、kube-system名前空間で以下のようなポッドが実行されます。

kube-state-metrics-5f9dc77c66-qjprz                    1/1     Running   0          4d4h

手順3:Kubernetes統合でElastic Agentをインストールする

Kubernetes統合を追加する:

  1. Elasticで、統合機能に移動して[Kubernetes Integration](Kubernetes統合)を選択し、[Add Kubernetes](Kubernetesの追加)を選択します。
  2. Kubernetes統合の名前を指定します。
  3. 設定画面でkube-state-metricsを有効にします。
  4. new-agent-policy-name](新規エージェントポリシー名)テキストボックスで、設定に名前を付けます。
  5. 設定を保存します。これで、統合とポリシーを作成できました。

エージェントポリシーの内容とElastic Agentでの使用方法については、こちらをご覧ください。

  1. Kubernetes統合を追加します。
  2. 次に、先ほど作成したポリシーを選択します。
  3. [Add Agent](エージェントの追加)のステップ3で、マニフェストをクリップボードにコピーするかダウンロードします。
  4. kubectlを実行しているシェルにマニフェストを追加してelastic-agent-managed-kubernetes.yamlとして保存し、以下のコマンドを実行します。
kubectl apply -f elastic-agent-managed-kubernetes.yaml

kube-system名前空間に、DaemonSetの一部として多数のエージェントが表示されます。

NAME                                                   READY   STATUS    RESTARTS   AGE
elastic-agent-qr6hj                                    1/1     Running   0          4d7h
elastic-agent-sctmz                                    1/1     Running   0          4d7h
elastic-agent-x6zkw                                    1/1     Running   0          4d7h
elastic-agent-zc64h                                    1/1     Running   0          4d7h

このデモのクラスターでは、4つのノードと4つのelastic-agentsがDaemonSetの一部として起動しています。

手順4:Elasticの設定不要の(OOTB)ダッシュボードでKubernetesメトリックを確認し、Kubernetesログの検知を開始する

手順の名前どおりです。すべてのダッシュボードにメトリックが取り込まれていれば成功です。特定のポッドのログを表示するには、Kibanaの[Discover](ディスカバリ)に移動してそのポッド名を検索するだけです。

Elastic Kubernetes概要ダッシュボードに表示されるHipsterShopクラスターのメトリック
Elastic Kubernetes概要ダッシュボードに表示されるHipsterShopクラスターのメトリック
ElasticオブザーバビリティのHipsterShopのdefault名前空間ポッドダッシュボード
ElasticオブザーバビリティのHipsterShopのdefault名前空間ポッドダッシュボード

さらに、Elasticで直接すべてのポッドのログを参照することもできます。

frontendServiceとcartServiceのログ
frontendServiceとcartServiceのログ

上の例では、frontendServiceとcartServiceのログを検索しています。

手順5:おまけ

今回はOTelベースのアプリケーションを使用したため、アプリケーショントレースも取り込むことができます。詳細は別のブログでご紹介します。

ここでは、ElasticオブザーバビリティでHipsterShopのフロントエンドトランザクションのトレースが表示されている様子だけを簡単に示します。

HipsterShopの決済トランザクションのトレース
HipsterShopの決済トランザクションのトレース

まとめ:ElasticオブザーバビリティはKubernetesの監視に最適

Kubernetesクラスターからは、たとえシンプルなデプロイであっても複雑なメトリック、ログ、トレースデータが生成されるものです。本記事にて、これらのクラスターやメトリック、ログ、トレースデータの管理にElasticオブザーバビリティが役立つことをご理解いただけたなら幸いです。

以下に、この記事で説明した内容を簡単にまとめます。

  • DaemonSetとしてクラスターに簡単にデプロイしホストのメトリック(システムメトリック、コンテナーの統計)およびKubernetes上で実行されているあらゆるサービスのメトリックを取り込めるElastic Agentを使用して、Elastic Cloudでメトリックやログデータを集約して取り込む方法
  • ElasticであらゆるKubernetesクラスターコンポーネント(ポッド、ノード、サービス、名前空間など)のテレメトリーデータ(Kubernetesのログ、メトリック、トレース)を一元化する方法
  • MTTHH(平均勤務時間)を短縮するElasticの機械学習機能

準備は整いましたか?登録して、このブログで紹介した機能をぜひお試しください。