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:UpdateAddon、eks:DescribeAddon、およびiam:AttachRolePolicy(クロスアカウント設定に必要)
一般的な設定パターン
すべての詳細設定は同じパターンに従います。aws eks
update-addon コマンドを使用して JSON 設定を amazon-cloudwatch-observability アドオンに渡します。
aws eks update-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --configuration-values 'JSON-configuration' \ --resolve-conflicts OVERWRITE
重要
--resolve-conflicts OVERWRITE フラグで、既存のアドオン設定が置き換えられます。既存の設定を保持するには、コマンドを実行する前に新しい設定とマージします。
ログのフィルタリング
特定の条件に一致するログを除外することで、CloudWatch Logs のコストを削減できます。ログフィルタリングを使用して、エージェントが CloudWatch に送信する前にデバッグレベルまたは詳細なログを削除します。
ログフィルタリングを設定するには
-
次のコマンドを実行して、ログフィルター設定でアドオンを更新します。
cluster-nameは、自分の Amazon EKS クラスターに置き換えます。aws eks update-addon \ --cluster-namecluster-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 -
更新後、アドオンのステータスが
ACTIVEであることを確認します。aws eks describe-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text
exclude_filters 設定では、エージェントが CloudWatch Logs に送信する前に、指定されたログレベルに一致するログエントリが削除されます。これにより、ログの取り込み量とそれに伴うコストを削減できます。
マルチアカウント収集
クロスアカウント IAM ロールの引き受けを設定することで、ワークロードアカウントから中央モニタリングアカウントにテレメトリを送信できます。このアプローチでは、異なる AWS アカウントにわたる複数の Amazon EKS クラスターからのメトリクスとログを単一のビューで表示できます。
マルチアカウント収集を設定するには
モニタリングアカウントでクロスアカウントロールを作成するには
-
中央モニタリングアカウントで、ワークロードアカウントが引き受けることを許可する信頼ポリシーを持つ 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" } ] } -
CloudWatchAgentServerPolicy管理ポリシーをクロスアカウントロールにアタッチします。
クロスアカウント配信用にアドオンを設定するには
-
ワークロードアカウントで、アドオンを更新してクロスアカウントロールを引き受けます。
cluster-nameを Amazon EKS クラスターの名前に置き換え、monitoring-account-idを中央モニタリングアカウントのアカウントの AWS ID に置き換えます。aws eks update-addon \ --cluster-namecluster-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 -
更新後、アドオンのステータスが
ACTIVEであることを確認します。aws eks describe-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text
カスタムメトリクスディメンション
Kubernetes ラベルから派生したカスタムディメンションを Container Insights メトリクスに追加できます。カスタムディメンションを使用すると、チーム、環境、アプリケーション層などの詳細度を高めてメトリクスをフィルタリングおよびグループ化できます。
Kubernetes ラベルからカスタムディメンションを追加するには
-
次のコマンドを実行して、カスタムディメンションを設定します。
cluster-nameを Amazon EKS クラスターの名前に置き換え、label-keyをディメンションとして使用する Kubernetes ラベルに置き換えます。aws eks update-addon \ --cluster-namecluster-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 -
更新後、アドオンのステータスが
ACTIVEであることを確認します。aws eks describe-addon \ --cluster-namecluster-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 のリソース制限を設定するには
-
次のコマンドを実行して、リソースリクエストと制限を設定します。
cluster-nameを Amazon EKS クラスターの名前に置き換え、リソース値を上記の表の値に置き換えます。aws eks update-addon \ --cluster-namecluster-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 -
アドオンのステータスが
ACTIVEであり、エージェントポッドが新しいリソース割り当てで再起動することを確認します。aws eks describe-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --query "addon.status" \ --output text -
エージェントポッドが新しいリソース制限で実行されていることを確認します。
kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent -o jsonpath='{.items[0].spec.containers[0].resources}'
設定の変更を確認する
詳細設定を適用したら、アドオンが正常であり、エージェントポッドが正常に再起動したことを確認します。
設定の変更を確認するには
-
アドオンのステータスが
ACTIVEであることを確認します。cluster-nameは、自分の Amazon EKS クラスターに置き換えます。aws eks describe-addon \ --cluster-namecluster-name\ --addon-name amazon-cloudwatch-observability \ --query "addon.{Status:status,ConfigValues:configurationValues}" \ --output table -
エージェントポッドが再起動し、
Runningステータスになっていることを確認します。kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agentすべてのエージェントポッドは、最新の再起動時刻で
Runningステータスになっている必要があります。
トラブルシューティング
詳細設定に関する一般的な問題を解決するには、次のガイダンスを使用します。
ConfigurationConflict でアドオンの更新が失敗する
症状: aws eks update-addon コマンドが ConfigurationConflict エラーを返します。
原因: 指定した JSON 設定の形式が正しくないか、無効なキーが含まれているためです。
解決策: この問題を解決するには、次の手順に従います。
-
JSON linter を使用するか、次のコマンドを実行して、JSON 設定を検証します。
echo 'your-json-configuration' | python3 -m json.tool -
すべての設定キーが
amazon-cloudwatch-observabilityアドオンに対して有効であることを確認します。 -
修正した JSON で更新を再試行します。
モニタリングアカウントに表示されないクロスアカウントメトリクス
症状: マルチアカウント収集を設定しても、メトリクスが中央モニタリングアカウントに表示されません。
原因: クロスアカウント IAM ロールの信頼ポリシーまたはアクセス許可が正しくないためです。
解決策: この問題を解決するには、次の手順に従います。
-
モニタリングアカウントの信頼ポリシーで、ワークロードアカウントがロールを引き受けることが許可されていることを確認します。
-
クロスアカウントロールに
CloudWatchAgentServerPolicy管理ポリシーがアタッチされていることを確認します。 -
エージェントログに
AssumeRoleエラーがないか確認します。kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=100 | grep -i "AssumeRole\|AccessDenied" -
ワークロードアカウントのエージェント IAM ロールに、クロスアカウントロール ARN の
sts:AssumeRoleアクセス許可があることを確認します。