Amazon EKS クラスターで Container Insights メトリクスをオンにするにはどうすればよいですか?

所要時間4分
0

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 名前空間で収集されます。

  • ClusterNameLaunchType
  • ClusterNameNamespaceLaunchType
  • ClusterNameNamespacePodNameLaunchType

詳細については、「コンテナインサイト 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 -
AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません