Amazon CloudWatch Container Insights
このオブザーバビリティのベストプラクティスガイドのセクションでは、Amazon CloudWatch Container Insights に関連する以下のトピックについて詳しく説明します。
- Amazon CloudWatch Container Insights の概要
- AWS Distro for Open Telemetry を使用した Amazon CloudWatch Container Insights の使用
- Amazon EKS 向け CloudWatch Container Insights における Fluent Bit 統合
- Amazon EKS における Container Insights によるコスト削減
- EKS Blueprints を使用した Container Insights のセットアップ
はじめに
Amazon CloudWatch Container Insights は、コンテナ化されたアプリケーションとマイクロサービスからメトリクスとログを収集、集約、要約するのに役立ちます。メトリクスデータは、embedded metric format を使用してパフォーマンスログイベントとして収集されます。これらのパフォーマンスログイベントは、高カーディナリティデータを大規模に取り込んで保存できるようにする構造化された JSON スキーマを使用します。このデータから、CloudWatch はクラスター、ノード、ポッド、タスク、サービスレベルで集約されたメトリクスを 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 は CloudWatch エージェントのコンテナ化されたバージョンを使用します。これは Amazon が Amazon Elastic Container Registry 経由で提供しており、クラスター内で実行されているすべてのコンテナを検出します。その後、パフォーマンススタックのすべての階層でパフォーマンスデータを収集します。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 および Amazon EKS 用 AWS Fargate プロファイルの CloudWatch Container Insights サポートとともに利用でき るようになりました。お客様は、Amazon EKS クラスターにデプロイされたポッドの CPU やメモリ使用率などのコンテナおよびポッドメトリクスを収集し、既存の CloudWatch Container Insights エクスペリエンスを変更することなく CloudWatch ダッシュボードで表示できるようになりました。これにより、お客様はトラフィックに応じてスケールアップまたはスケールダウンするかどうかを判断し、コストを削減できるようになります。
ADOT Collector には、レシーバー、プロセッサー、エクスポーターという 3 つの主要なコンポーネントタイプで構成されるパイプラインの概念があります。レシーバーは、データがコレクターに取り込まれる方法です。指定された形式でデータを受け取り、内部形式に変換して、パイプラインで定義されたプロセッサーとエクスポーターに渡します。プル型またはプッシュ型のいずれかになります。プロセッサーは、データの受信とエクスポートの間に、バッチ処理、フィルタリング、変換などのタスクを実行するために使用されるオプションのコンポーネントです。エクスポーターは、メトリクス、ログ、またはトレースの送信先を決定するために使用されます。コレクターアーキテクチャでは、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 固有のレシーバーです。CloudWatch Container Insights は、コンテナ化されたアプリケーションとマイクロサービスからメトリクスとログを収集、集約、要約します。データは、埋め込みメトリクスフォーマットを使用してパフォーマンスログイベントとして収集されます。EMF データから、Amazon CloudWatch はクラスター、ノード、ポッド、タスク、サービスレベルで集約された 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 のインスタンスが 1 つだけの場合、高負荷時に過負荷になる可能性があるため、常に複数のコレクターをデプロイすることをお勧めします。

図: Fargate プロファイルを使用して Amazon EKS にデプロイされた ADOT Collector インスタンスのパイプラインコンポーネント
上記のアーキテクチャでは、Kubernetes クラスター内のワーカーノード上の kubelet が、/metrics/cadvisor エンドポイントで CPU、メモリ、ディスク、ネットワーク使用量などのリソースメトリクスを公開します。ただし、EKS Fargate ネットワークアーキテクチャでは、Pod はそのワーカーノード上の kubelet に直接到達することが許可されていません。そのため、ADOT Collector は Kubernetes API Server を呼び出してワーカーノード上の kubelet への接続をプロキシし、そのノード上のワークロードの kubelet の cAdvisor メトリクスを収集します。これらのメトリクスは Prometheus 形式で利用可能になります。したがって、Collector は Prometheus サーバーの代替として Prometheus Receiver のインスタンスを使用し、Kubernetes API サーバーエンドポイントからこれらのメトリクスをスクレイピングします。Kubernetes サービスディスカバリを使用することで、Receiver は EKS クラスター内のすべてのワーカーノードを検出できます。したがって、クラスター内のすべてのノードからリソースメトリクスを収集するには、複数の ADOT Collector インスタンスで十分です。ADOT Collector のインスタンスが 1 つだけの場合、高負荷時に過負荷になる可能性があるため、常に複数の Collector をデプロイすることをお勧めします。
メトリクスは、フィルタリング、名前変更、データ集約、変換などを実行する一連のプロセッサーを通過します。以下は、上記で示した Amazon EKS 用の ADOT Collector インスタンスのパイプラインで使用されるプロセッサーのリストです。
- Filter Processor は、AWS OpenTelemetry ディストリビューションの一部であり、メトリクス名に基づいてメトリクスを含めたり除外したりします。メトリクス収集パイプラインの一部として使用して、不要なメトリクスをフィルタリングできます。たとえば、Container Insights でポッドレベルのメトリクス (名前のプレフィックスが
pod_) ネットワーキング用のものを除き、名前プレフィックス付きpod_network.
# 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 サポートと、Amazon EKS に ADOT コレクターをデプロイして CloudWatch Container Insights を使用して Amazon EKS リソースメトリクスを可視化する方法について学習し、Amazon EKS クラスターで ADOT コレクターパイプラインをセットアップする方法と、CloudWatch Container Insights で Amazon EKS リソースメトリクスを可視化する方法を確認してください。さらに、Amazon CloudWatch Container Insights でコンテナ化されたアプリケーションを簡単に監視するを参照してください。これには、Amazon EKS クラスターの設定、コンテナ化されたアプリケーションのデプロイ、Container Insights を使用したアプリケーションのパフォーマンス監視に関する手順が含まれています。