

# 设置 CloudWatch 代理以收集集群指标
<a name="Container-Insights-setup-metrics"></a>

**重要**  
如果您要在 Amazon EKS 集群上安装 Container Insights，我们建议您使用 Amazon CloudWatch Observability EKS 附加组件进行安装，而不是按照本部分中的说明进行安装。有关更多信息和说明，请参阅 [Amazon CloudWatch 可观测性 EKS 插件快速入门](Container-Insights-setup-EKS-addon.md)。

要设置 Container Insights 以收集指标，您可以按照[Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置](Container-Insights-setup-EKS-quickstart.md)中的步骤操作，也可以按照本节中的步骤操作。在以下步骤中，您设置 CloudWatch 代理以便能够从集群中收集指标。

如果您要在 Amazon EKS 集群中进行安装，并且在 2023 年 11 月 6 日当天或之后按照本部分中的说明进行操作，则可以在集群中安装针对 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}` 用户创建证书签名请求（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** – 默认情况下，代理将指标发布到 Worker 节点所在的区域。要覆盖该区域，您可以在 `agent` 部分中添加 `region` 字段：例如，`"region":"us-west-2"`。
   + **statsd** 部分 – 如果希望 CloudWatch Logs 代理还在集群的每个 Worker 节点中作为 StatsD 侦听器运行，您可以将 `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. 运行以下命令以将 DaemonSet 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-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 代理。Windows 上的 CloudWatch 代理不支持 StatSD 侦听器。

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

1. 运行以下命令以验证是否部署了该代理。

   ```
   kubectl get pods -n amazon-cloudwatch
   ```

在完成后，CloudWatch 代理创建一个名为 `/aws/containerinsights/Cluster_Name/performance` 的日志组，并将性能日志事件发送到该日志组。如果还将该代理设置为 StatsD 侦听器，该代理还会在端口 8125（具有计划运行应用程序 pod 的节点的 IP 地址）上侦听 StatsD 指标。

### 问题排查
<a name="ContainerInsights-deploy-troubleshooting"></a>

如果未正确部署该代理，请尝试执行以下操作：
+ 运行以下命令以获取 pod 列表。

  ```
  kubectl get pods -n amazon-cloudwatch
  ```
+ 运行以下命令并在输出底部检查事件。

  ```
  kubectl describe pod pod-name -n amazon-cloudwatch
  ```
+ 运行以下命令以检查日志。

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