クラスターメトリクスを収集するよう CloudWatch エージェントを設定する - Amazon CloudWatch

クラスターメトリクスを収集するよう CloudWatch エージェントを設定する

重要

Amazon EKS クラスターに Container Insights をインストールする場合は、このセクションの手順を使用するのではなく Amazon CloudWatch Observability EKS アドオンを使用してインストールすることをお勧めします。詳細と手順については、「Amazon CloudWatch Observability EKS アドオンのインストール」を参照してください。

Container Insights をセットアップしてメトリクスを収集するには、「Amazon EKS および Kubernetes の Container Insights のクイックスタートセットアップ」の手順に従うか、このセクションの手順に従います。以下のステップでは、クラスターからメトリクスを収集できるよう CloudWatch エージェントをセットアップします。

2023 年 11 月 6 日以降にこのセクションの手順を使用して Amazon EKS クラスターにインストールを行う場合は、Amazon EKS 向けにオブザーバビリティが強化された Container Insights をそのクラスターにインストールします。

ステップ 1: CloudWatch の名前空間を作成する

CloudWatch に対して amazon-cloudwatch という Kubernetes 名前空間を作成するには、次のステップを使用します。すでにこの名前空間を作成している場合は、以下のステップをスキップできます。

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 エージェントのサービスアカウントを作成します (作成済みでない場合)。

  • kubectl を使用します。

  • kubeconfig ファイルを使用する

認証に kubectl を使用する

kubectl を使用して 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

前のステップに従っていないが、使用する CloudWatch エージェントのサービスアカウントが既にある場合は、そのアカウントに次のルールがあることを確認する必要があります。さらに、Container Insights のインストールの残りの手順では、cloudwatch-agent の代わりにそのサービスアカウントの名前を使用する必要があります。

