View a markdown version of this page

Amazon EKS での OTel Container Insights の詳細設定 - Amazon CloudWatch

Amazon EKS での OTel Container Insights の詳細設定

このトピックでは、Amazon EKS での OTel Container Insights の詳細設定シナリオについて説明します。これらの設定を使用して、メトリクス収集のカスタマイズ、ログのフィルタリング、アカウント間のテレメトリの収集、カスタムディメンションの追加、大規模なクラスターのリソース割り当ての調整を行います。

前提条件

詳細設定を構成する前に、次の要件を満たしていることを確認します。

  • Amazon EKS クラスターに OTel Container Insights がインストールされ、ACTIVE ステータスになっている

  • Kubernetes バージョン 1.28 以降を実行している Amazon EKS クラスター

  • AWS CLI バージョン 2.15.0 以降

  • kubectl がターゲットクラスターと通信できるように設定されていること

  • IAM アクセス許可: eks:UpdateAddoneks:DescribeAddon、および iam:AttachRolePolicy (クロスアカウント設定に必要)

一般的な設定パターン

すべての詳細設定は同じパターンに従います。aws eks update-addon コマンドを使用して JSON 設定を amazon-cloudwatch-observability アドオンに渡します。

aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values 'JSON-configuration' \ --resolve-conflicts OVERWRITE
重要

--resolve-conflicts OVERWRITE フラグで、既存のアドオン設定が置き換えられます。既存の設定を保持するには、コマンドを実行する前に新しい設定とマージします。

ログのフィルタリング

特定の条件に一致するログを除外することで、CloudWatch Logs のコストを削減できます。ログフィルタリングを使用して、エージェントが CloudWatch に送信する前にデバッグレベルまたは詳細なログを削除します。

ログフィルタリングを設定するには
  1. 次のコマンドを実行して、ログフィルター設定でアドオンを更新します。cluster-name は、自分の Amazon EKS クラスターに置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{ "otelContainerInsights": { "enabled": true }, "agent": { "config": { "logs": { "metrics_collected": { "kubernetes": { "enhanced_container_insights": true } }, "exclude_filters": [ { "type": "log_level_filter", "log_level": "DEBUG" } ] } } } }' \ --resolve-conflicts OVERWRITE
  2. 更新後、アドオンのステータスが ACTIVE であることを確認します。

    aws eks describe-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text

exclude_filters 設定では、エージェントが CloudWatch Logs に送信する前に、指定されたログレベルに一致するログエントリが削除されます。これにより、ログの取り込み量とそれに伴うコストを削減できます。

マルチアカウント収集

クロスアカウント IAM ロールの引き受けを設定することで、ワークロードアカウントから中央モニタリングアカウントにテレメトリを送信できます。このアプローチでは、異なる AWS アカウントにわたる複数の Amazon EKS クラスターからのメトリクスとログを単一のビューで表示できます。

マルチアカウント収集を設定するには

モニタリングアカウントでクロスアカウントロールを作成するには
  1. 中央モニタリングアカウントで、ワークロードアカウントが引き受けることを許可する信頼ポリシーを持つ IAM ロールを作成します。workload-account-id をワークロードアカウントの AWS アカウント ID に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::workload-account-id:root" }, "Action": "sts:AssumeRole" } ] }
  2. CloudWatchAgentServerPolicy 管理ポリシーをクロスアカウントロールにアタッチします。

クロスアカウント配信用にアドオンを設定するには
  1. ワークロードアカウントで、アドオンを更新してクロスアカウントロールを引き受けます。cluster-name を Amazon EKS クラスターの名前に置き換え、monitoring-account-id を中央モニタリングアカウントのアカウントの AWS ID に置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{ "otelContainerInsights": { "enabled": true }, "agent": { "config": { "credentials": { "role_arn": "arn:aws:iam::monitoring-account-id:role/CrossAccountCWObservabilityRole" } } } }' \ --resolve-conflicts OVERWRITE
  2. 更新後、アドオンのステータスが ACTIVE であることを確認します。

    aws eks describe-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text

カスタムメトリクスディメンション

Kubernetes ラベルから派生したカスタムディメンションを Container Insights メトリクスに追加できます。カスタムディメンションを使用すると、チーム、環境、アプリケーション層などの詳細度を高めてメトリクスをフィルタリングおよびグループ化できます。

