Amazon EKS クラスターで Container Insights メトリクスをオンにするにはどうすればよいですか?
Amazon CloudWatch コンテナインサイトを設定して、Amazon Elastic Kubernetes Service (Amazon EKS) のクラスターメトリクスを確認したいと思っています。
簡単な説明
Amazon EKS でコンテナインサイトを使用すると、 コンテナインサイトは CloudWatch エージェントのコンテナ化されたバージョンを使用して、クラスターで実行されているすべてのコンテナを検索します。コンテナインサイトでは、AWS Distro for OpenTelemetry (ADOT) Collector も使用してクラスター内のコンテナを検索しています。次にコンテナインサイトは、埋め込みメトリック形式を使用するパフォーマンスログイベントなど、パフォーマンススタックの各レイヤーでパフォーマンスデータを収集します。その後、コンテナインサイトはこのデータを /aws/containerinsights/cluster-name/performance ロググループで CloudWatch Logs に送信し、そこで CloudWatch はクラスター、ノード、ポッドレベルで集計メトリクスを作成します。コンテナインサイトは、AWS Fargate for Amazon EKS にデプロイされているクラスターからのメトリクスの収集もサポートしています。詳細については、「コンテナインサイトの使用」を参照してください。
**注:**コンテナインサイトは Linux インスタンスでのみサポートされています。Amazon は Amazon Elastic Container Registry (Amazon ECR) に CloudWatch エージェントコンテナイメージを提供しています。詳細については、Amazon ECR の「cloudwatch-agent/cloudwatch-agent」を参照してください。
解決策
前提条件
- Amazon EKS クラスターは、準備完了状態のノードで実行されており、kubectl コマンドがインストールされて実行されています。
- AWS Identity and Access Management (IAM) が管理する CloudWatchAgentServerPolicy は、Amazon EKS ワーカーノードをアクティベートして、メトリクスとログを CloudWatch に送信します。ワーカーノードを有効にするには、ワーカーノードの IAM ロールにポリシーをアタッチします。または、クラスターのサービスアカウントに IAM ロールを使用し、このロールにポリシーをアタッチします。詳細については、「サービスアカウントの IAM ロール」を参照してください。
- Kubernetes バージョン 1.18 以降をサポートするクラスターを実行しています。これは EKS Fargate のコンテナインサイトの要件です。また、Fargate 上でポッドをスケジュールするには、必ず Fargate プロファイルを定義してください。
- Amazon EKS ポッド IAM ロールは、Fargate インフラストラクチャ上で実行されるコンポーネントがユーザーに代わって AWS API を呼び出すことを許可する必要があります。例えば、IAM ロールは Amazon ECR からコンテナイメージを取得できる必要があります。
CloudWatch エージェントを使用して EC2 クラスターのコンテナインサイトメトリクスを設定する
CloudWatch エージェントまたは ADOT は、まず aws/containerinsights/Cluster_Name/performance という名前のロググループを作成し、次にパフォーマンスログイベントをこのロググループに送信します。コンテナインサイトしてメトリクスを収集する場合、CloudWatch エージェントのコンテナイメージを Docker Hub から DaemonSet としてデプロイする必要があります。デフォルトでは、これは匿名ユーザーとして行われます。このプルにはレート制限が適用される場合があります。
1. amazon-cloudwatch 名前空間をお持ちでない場合は、名前空間を作成してください。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
2. cloudwatch-agent という名前の CloudWatch エージェントのサービスアカウントを作成します。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
3. CloudWatch エージェントの設定ファイルとしてconfigmap を作成します。
ClusterName=<my-cluster-name>curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -
**注:**my-cluster-name を EKS クラスターの名前に置き換えます。詳細については、「CloudWatch エージェント用の ConfigMap を作成する」を参照してください。
4. cloudwatch-agent DaemonSet をデプロイします。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
(オプション) Amazon Elastic Container Registry から CloudWatch エージェントを取得するには、cloudwatch-agent DaemonSet にパッチを適用します。
kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'
**注:**Amazon ECR の ** CloudWatch-agent ** Docker イメージは、ARM と AMD64 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに基づいて最新のイメージタグを置き換えます。詳細については、Amazon ECR のイメージタグ cloudwatch-agent を参照してください。
5. サービスアカウントの IAM ロールの場合は、OIDC プロバイダーと IAM ロールとポリシーを作成します。次に、IAM ロールを cloudwatch-agent サービスアカウントに関連付けます。
kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
**注:**ACCOUNT_ID を自分のアカウント ID に、IAM_ROLE_NAME をサービスアカウントに使用する IAM ロールに置き換えます。
CloudWatch エージェントのトラブルシューティング
1. ポッドのリストを取得するには、以下のコマンドを実行します。
kubectl get pods -n amazon-cloudwatch
2. 出力の下部にあるイベントを確認するには、次のコマンドを実行します。
kubectl describe pod pod-name -n amazon-cloudwatch
3. ログを確認してください。
kubectl logs pod-name -n amazon-cloudwatch
4. CloudWatch エージェントに CrashLoopBackoff エラーが表示される場合は、IAM 権限が正しく設定されていることを確認します。詳細については、「前提条件の確認」を参照してください。
CloudWatch エージェントを削除する
CloudWatch エージェントを削除するには、次のコマンドを実行します。
kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
**注:**名前空間を削除すると、関連するリソースも削除されます。
ADOT を使用して EC2 クラスターのコンテナインサイトメトリクスを設定する
1. ADOT Collector を DaemonSet としてデプロイするには、以下のコマンドを実行します。
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -
詳細については、「コンテナインサイトEKS インフラストラクチャメトリクス」を参照してください。
2. コレクターが実行中であることを確認するには、次のコマンドを実行します。
kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
3. (オプション) デフォルトでは、aws-otel-collectorイメージは匿名ユーザーとして Docker Hub から取得されます。このプルにはレート制限が適用される場合があります。Amazon ECR の aws-otel-collector Docker イメージを取得するには、aws-otel-eks-ci DaemonSet にパッチを適用します。
kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'
**注:**Amazon ECR の ** CloudWatch-agent ** Docker イメージは、ARM と AMD64 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに基づいて最新のイメージタグを置き換えます。詳細については、Amazon ECR のイメージタグ cloudwatch-agent を参照してください。
4. (オプション) サービスアカウントの IAM ロールの場合は、OIDC プロバイダーと IAM ロールとポリシーを作成します。次に、IAM ロールを aws-otel-sa サービスアカウントに関連付けます。
kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
**注:**ACCOUNT_ID を自分のアカウント ID に、IAM_ROLE_NAME をサービスアカウントに使用する IAM ロールに置き換えます。
ADOT を削除する
ADOT を削除するには、次のコマンドを実行します。
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |kubectl delete -f -
ADOT を使用して EKS Fargate クラスターに コンテナインサイトメトリクスを設定する
Amazon EKS と AWS Fargate で実行されるアプリケーションの場合、ADOT を使用してコンテナインサイトを設定できます。EKS Fargate ネットワークアーキテクチャでは、ポッドがワーカーの kubelet に直接アクセスしてリソースメトリクスを取得することはできません。ADOT Collector はまず Kubernetes API サーバーを呼び出し、ワーカーノード上の kubelet への接続をプロキシします。次に、そのノード上のワークロードに関する kubelet のアドバイザーメトリクスを収集します。
ADOT Collector は、EKS Fargate で実行されるすべてのワークロードについて、以下のメトリクスを 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
詳細については、「コンテナインサイト EKS Fargate」を参照してください。
EKS Fargate に ADOT をデプロイするには、次の手順を実行します。
1. Kubernetes サービスアカウントを IAM ロールに関連付けます。adot-collector という名前の Kubernetes サービスアカウントに関連付けられた EKS-ADOT-ServiceAccount-Role という名前の IAM ロールを作成します。次のヘルパースクリプトには eksctl が必要です。
#!/bin/bashCLUSTER_NAME=YOUR-EKS-CLUSTER-NAME REGION=YOUR-EKS-CLUSTER-REGION SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights SERVICE_ACCOUNT_NAME=adot-collector SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy eksctl utils associate-iam-oidc-provider \ --cluster=$CLUSTER_NAME \ --approve eksctl create iamserviceaccount \ --cluster=$CLUSTER_NAME \ --region=$REGION \ --name=$SERVICE_ACCOUNT_NAME \ --namespace=$SERVICE_ACCOUNT_NAMESPACE \ --role-name=$SERVICE_ACCOUNT_IAM_ROLE \ --attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \ --approve
**注:**CLUSTER_NAME をお使いのクラスター名で置き換え、また REGION を AWS リージョンで置き換えます。
2. ADOT Collector を Kubernetes StatefulSet としてデプロイするには、以下のコマンドを実行します。
ClusterName=<my-cluster-name>Region=<my-cluster-region> curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -
**注:**AWS Fargate で StatefulSet ポッドをプロビジョニングするには、一致する Fargate プロファイルがあることを確認してください。my-cluster-name をお使いのクラスターの名前に、my-cluster-region をクラスターが配置されている AWS リージョンに置き換えます。
3. ADOT Collector ポッドが実行中であることを確認するには、以下のコマンドを実行します。
kubectl get pods -n fargate-container-insights
4. (オプション) デフォルトでは、aws-otel-collectorイメージは匿名ユーザーとして Docker Hub から取得されます。このプルにはレート制限が適用される場合があります。Amazon ECR で aws-hotel-collector Docker イメージを取得するには、adot-collector の StatefulSet にパッチを適用します。
kubectl patch sts adot-collector -n fargate-container-insights -p \'{"spec":{"template":{"spec":{"containers":[{"name":"adot-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'
ADOT を削除する
ADOT を削除するには、次のコマンドを実行します。
eksctl delete iamserviceaccount --cluster CLUSTER_NAME --name adot-collector ClusterName=<my-cluster-name>Region=<my-cluster-region> curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -

関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 4ヶ月前lg...
- 質問済み 4ヶ月前lg...
- AWS公式更新しました 3ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前