

# クラスターメトリクスを収集するよう CloudWatch エージェントを設定する
<a name="Container-Insights-setup-metrics"></a>

**重要**  
Amazon EKS クラスターに Container Insights をインストールする場合は、このセクションの手順を使用するのではなく Amazon CloudWatch Observability EKS アドオンを使用してインストールすることをお勧めします。詳細と手順については、[Amazon CloudWatch Observability EKS アドオンのクイックスタート](Container-Insights-setup-EKS-addon.md) を参照してください。

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

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

## ステップ 1: CloudWatch の名前空間を作成する
<a name="create-namespace-metrics"></a>

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: クラスターのサービスアカウントを作成する
<a name="create-service-account"></a>

次の方法のいずれかを使用して、CloudWatch エージェントのサービスアカウントを作成します (作成済みでない場合)。
+ `kubectl` を使用する
+ `kubeconfig` ファイルを使用する

### 認証に `kubectl` を使用する
<a name="use-kubectl"></a>

**`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"]
  - apiGroups: [ "discovery.k8s.io" ]
    resources: [ "endpointslices" ]
    verbs: [ "list", "watch", "get" ]
```

### 認証に `kubeconfig` を使用する
<a name="use-kubeconfig"></a>

または、認証に `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 を作成する
<a name="create-configmap"></a>

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

1. ダウンロードした YAML ファイルを次のように編集します。
   + **cluster\$1name** – `kubernetes` セクションで、`{{cluster_name}}` をクラスターの名前と置き換えます。`{{}}` 文字を削除します。または、Amazon EKS クラスターを使用している場合、`"cluster_name"` フィールドと値を削除できます。そうした場合、CloudWatch エージェントは Amazon EC2 タグからクラスター名を検出します。

1. (オプション) モニターリング要件に基づいて、次のように ConfigMap をさらに変更します。
   + **metrics\$1collection\$1interval** – `kubernetes` セクションで、エージェントがメトリクスを収集する頻度を指定できます。デフォルト値は 60 秒です。kubelet でのデフォルトの cadvisor 収集間隔は 15 秒であるため、この値を 15 秒未満に設定しないでください。
   + **endpoint\$1override** – `logs` セクションで、デフォルトのエンドポイントを上書きする場合は、CloudWatch Logs エンドポイントを指定できます。VPC のクラスターからデータを発行し、データの送信先を VPC エンドポイントとする場合は、この操作を行うことをお勧めします。
   + **force\$1flush\$1interval** – `logs` セクションで、CloudWatch Logs に発行される前にバッチ処理のログイベントのインターバルを指定できます。デフォルト値は 5 秒です。
   + **region** – デフォルトでは、エージェントはワーカーノードがあるリージョンにメトリクスを発行します。これを無効にするには、`region` セクションに `agent` フィールドを追加できます。例: `"region":"us-west-2"`。
   + **statsd** セクション – クラスターの各ワーカーノードで StatsD リスナーとして CloudWatch Logs エージェントを実行する場合は、次の例のように `statsd` セクションに `metrics` セクションを追加できます。このセクションの他の StatsD オプションについては、「[StatsD を使用してカスタムメトリクスを取得する](CloudWatch-Agent-custom-metrics-statsd.md)」を参照してください。

     ```
     "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"
                 }
             }
         }
     }
     ```

1. 次のコマンドを実行して、クラスターに ConfigMap を作成します。

   ```
   kubectl apply -f cwagent-configmap-enhanced.yaml
   ```

## ステップ 4: CloudWatch エージェントを DaemonSet としてデプロイする
<a name="deploy-agent-yaml"></a>

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

**CloudWatch エージェントを DaemonSet としてデプロイするには**

1. 
   + クラスターで 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
        ```

     1. 次のように、`port` ファイルの `cwagent-daemonset.yaml` セクションのコメントを解除します。

        ```
        ports:
          - containerPort: 8125
            hostPort: 8125
            protocol: UDP
        ```

     1. 次のコマンドを実行して、クラスターに CloudWatch エージェントをデプロイします。

        ```
        kubectl apply -f cwagent-daemonset.yaml
        ```

     1. 次のコマンドを実行して、クラスターの 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 メトリクスをリッスンします。

### トラブルシューティング
<a name="ContainerInsights-deploy-troubleshooting"></a>

エージェントが正しくデプロイされない場合は、次の操作を試してください。
+ 次のコマンドを実行して、ポッドのリストを取得します。

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

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

  ```
  kubectl logs pod-name  -n amazon-cloudwatch
  ```