オペレーションエンジニア(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 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には、クラスター概要ダッシュボードやポッドダッシュボードのほかにも、以下のような便利なOOTBダッシュボードが複数用意されています。
- Kubernetes概要ダッシュボード(上図)
- Kubernetesポッドダッシュボード(上図)
- Kubernetesノードダッシュボード
- Kubernetesデプロイダッシュボード
- Kubernetes DaemonSetsダッシュボード
- Kubernetes StatefulSetsダッシュボード
- Kubernetes CronJob & Jobsダッシュボード
- Kubernetesサービスダッシュボード
- 今後定期的に追加予定
これらのダッシュボードをカスタマイズしたり、独自のダッシュボードを作成することもできます。

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


上のグラフはログの異常検知の様子であり、9月21日~23日の期間における怪しいログを示しています。下のグラフでは、9月上旬と下旬にCPUの問題が発生したと示しているkubernetes.pod.cpu.usage.nodeメトリックを分析し、詳細を掘り下げています。クラスターテレメトリーについては、機械学習によるマルチメトリック分析と集団分析を組み合わせて、上に示した単一メトリックの問題よりも複雑な分析を実行できます。
Elasticには、Kubernetesクラスターテレメトリーの分析を強化する優れた機械学習機能が用意されています。Elasticにテレメトリーデータを取り込む方法はとても簡単であり、次のセクションでその手順について説明します。
GKE上にデプロイしたHipsterShopアプリケーションのメトリック、ログ、トレースをElasticに取り込む方法について順を追って説明します。
まずはお好きなバージョンのHipsterShopを選んでください。前述のとおり、このデモでは、OTelがすでにあったのでOpenTelemetry-Demoのバリアントを使用しています。ただし、バリアントはこのブログ用にスリム化しました(一部の言語によるサービスを減らしました)。
指示に従ってElastic Cloudの使用を始めます。

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
Kubernetes統合を追加する:
- Elasticで、統合機能に移動して[Kubernetes Integration](Kubernetes統合)を選択し、[Add Kubernetes](Kubernetesの追加)を選択します。
- Kubernetes統合の名前を指定します。
- 設定画面でkube-state-metricsを有効にします。
- [new-agent-policy-name](新規エージェントポリシー名)テキストボックスで、設定に名前を付けます。
- 設定を保存します。これで、統合とポリシーを作成できました。
エージェントポリシーの内容とElastic Agentでの使用方法については、こちらをご覧ください。


- Kubernetes統合を追加します。
- 次に、先ほど作成したポリシーを選択します。
- [Add Agent](エージェントの追加)のステップ3で、マニフェストをクリップボードにコピーするかダウンロードします。
- 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の一部として起動しています。


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

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

Kubernetesクラスターからは、たとえシンプルなデプロイであっても複雑なメトリック、ログ、トレースデータが生成されるものです。本記事にて、これらのクラスターやメトリック、ログ、トレースデータの管理にElasticオブザーバビリティが役立つことをご理解いただけたなら幸いです。
以下に、この記事で説明した内容を簡単にまとめます。
- DaemonSetとしてクラスターに簡単にデプロイしホストのメトリック(システムメトリック、コンテナーの統計)およびKubernetes上で実行されているあらゆるサービスのメトリックを取り込めるElastic Agentを使用して、Elastic Cloudでメトリックやログデータを集約して取り込む方法
- ElasticであらゆるKubernetesクラスターコンポーネント(ポッド、ノード、サービス、名前空間など)のテレメトリーデータ(Kubernetesのログ、メトリック、トレース)を一元化する方法
- MTTHH(平均勤務時間)を短縮するElasticの機械学習機能
準備は整いましたか?登録して、このブログで紹介した機能をぜひお試しください。