Amazon CloudWatch Container Insights
オブザーバビリティのベストプラクティスガイドのこのセクションでは、Amazon CloudWatch Container Insights に関連する以下のトピックについて詳しく説明します:
- Amazon CloudWatch Container Insights の概要
- AWS Distro for OpenTelemetry を使用した Amazon CloudWatch Container Insights の活用
- Amazon EKS における CloudWatch Container Insights での Fluent Bit の統合
- Amazon EKS での Container Insights によるコスト削減
- EKS Blueprints を使用した Container Insights のセットアップ
はじめに
Amazon CloudWatch Container Insights は、コンテナ化されたアプリケーションとマイクロサービスからメトリクスとログを収集、集約、要約するのに役立ちます。メトリクスデータは、埋め込みメトリクスフォーマット を使用してパフォーマンスログイベントとして収集されます。これらのパフォーマンスログイベントは、高カーディナリティデータをスケールに応じて取り込み、保存できる構造化された JSON スキーマを使用します。このデータから、CloudWatch はクラスター、ノード、Pod、タスク、サービスレベルで集約されたメトリクスを CloudWatch メトリクスとして作成します。Container Insights が収集するメトリクスは、CloudWatch の自動ダッシュボードで利用できます。Container Insights は、セルフマネージドノードグループ、マネージドノードグループ、AWS Fargate プロファイルを持つ Amazon EKS クラスターで利用できます。
コスト最適化の観点から、また Container Insights のコストを管理するために、CloudWatch はログデータから可能なすべてのメトリクスを自動的に作成するわけではありません。ただし、CloudWatch Logs Insights を使用して生のパフォーマンスログイベントを分析することで、追加のメトリクスとより詳細な粒度を表示できます。Container Insights によって収集されるメトリクスはカスタムメトリクスとして課金されます。CloudWatch の料金について詳しくは、Amazon CloudWatch の料金 をご覧ください。
Amazon EKS では、Container Insights は Amazon Elastic Container Registry を通じて Amazon が提供する CloudWatch エージェント のコンテナ化バージョンを使用して、クラスター内で実行中のすべてのコンテナを検出します。その後、パフォーマンススタックのあらゆる層でパフォーマンスデータを収集します。Container Insights は、収集するログとメトリクスに対して AWS KMS キーによる暗号化をサポートしています。この暗号化を有効にするには、Container Insights データを受け取るロググループに対して AWS KMS 暗号化を手動で有効にする必要があります。これにより、CloudWatch Container Insights は提供された AWS KMS キーを使用してこのデータを暗号化します。対称キーのみがサポートされており、ロググループの暗号化に非対称 AWS KMS キーはサポートされていません。Container Insights は Linux インスタンスでのみサポートされています。Amazon EKS 向け Container Insights は、これらの AWS リージョンでサポートされています。
AWS Distro for Open Telemetry を使用した Amazon CloudWatch Container Insights
ここでは、Amazon EKS ワー クロードから Container Insights メトリクスの収集を可能にするオプションの 1 つである AWS Distro for OpenTelemetry (ADOT) について詳しく説明します。AWS Distro for OpenTelemetry (ADOT) は、OpenTelemetry プロジェクトの AWS がサポートする安全なディストリビューションです。
ADOT を使用すると、アプリケーションを一度だけ計装することで、相関のあるメトリクスとトレースを複数のモニタリングソリューションに送信できます。CloudWatch Container Insights 向けの ADOT サポートにより、お客様は Amazon Elastic Cloud Compute (Amazon EC2) 上で実行されている Amazon EKS クラスターから CPU、メモリ、ディスク、ネットワーク使用量などのシステムメトリクスを収集できます。これは Amazon CloudWatch エージェントと同じ体験を提供します。
ADOT Collector は、Amazon EKS および AWS Fargate プロファイル for Amazon EKS 向けの CloudWatch Container Insights のサポートを提供しています。お客様は、Amazon EKS クラスターにデプロイされた Pod の CPU やメモリ使用率などのコンテナと Pod のメトリクスを収集し、既存の CloudWatch Container Insights の体験を変更することなく CloudWatch ダッシュボードで確認できるようになりました。これにより、お客様はトラフィックに応じてスケールアップまたはダウンを判断し、コストを削減することができます。
ADOT Collector には、Receiver、Processor、Exporter という 3 つの主要なコンポーネントで構成されるパイプラインの概念があります。Receiver は、データがコレクターに取り込まれる方法です。指定された形式でデータを受け取り、内部形式に変換し、パイプラインで定義された Processors と Exporters に渡します。これはプルまたはプッシュベースで行うことができます。
Processor は、受信されてからエクスポートされるまでの間にデータのバッチ処理、フィルタリング、変換などのタスクを実行するためのオプションのコンポーネントです。Exporter は、メトリクス、ログ、またはトレースを送信する宛先を決定するために使用されます。コレクターのアーキテクチャでは、YAML 設定を通じてこのようなパイプラインの複数のインスタンスを定義できます。 以下の図は、Amazon EKS および Fargate プロファイル付きの Amazon EKS にデプロイされた ADOT Collector インスタンスのパイプラインコンポーネントを示しています。
図:Amazon EKS にデプロイされた ADOT Collector インスタンスのパイプラインコンポーネント
上記のアーキテクチャでは、パイプラインで AWS Container Insights Receiver のインスタンスを使用し、Kubelet から直接メトリクスを収集しています。AWS Container Insights Receiver (awscontainerinsightreceiver
) は、CloudWatch Container Insights をサポートする AWS 固有の Receiver です。
CloudWatch Container Insights は、コンテナ化されたアプリケーションとマイクロサービスからメトリクスとログを収集、集約、要約します。データは 埋め込みメトリクスフォーマット を使用してパフォーマンスログイベントとして収集されます。EMF データから、Amazon CloudWatch はクラスター、ノード、Pod、タスク、サービスレベルで集約された CloudWatch メトリクスを作成できます。以下は awscontainerinsightreceiver
設定のサンプル例です:
receivers:
awscontainerinsightreceiver:
# all parameters are optional
collection_interval: 60s
container_orchestrator: eks
add_service_as_attribute: true
prefer_full_pod_name: false
add_full_pod_name_metric_label: false
これには、上記の設定を使用して Amazon EKS 上に DaemonSet としてコレクターをデプロイすることが含まれます。また、 この Receiver が Kubelet から直接収集する、より完全なメトリクスセットにアクセスできます。クラスター内のすべてのノードからリソースメトリクスを収集するには、ADOT Collector の複数のインスタンスがあれば十分です。ADOT Collector の単一インスタンスは高負荷時に過負荷になる可能性があるため、常に複数のコレクターをデプロイすることをお勧めします。
図:Fargate プロファイル付き Amazon EKS にデプロイされた ADOT Collector インスタンスのパイプラインコンポーネント
上記のアーキテクチャでは、Kubernetes クラスター内のワーカーノード上の Kubelet が、/metrics/cadvisor エンドポイントで CPU、メモリ、ディスク、ネットワーク使用量などのリソースメトリクスを公開しています。しかし、EKS Fargate のネットワークアーキテクチャでは、Pod がそのワーカーノード上の Kubelet に直接アクセスすることはできません。
そのため、ADOT Collector は Kubernetes API サーバーを呼び出してワーカーノード上の Kubelet への接続をプロキシし、そのノード上のワークロードの Kubelet の cAdvisor メトリクスを収集します。これらのメトリクスは Prometheus 形式で利用可能です。したがって、コレクターは Prometheus サーバーの代替として Prometheus Receiver のインスタンスを使用し、Kubernetes API サーバーエンドポイントからこれらのメト リクスをスクレイピングします。
Kubernetes サービスディスカバリを使用して、Receiver は EKS クラスター内のすべてのワーカーノードを検出できます。したがって、クラスター内のすべてのノードからリソースメトリクスを収集するには、ADOT Collector の複数のインスタンスがあれば十分です。ADOT Collector の単一インスタンスは高負荷時に過負荷になる可能性があるため、常に複数のコレクターをデプロイすることをお勧めします。
メトリクスは、フィルタリング、名前の変更、データの集約と変換などを実行する一連の Processor を通過します。以下は、上記の Amazon EKS 用の ADOT Collector インスタンスのパイプラインで使用される Processor のリストです。
- Filter Processor は、名前に基づいてメトリクスを含めるか除外するための AWS OpenTelemetry ディストリビューションの一部です。不要なメトリクスをフィルタリングするために、メトリクス収集パイプラインの一部として使用できます。たとえば、Container Insights でネットワーク関連のメトリクス(名前のプレフィックスが
pod_network
のもの)を除外し、Pod レベルのメトリクス(名前のプレフィックスがpod_
のもの)のみを収集したい場合があります。
# filter out only renamed metrics which we care about
filter:
metrics:
include:
match_type: regexp
metric_names:
- new_container_.*
- pod_.*
- Metrics Transform Processor は、メトリクスの名前変更、ラベルキーと値の追加、名前変更、削除に使用できます。また、ラベルまたはラベル値全体でメトリクスのスケーリングと集約を実行するためにも使用できます。
metricstransform/rename:
transforms:
- include: container_spec_cpu_quota
new_name: new_container_cpu_limit_raw
action: insert
match_type: regexp
experimental_match_labels: {"container": "\\S"}
- Cumulative to Delta Processor は、単調 増加の累積和とヒストグラムメトリクスを単調増加のデルタメトリクスに変換します。非単調増加の和と指数ヒストグラムは除外されます。
` # convert cumulative sum datapoints to delta
cumulativetodelta:
metrics:
- pod_cpu_usage_seconds_total
- pod_network_rx_errors`
- Delta to Rate Processor は、デルタ和メトリクスをレートメトリクスに変換します。このレートはゲ ージです。
` # convert delta to rate
deltatorate:
metrics:
- pod_memory_hierarchical_pgfault
- pod_memory_hierarchical_pgmajfault
- pod_network_rx_bytes
- pod_network_rx_dropped
- pod_network_rx_errors
- pod_network_tx_errors
- pod_network_tx_packets
- new_container_memory_pgfault
- new_container_memory_pgmajfault
- new_container_memory_hierarchical_pgfault
- new_container_memory_hierarchical_pgmajfault`
- Metrics Generation Processor は、与えられたルールに従って既存のメトリクスを使用して新しいメトリクスを作成するために使用できます。
experimental_metricsgeneration/1:
rules:
- name: pod_memory_utilization_over_pod_limit
unit: Percent
type: calculate
metric1: pod_memory_working_set
metric2: pod_memory_limit
operation: percent
パイプラインの最後のコンポーネントは AWS CloudWatch EMF Exporter で、メトリクスを埋め込みメトリクスフォーマット (EMF) に変換し、PutLogEvents API を使用して CloudWatch Logs に直接送信します。以下は、Amazon EKS 上で実行されている各ワークロードについて ADOT Collector が CloudWatch に送信するメトリクスのリストです。
- pod_cpu_utilization_over_pod_limit
- pod_cpu_usage_total
- pod_cpu_limit
- pod_memory_utilization_over_pod_limit
- pod_memory_working_set
- pod_memory_limit
- pod_network_rx_bytes
- pod_network_tx_bytes
各メトリクスには以下 のディメンションセットが関連付けられ、ContainerInsights という CloudWatch 名前空間の下で収集されます。
- ClusterName, LaunchType
- ClusterName, Namespace, LaunchType
- ClusterName, Namespace, PodName, LaunchType
さらに、ADOT の Container Insights Prometheus サポート および CloudWatch Container Insights を使用して Amazon EKS リソースメトリクスを可視化するための Amazon EKS への ADOT Collector のデプロイ について学習し、Amazon EKS クラスターで ADOT Collector パイプラインをセットアップし、CloudWatch Container Insights で Amazon EKS リソースメトリクスを可視化する方法を確認してください。
また、Amazon CloudWatch Container Insights を使用したコンテナ化アプリケーションの簡単なモニタリング を参照してください。これには、Amazon EKS クラスターの設定、コンテナ化アプリケーションのデプロイ、Container Insights を使用したアプリケーションのパフォーマンスモニタリングに関するステップバイステップの手順が含まれています。
Amazon EKS 向け CloudWatch Container Insights における Fluent Bit の統合
Fluent Bit は、オープンソースのマルチプラットフォームログプロセッサおよびフォワーダーで、さまざまなソースからデータとログを収集し、それらを統合して CloudWatch Logs を含むさまざまな送信先に送信することができます。また、Docker や Kubernetes 環境とも完全に互換性があります。新しく導入された Fluent Bit デーモンセットを使用することで、EKS クラスターからコンテナログを CloudWatch Logs に送信し、ログの保存と分析を行うことができます。
軽量な特性を活かし、EKS ワーカーノードの Container Insights でデフォルトのログフォワーダーとして Fluent Bit を使用することで、アプリケーションログを効率的かつ確実に CloudWatch Logs にストリーミングできます。Fluent Bit を使用することで、Container Insights は Pod レベルでの CPU とメモリ使用量の面で特に効率的に、数千の重要なビジネスログを大規模に配信することができます。つまり、以前使用されていたログフォワーダーの FluentD と比較して、Fluent Bit はリソースフットプリントが小さく、結果としてメモリと CPU のリソース効率が向上します。一方、Fluent Bit と関連プラグインを含む AWS for Fluent Bit イメージ は、AWS エコシステム内での統一されたエクスペリエンスを提供することを目的としているため、Fluent Bit に新しい AWS 機能をより迅速に採用する柔軟性を追加で提供します。
以下のアーキテクチャは、EKS 向け CloudWatch Container Insights で使用される個々のコンポーネントを示しています:
図:EKS 向け CloudWatch Container Insights で使用される個々のコンポーネント
コンテナを扱う際は、Docker JSON ロギングドライバーを使用して、アプリケーションログを含むすべてのログを可能な限り標準出力 (stdout) と標準エラー出力 (stderr) を通じて出力することが推奨されます。このため、EKS ではロギングドライバーがデフォルトで設定されており、コンテナ化されたアプリケーションが stdout
または stderr
に書き込むすべての内容は、ワーカーノードの "/var/log/containers"
配下の JSON ファイルにストリーミングされます。Container Insights は、これらのログをデフォルトで 3 つのカテゴリに分類し、Fluent Bit 内に専用の入力ストリームを作成し、CloudWatch Logs 内に独立したロググループを作成します。これらのカテゴリは以下の通りです:
-
アプリケーションログ:
"/var/log/containers/*.log"
配下に保存されるすべてのアプリケーションログは、専用の/aws/containerinsights/Cluster_Name/application
ロググループにストリーミングされます。kube-proxy や aws-node ログなどの非アプリケーションログは、デフォルトで除外されます。ただし、CoreDNS ログなどの追加の Kubernetes アドオンログも処理され、このロググループにストリーミングされます。 -
ホストログ:各 EKS ワーカーノードのシステムログは、
/aws/containerinsights/Cluster_Name/host
ロググループにストリーミングされます。これらのシステムログには、"/var/log/messages,/var/log/dmesg,/var/log/secure"
ファイルの内容が含まれます。コンテナ化されたワークロードはステートレスで動的な性質を持ち、EKS ワーカーノードはスケーリング活動中に終了されることが多いため、Fluent Bit でこれらのログをリアルタイムにストリーミングし、ノードが終了した後でも CloudWatch Logs でこれらのログを利用できることは、EKS ワーカーノードの可観測性とヘルスモニタリングの観点から重要です。また、多くの場合、ワーカーノードにログインすることなくクラスターの問題をデバッグまたはトラブルシューティングし、これらのログをより体系的に分析することができます。 -
データプレーンログ:EKS はすでにコントロールプレーンログを提供しています。Container Insights の Fluent Bit 統合により、各ワーカーノードで実行され、実行中の Pod の維持を担当する EKS データプレーンコンポーネントによって生成されるログは、データプレーンログとして取得されます。これらのログも
'/aws/containerinsights/Cluster_Name/dataplane'
配下の専用の CloudWatch ロググループにストリーミングされます。kube-proxy、aws-node、Docker ランタイムログがこのロググループに保存されます。コントロールプレーンログに加えて、データプレーンログを CloudWatch Logs に保存することで、EKS クラスターの完全な全体像を提供するのに役立ちます。
さらに、Fluent Bit の設定、Fluent Bit のモニタリング、ログ分析などのトピックについては、Amazon EKS における Fluent Bit の統合 で詳しく学んでください。
Amazon EKS における Container Insights のコスト削減
デフォルトの設定では、Container Insights レシーバーは レシーバーのドキュメント で定義されている完全なメトリクスセットを収集します。 収集されるメトリクスとディメンションの数は多く、大規模なクラスターでは、メトリクスの取り込みと保存のコストが大幅に増加します。 ここでは、価値のあるメトリクスのみを送信してコストを削減するために、ADOT Collector を設定する 2 つの異なるアプローチを紹介します。