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

所要時間4分
0

Amazon CloudWatch コンテナインサイトを設定して、Amazon Elastic Kubernetes Service (Amazon EKS) のクラスターメトリクスを確認したいと思っています。

解決策

Container Insights は、Linux インスタンスでのみサポートされています。Amazon は Amazon Elastic Container Registry (Amazon ECR) に CloudWatch エージェントコンテナイメージを提供しています。詳細については、cloudwatch-agent/cloudwatch-agent を参照してください。

始める前に、CloudWatch における Container Insights の前提条件を満たしていることを確認してください。AWS Fargate クラスターでは、ポッドをスケジュールするには、Fargate プロファイルを定義する必要があります。また、Amazon EKS ポッドの Identity and Access Management (IAM) ロールでは、Fargate インフラストラクチャで実行するコンポーネントが AWS API に呼び出しを行える必要があります。たとえば、IAM ロールは Amazon ECR からコンテナイメージをプルできる必要があります。

CloudWatch エージェントを使用して EKS クラスターでContainer Insights メトリクスを設定する

CloudWatch エージェントは、aws/containerinsights/Cluster_Name/performance という名前のロググループを作成してから、パフォーマンスログイベントをこのロググループに送信します。Container Insights を設定してメトリクスを収集する際、CloudWatch エージェントのコンテナイメージを Docker Hub の DaemonSet としてデプロイする必要があります。デフォルトでは、コンテナイメージは匿名ユーザーとしてデプロイされます。

注: Docker では、プルできるイメージの数が制限される場合があります。

CloudWatch エージェントを使用してContainer Insights を設定するには、次の手順を実行します。

  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. 次のコマンドを実行し、configmap を CloudWatch エージェントの設定ファイルとして作成します。

    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
  5. (オプション) ECR から 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 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに応じて、最新のイメージタグを置き換えます。詳細については、cloudwatch-agent/cloudwatch-agent を参照してください。

  6. サービスアカウントの 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

注: 名前空間を削除すると、関連するリソースも削除されます。

Distro for OpentTelemetry を使用して EKS クラスターに Container Insights メトリクスを設定します。

AWS Distro for OpenTelemetry は、aws/containerinsights/Cluster_Name/performance という名前のロググループを作成し、パフォーマンスログイベントをこのロググループに送信します。

次の手順を実行します。

  1. 次のコマンドを実行し、AWS OpenTelemetry Collector を DaemonSet としてデプロイします。

    curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -
    

    注: 詳細については、「Container Insights の EKS インフラストラクチャメトリクス」を参照してください。

  2. 次のコマンドを実行し、コレクターが動作していることを確認します。

    kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
    
  3. (オプション) 次のコマンドを実行して DaemonSet aws-otel-eks-ci にパッチを適用し、この DaemonSet で ECR 上の Docker イメージ aws-otel-collector を取得します。

    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 アーキテクチャをサポートしています。イメージのバージョンとアーキテクチャに応じて、最新のイメージタグを置き換えます。

  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 ロールに置き換えます。

Distro for OpentTelemetry を削除する

次のコマンドを実行し、Distro for OpentTelemetry を削除します。

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |kubectl delete -f -

Distro for OpenTelemetry を使用して EKS Fargate クラスターに Container Insights メトリクスを設定する

EKS と Fargate で実行するアプリケーションでは、Distro for OpenTelemetry を使用して Container Insights を設定できます。
AWS OpenTelemetry 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

AWS OpenTelemetry Collector は、ContainerInsights という名前の CloudWatch 名前空間に各メトリクスを収集します。CloudWatch コンソールから [メトリクス] を選択し、[すべてのメトリクス] を選択します。ContainerInsights には、[カスタム名前空間] から移動できます。

各メトリクスは、次のディメンションセットに関連付けられます。

  • ClusterNameLaunchType
  • ClusterNameNamespaceLaunchType
  • ClusterNameNamespacePodNameLaunchType

詳細については、「Container Insights EKS Fargate」を参照してください。

EKS Fargate に OpenTelemetry 用ディストリビューションをデプロイするには、次の手順を実行します。

  1. fargate-container-insights という名前の名前空間を作成します。

  2. 次のスクリプトを実行し、EKS-ADOT-ServiceAccount-Role という IAM ロールを作成します。このロールは、adot-collector という Kubernetes サービスアカウントに関連付けられます。次のヘルパースクリプトには eksctl が必要です。

    #!/bin/bashCLUSTER_NAME=YOUR-EKS-CLUSTER-NAMEREGION=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
    
    kubectl create ns fargate-container-insights
    
    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 リージョンに置き換えます。

  3. 次のコマンドを実行して AWS OpenTelemetry Collector を Kubernetes StatefulSet としてデプロイします。

    ClusterName= your-cluster-name Region= your-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 -
    

    注: 実際のものでそれぞれ、your-cluster-name をクラスター名に、your-cluster-region をクラスターを配置したリージョンに置き換えます。AWS Fargate で StatefulSet ポッドをプロビジョニングするのに適切な Fargate プロファイルがあることを確認してください。

  4. 次のコマンドを実行し、Distro for Open Telemetry Collector ポッドが動作していることを確認します。

    kubectl get pods -n fargate-container-insights
  5. (オプション) 次のコマンドを実行して adot-collector StatefulSet にパッチを適用し、この StatefulSet で ECR 上の Docker イメージ aws-otel-collector をプルします。

    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"}]}}}}'
    

Distro for OpenTelemetry を削除する

次のコマンドを実行し、Distro for OpentTelemetry を削除します。

eksctl delete iamserviceaccount --cluster CLUSTER_NAME --name adot-collector
ClusterName= your-cluster-name Region= your-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 -

注: 実際のものでそれぞれ、your-cluster-name をクラスター名に、your-cluster-region をクラスターを配置したリージョンに置き換えます。

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