Kubernetes ラベルからカスタムディメンションを追加するには
  1. 次のコマンドを実行して、カスタムディメンションを設定します。cluster-name を Amazon EKS クラスターの名前に置き換え、label-key をディメンションとして使用する Kubernetes ラベルに置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{ "otelContainerInsights": { "enabled": true }, "agent": { "config": { "logs": { "metrics_collected": { "kubernetes": { "enhanced_container_insights": true, "metric_dimensions": { "custom_dimensions": ["label-key"] } } } } } } }' \ --resolve-conflicts OVERWRITE
  2. 更新後、アドオンのステータスが ACTIVE であることを確認します。

    aws eks describe-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text

設定が有効になると、指定された Kubernetes ラベルが CloudWatch の Container Insights メトリクスにディメンションとして表示されます。

大規模なクラスターのリソース調整

大規模なクラスターの場合、CloudWatch エージェント DaemonSet の CPU とメモリの制限を増やす必要がある場合があります。デフォルトのリソース割り当ては小さなクラスターに適していますが、大きなクラスターはより多くのテレメトリデータを生成し、追加のエージェントリソースを必要とします。

次の表に、クラスターサイズに基づくサイズ設定ガイドラインを示します。

クラスターサイズ CPU リクエスト CPU 制限 メモリリクエスト メモリ制限
小規模 (20 ノード以下) 100m 200m 128Mi 256Mi
中規模 (21~100 ノード) 200m 400m 256Mi 512Mi
大規模 (100 ノード以上) 300m 500m 384Mi 768Mi
超大規模 (500 ノード以上) 500m 1000m 512Mi 1Gi
エージェント DaemonSet のリソース制限を設定するには
  1. 次のコマンドを実行して、リソースリクエストと制限を設定します。cluster-name を Amazon EKS クラスターの名前に置き換え、リソース値を上記の表の値に置き換えます。

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{ "otelContainerInsights": { "enabled": true }, "agent": { "resources": { "requests": { "cpu": "cpu-request", "memory": "memory-request" }, "limits": { "cpu": "cpu-limit", "memory": "memory-limit" } } } }' \ --resolve-conflicts OVERWRITE
  2. アドオンのステータスが ACTIVE であり、エージェントポッドが新しいリソース割り当てで再起動することを確認します。

    aws eks describe-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text
  3. エージェントポッドが新しいリソース制限で実行されていることを確認します。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent -o jsonpath='{.items[0].spec.containers[0].resources}'

設定の変更を確認する

詳細設定を適用したら、アドオンが正常であり、エージェントポッドが正常に再起動したことを確認します。

設定の変更を確認するには
  1. アドオンのステータスが ACTIVE であることを確認します。cluster-name は、自分の Amazon EKS クラスターに置き換えます。

    aws eks describe-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --query "addon.{Status:status,ConfigValues:configurationValues}" \ --output table
  2. エージェントポッドが再起動し、Running ステータスになっていることを確認します。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent

    すべてのエージェントポッドは、最新の再起動時刻で Running ステータスになっている必要があります。

トラブルシューティング

詳細設定に関する一般的な問題を解決するには、次のガイダンスを使用します。

ConfigurationConflict でアドオンの更新が失敗する

症状: aws eks update-addon コマンドが ConfigurationConflict エラーを返します。

原因: 指定した JSON 設定の形式が正しくないか、無効なキーが含まれているためです。

解決策: この問題を解決するには、次の手順に従います。

  1. JSON linter を使用するか、次のコマンドを実行して、JSON 設定を検証します。

    echo 'your-json-configuration' | python3 -m json.tool
  2. すべての設定キーが amazon-cloudwatch-observability アドオンに対して有効であることを確認します。

  3. 修正した JSON で更新を再試行します。

モニタリングアカウントに表示されないクロスアカウントメトリクス

症状: マルチアカウント収集を設定しても、メトリクスが中央モニタリングアカウントに表示されません。

原因: クロスアカウント IAM ロールの信頼ポリシーまたはアクセス許可が正しくないためです。

解決策: この問題を解決するには、次の手順に従います。

  1. モニタリングアカウントの信頼ポリシーで、ワークロードアカウントがロールを引き受けることが許可されていることを確認します。

  2. クロスアカウントロールに CloudWatchAgentServerPolicy 管理ポリシーがアタッチされていることを確認します。

  3. エージェントログに AssumeRole エラーがないか確認します。

    kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=100 | grep -i "AssumeRole\|AccessDenied"
  4. ワークロードアカウントのエージェント IAM ロールに、クロスアカウントロール ARN の sts:AssumeRole アクセス許可があることを確認します。