rules: - apiGroups: [""] resources: ["pods", "nodes", "endpoints"] verbs: ["list", "watch"] - apiGroups: [ "" ] resources: [ "services" ] verbs: [ "list", "watch" ] - apiGroups: ["apps"] resources: ["replicasets", "daemonsets", "deployments", "statefulsets"] verbs: ["list", "watch"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["list", "watch"] - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"] - apiGroups: [""] resources: ["nodes/stats", "configmaps", "events"] verbs: ["create", "get"] - apiGroups: [""] resources: ["configmaps"] resourceNames: ["cwagent-clusterleader"] verbs: ["get","update"] - nonResourceURLs: ["/metrics"] verbs: ["get", "list", "watch"]

認証に kubeconfig を使用する

または、認証に kubeconfig ファイルを使用することもできます。この方法を使用して CloudWatch エージェント設定で kubeconfig パスを直接指定すれば、サービスアカウントは不要になります。また、認証のための Kubernetes コントロールプレーン API への依存関係を除去できるため、セットアップが合理化され、kubeconfig ファイルを通じて認証を管理することでセキュリティが強化される可能性があります。

この方法を使用するには、次の例のように CloudWatch エージェント設定ファイルを更新して kubeconfig ファイルへのパスを指定します。

{ "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "YOUR_CLUSTER_NAME", "enhanced_container_insights": false, "accelerated_compute_metrics": false, "tag_service": false, "kube_config_path": "/path/to/your/kubeconfig" "host_ip": "HOSTIP" } } } }

kubeconfig ファイルを作成するには、system:masters Kubernetes ロールを持つ admin/{create_your_own_user} ユーザーの Certificate Signing Request (CSR) を作成します。次に、Kubernetes クラスターの認証局 (CA) で署名し、kubeconfig ファイルを作成します。

ステップ 3: CloudWatch エージェント用の ConfigMap を作成する

CloudWatch エージェント用の ConfigMap を作成するには、次のステップを使用します。

CloudWatch エージェント用の ConfigMap を作成するには
  1. 以下のコマンドを実行して、ConfigMap YAML を kubectl クライアントホストにダウンロードします。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap-enhanced.yaml
  2. ダウンロードした YAML ファイルを次のように編集します。

    • cluster_namekubernetes セクションで、{{cluster_name}} をクラスターの名前と置き換えます。{{}} 文字を削除します。または、Amazon EKS クラスターを使用している場合、"cluster_name" フィールドと値を削除できます。そうした場合、CloudWatch エージェントは Amazon EC2 タグからクラスター名を検出します。

  3. (オプション) モニターリング要件に基づいて、次のように ConfigMap をさらに変更します。

    • metrics_collection_intervalkubernetes セクションで、エージェントがメトリクスを収集する頻度を指定できます。デフォルト値は 60 秒です。kubelet でのデフォルトの cadvisor 収集間隔は 15 秒であるため、この値を 15 秒未満に設定しないでください。

    • endpoint_overridelogs セクションで、デフォルトのエンドポイントを上書きする場合は、CloudWatch Logs エンドポイントを指定できます。VPC のクラスターからデータを発行し、データの送信先を VPC エンドポイントとする場合は、この操作を行うことをお勧めします。

    • force_flush_intervallogs セクションで、CloudWatch Logs に発行される前にバッチ処理のログイベントのインターバルを指定できます。デフォルト値は 5 秒です。

    • region – デフォルトでは、エージェントはワーカーノードがあるリージョンにメトリクスを発行します。これを無効にするには、region セクションに agent フィールドを追加できます。例: "region":"us-west-2"

    • statsd セクション – クラスターの各ワーカーノードで StatsD リスナーとして CloudWatch Logs エージェントを実行する場合は、次の例のように statsd セクションに metrics セクションを追加できます。このセクションの他の StatsD オプションについては、「StatsD を使用してカスタムメトリクスを取得する」を参照してください。

      "metrics": { "metrics_collected": { "statsd": { "service_address":":8125" } } }

      JSON セクションの完全な例を次に示します。認証に kubeconfig ファイルを使用している場合は、kube_config_path パラメータを追加して kubeconfig ファイルへのパスを指定します。

      { "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "MyCluster", "metrics_collection_interval": 60, "kube_config_path": "/path/to/your/kubeconfig" //if using kubeconfig for authentication } }, "force_flush_interval": 5, "endpoint_override": "logs.us-east-1.amazonaws.com" }, "metrics": { "metrics_collected": { "statsd": { "service_address": ":8125" } } } }
  4. 次のコマンドを実行して、クラスターに ConfigMap を作成します。

    kubectl apply -f cwagent-configmap.yaml

ステップ 4: CloudWatch エージェントを DaemonSet としてデプロイする

CloudWatch エージェントのインストールを完了してコンテナメトリクスの収集を開始するには、次のステップを使用します。

CloudWatch エージェントを DaemonSet としてデプロイするには
    • クラスターで StatsD を使用しない場合は、次のコマンドを入力します。

      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
    • StatsD を使用する場合は、以下の手順に従います。

      1. 次のコマンドを実行して、kubectl クライアントに DaemonSet YAML をダウンロードします。

        curl -O 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
      2. 次のように、port ファイルの cwagent-daemonset.yaml セクションのコメントを解除します。

        ports: - containerPort: 8125 hostPort: 8125 protocol: UDP
      3. 次のコマンドを実行して、クラスターに CloudWatch エージェントをデプロイします。

        kubectl apply -f cwagent-daemonset.yaml
      4. 次のコマンドを実行して、クラスターの Windows ノードに CloudWatch エージェントをデプロイします。StatsD リスナーは Windows 上の CloudWatch エージェントではサポートされていません。

        kubectl apply -f cwagent-daemonset-windows.yaml
  1. 次のコマンドを実行して、エージェントがデプロイされたことを確認します。

    kubectl get pods -n amazon-cloudwatch

操作を完了すると、CloudWatch エージェントは /aws/containerinsights/Cluster_Name/performance という名前のロググループを作成し、このロググループにパフォーマンスログイベントを送信します。また、このエージェントを StatsD リスナーとしてもセットアップする場合、エージェントはアプリケーションポッドがスケジュールされたノードの IP アドレスを使用して、ポート 8125 で StatsD メトリクスをリッスンします。

トラブルシューティング

エージェントが正しくデプロイされない場合は、次の操作を試してください。

  • 次のコマンドを実行して、ポッドのリストを取得します。

    kubectl get pods -n amazon-cloudwatch
  • 次のコマンドを実行して、出力の下部にあるイベントを確認します。

    kubectl describe pod pod-name -n amazon-cloudwatch
  • 次のコマンドを実行して、ログを確認します。

    kubectl logs pod-name -n amazon-cloudwatch