EKS クラスターで Container Insights メトリクスを有効にするにはどうすればよいですか?
最終更新日: 2022 年 5 月 13 日
Amazon CloudWatch Container Insights を設定し、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターメトリクスを確認したいと考えています。どうすればよいですか?
簡単な説明
Amazon EKS で使用する場合、Container Insights は CloudWatch エージェントまたは AWS Distro for OpenTelemetry (ADOT) Collector のいずれかのコンテナ化されたバージョンを使用して、クラスターで実行されているすべてのコンテナを検索します。次に、パフォーマンススタックのすべてのレイヤーでパフォーマンスデータを収集します。Container Insights は、埋め込みメトリクス形式を使用してパフォーマンスログイベントなどのデータを収集します。次に、このデータを /aws/containerinsights/cluster-name/performance ロググループの CloudWatch Logs に送信します。このデータから、CloudWatch はクラスター、ノード、ポッドのレベルで集計メトリクスを作成します。Container Insights は、AWS Fargate for Amazon EKS にデプロイされたクラスターからのメトリクスの収集もサポートしています。Container Insights の詳細については、「Container Insights の使用」を参照してください。
注: Container Insights は Linux インスタンスでのみサポートされています。Amazon は、Amazon Elastic Container Registry (Amazon ECR) に CloudWatch エージェントコンテナイメージを提供しています。詳細については、Amazon ECR の「cloudwatch-agent」を参照してください。
解決方法
前提条件
これらの手順を実行する前に、次の前提条件を確認してください。
- EKS クラスターは Ready 状態のノードで実行されており、kubectl コマンドがインストールされ実行されていること。
- AWS Identity and Access Management (IAM) が管理する CloudWatchAgentServerPolicy は、Amazon EKS ワーカーノードがメトリクスとログを CloudWatch に送信できるようにするために用意されていること。これを行うには、ワーカーノードの IAM ロールにポリシーをアタッチします。または、クラスターのサービスアカウントに IAM ロールを使用し、このロールにポリシーをアタッチします。詳細については、「サービスアカウントの IAM ロール」を参照してください。
- Kubernetes バージョン 1.18 以上をサポートするクラスターを実行していること。これは EKS Fargate の Container Insights の要件です。また、Fargate でポッドをスケジュールする Fargate プロファイルを定義したこと。
- EKS ポッドの実行ロールは、Fargate インフラストラクチャで実行されるコンポーネントがユーザーに代わって AWS API を呼び出すことができるように設定されています。Amazon ECR からコンテナイメージを取得するのがその例です。
CloudWatch エージェントを使用して EKS EC2 クラスターに Container Insights メトリクスを設定する
CloudWatch エージェントまたは AWS Distro for OpenTelemetry は、aws/containerinsights/Cluster_Name/performance という名前のロググループを作成します。次に、パフォーマンスログイベントをこのロググループに送信します。
メトリクスを収集するように Container Insights を設定するには、デフォルトで、匿名ユーザーとして Docker Hub から CloudWatch エージェントコンテナイメージを 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 エージェントの設定をさらにカスタマイズするには、「CloudWatch エージェントの ConfigMap を作成する」を参照してください。
4. オプション: 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"}]}}}}'
注: ECR 上の CloudWatch エージェントの docker イメージは、ARM および AMD64 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに基づいて、最新のイメージタグを置き換えます。詳細については、Amazon ECR のイメージタグ cloudwatch-agent を参照してください。
5. サービスアカウントの IAM ロールについては、OIDC プロバイダーと IAM ロールとポリシーを作成します。次に、IAM ロールを cloudwatch-agent サービスアカウントに関連付けます。 ACCOUNT_ID と IAM_ROLE_NAME をサービスアカウントに使用する AWS アカウント ID と IAM ロールに置き換えます。
kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
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
kubectl delete -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
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 delete -f -
ADOT を使用して EKS EC2 クラスターに Container Insights メトリクスを設定する
1. このコマンドを実行して、ADOT Collector を DaemonSet としてデプロイします。その他のカスタマイズについては、「 Container Insights EKS インフラストラクチャメトリクス」を参照してください。
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -
2. Collector が実行中であることを確認します。
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"}]}}}}'
注: ECR 上の CloudWatch エージェントの docker イメージは、ARM および AMD64 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに基づいて、最新のイメージタグを置き換えます。詳細については、Amazon ECR のイメージタグ cloudwatch-agent を参照してください。
5. オプション: サービスアカウントの IAM ロールについては、OIDC プロバイダーと IAM ロールとポリシーを作成します。次に、IAM ロールを aws-otel-sa サービスアカウントに関連付けます。ACCOUNT_ID と IAM_ROLE_NAME をサービスアカウントに使用する AWS アカウント ID と IAM ロールに置き換えます。
kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
ADOT を削除する
AWS Distro for OpenTelemetry を削除するには、次のコマンドを実行します。
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 クラスターに Container Insights メトリクスを設定する
Amazon EKS と AWS Fargate で実行されるアプリケーションでは、ADOT を使用してContainer Insights を設定できます。EKS Fargate ネットワークアーキテクチャでは、ポッドがワーカーの kubelet に直接到達してリソースメトリクスを取得することはできません。ADOT Collector は Kubernetes API サーバーを呼び出して、ワーカーノード上の kubelet への接続をプロキシします。次に、そのノードのワークロードに関する kubelet のアドバイザーメトリクスを収集します。
注: ADOT Collector の 1 つのインスタンスだけでは、クラスター内のすべてのノードからリソースメトリクスを収集するには不十分です。
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、名前空間、LaunchType
- ClusterName、名前空間、PodName、LaunchType
詳細については、「Container Insights EKS Fargate」ページをご覧ください。
以下の手順に従って、EKS Fargate に ADOT をデプロイします。
1. Kubernetes サービスアカウントを IAM ロールに関連付けます。adot-collector という名前の Kubernetes サービスアカウントに関連付けられた EKS-ADOT-ServiceAccount-Role という名前の IAM ロールを作成します。CLUSTER_NAME 変数と REGION 変数は必ず変更してください。このヘルパースクリプトには eksctl が必要です。
#!/bin/bash
CLUSTER_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
2. このコマンドを使用して、ADOT Collector を Kubernetes StatefulSet としてデプロイします。my-cluster-name を EKS クラスターの名前に置き換え、my-cluster-region をリージョンの名前に置き換えます。
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 -
3. ADOT Collector ポッドが実行中であることを確認します。
kubectl get pods -n fargate-container-insights
4. オプション: aws-otel-collector イメージは、デフォルトで Docker Hub から匿名ユーザーとして取得されます。このプルにはレート制限が適用される場合があります。Amazon ECR で aws-otel-collector の docker イメージを取得するには、aws-otel-eks-ci DaemonSet にパッチを当てます。
kubectl patch sts adot-collector -n fargate-container-insights -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-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 -