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_IDIAM_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_IDIAM_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 -

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?