

# 使用启用了 Container Insights 增强可观测性的 CloudWatch 代理
<a name="Container-Insights-EKS-agent"></a>

按照以下任一部分中的说明，使用 CloudWatch 代理在 Amazon EKS 集群或 Kubernetes 集群上设置 Container Insights。仅 Amazon EKS 版本 1.24 及更高版本支持快速启动指令。

**注意**  
您可以按照以下任一部分中的说明安装 Container Insights。您无需遵循所有三组说明。

**Topics**
+ [

# Amazon CloudWatch 可观测性 EKS 插件快速入门
](Container-Insights-setup-EKS-addon.md)
+ [

# Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置
](Container-Insights-setup-EKS-quickstart.md)
+ [

# 设置 CloudWatch 代理以收集集群指标
](Container-Insights-setup-metrics.md)

# Amazon CloudWatch 可观测性 EKS 插件快速入门
<a name="Container-Insights-setup-EKS-addon"></a>

您可以使用 Amazon EKS 附加组件安装针对 Amazon EKS 增强了可观测性的 Container Insights。该附加组件会安装 CloudWatch 代理以从集群发送基础设施指标、安装 Fluent Bit 以发送容器日志，还会启用 CloudWatch [Application Signals](CloudWatch-Application-Monitoring-Sections.md) 以发送应用程序性能遥测。

当您使用 Amazon EKS 附加组件 1.5.0 版或更高版本时，集群中的 Linux 和 Windows Worker 节点上都将启用 Container Insights。在 Amazon EKS 中，Windows 节点上暂不支持 Application Signals。

运行 Kubernetes 而不是 Amazon EKS 的集群不支持 Amazon EKS 附加组件。

有关 Amazon CloudWatch Observability EKS 附加组件的更多信息，请参阅 [使用 Amazon CloudWatch Observability EKS 附加组件或 Helm 图表安装 CloudWatch 代理](install-CloudWatch-Observability-EKS-addon.md)。

如果您使用的插件版本为 3.1.0 或更高版本，则可以使用 EKS 容器组身份向该插件授予所需的权限。推荐使用 EKS 容器组身份，它具有诸如最低权限、凭证轮换和可审计性等优点。此外，使用 EKS 容器组身份，您可以在集群创建过程中安装 EKS 插件。

**安装 Amazon CloudWatch Observability EKS 附加组件**

1. 按照 [EKS 容器组身份关联](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-association.html#pod-id-association-create/)步骤创建 IAM 角色并设置 EKS 容器组身份代理。

1. 附加一个向角色授予所需权限的 IAM 策略。将 *my-role* 替换为上一步中 IAM 角色的名称。

   ```
   aws iam attach-role-policy \
    --role-name my-role \
   --policy-arn=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
   ```

1. 输入以下命令，使用您在上一步中创建的 IAM 角色：

   ```
   aws eks create-addon \
   --addon-name amazon-cloudwatch-observability \
   --cluster-name my-cluster-name \
   --pod-identity-associations serviceAccount=cloudwatch-agent,roleArn=arn:aws:iam::111122223333:role/my-role
   ```

# Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置
<a name="Container-Insights-setup-EKS-quickstart"></a>

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

要完成 Container Insights 的设置，您可以按照本节中的快速入门说明进行操作。如果您要在 Amazon EKS 集群中进行安装，并且在 2023 年 11 月 6 日当天或之后按照本部分中的说明进行操作，则可以在集群中安装针对 Amazon EKS 增强了可观测性的 Container Insights。

**重要**  
在完成本节中的步骤之前，您必须已对 IAM 权限等先决条件进行验证。有关更多信息，请参阅 [在 CloudWatch 中验证 Container Insights 的先决条件](Container-Insights-prerequisites.md)。

或者，您可以按照以下两节中的说明操作：[设置 CloudWatch 代理以收集集群指标](Container-Insights-setup-metrics.md)和 [将日志发送到 CloudWatch Logs](Container-Insights-EKS-logs.md)。这些章节提供有关 CloudWatch 代理如何与 Amazon EKS 和 Kubernetes 结合使用的更多配置详细信息，但需要您执行更多安装步骤。

在 Container Insights 的原始版本中，收集的指标和摄取的日志将作为自定义指标收费。借助针对 Amazon EKS 增强了可观测性的 Container Insights，Container Insights 指标和日志按每次观测收费，而不是按存储的指标或摄取的日志收费。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

**注意**  
Amazon 现已推出 Fluent Bit 作为 Container Insights 的默认日志解决方案，其性能显着提高。我们建议您使用 Fluent Bit 而不是 Fluentd。

## 使用 CloudWatch 代理 operator 和 Fluent Bit 快速入门
<a name="Container-Insights-setup-EKS-quickstart-FluentBit"></a>

Fluent Bit 有两种配置：优化版本和更类似于 Fluentd 的体验的版本。快速入门配置使用优化版本。有关 Fluentd 兼容配置的详细信息，请参阅 [将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs](Container-Insights-setup-logs-FluentBit.md)。

CloudWatch 代理 operator 是安装到 Amazon EKS 集群的附加容器。它以 OpenTelemetry Operator for Kubernetes 为模型。Operator 管理集群中 Kubernetes 资源的生命周期。它在 Amazon EKS 集群上安装 CloudWatch 代理、DCGM Exporter（NVIDIA）和 AWS Neuron Monitor 并对其进行管理。Fluent Bit 和 CloudWatch Agent for Windows 可以直接安装到 Amazon EKS 集群中，而无需 operator 对其进行管理。

为了获得更安全、功能更丰富的凭证颁发机构解决方案，CloudWatch 代理 operator 需要使用 cert-manager，这是 Kubernetes 中广泛采用的 TLS 证书管理解决方案。使用 cert-manager 可简化获取、续订、管理和使用这些证书的过程。此解决方案可确保证书有效且最新，并尝试在证书到期前的配置时间续订证书。cert-manager 还便于从各种支持的来源（包括 AWS Certificate Manager Private Certificate Authority）颁发证书。

**使用快速入门部署 Container Insights**

1. 如果 cert-manager 尚未安装到集群中，则请安装。有关更多信息，请参阅 [cert-manager Installation](https://cert-manager.io/docs/installation/)。

1. 通过输入以下命令安装自定义资源定义（CRD）。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/main/k8s-quickstart/cwagent-custom-resource-definitions.yaml | kubectl apply --server-side -f -
   ```

1. 通过输入以下命令安装 operator。将 *my-cluster-name* 替换为 Amazon EKS 或 Kubernetes 集群的名称，将 *my-cluster-region* 替换为在其中发布日志的区域的名称。我们建议您使用在其中部署集群的同一个区域来降低 AWS 出站数据传输成本。

   ```
   ClusterName=my-cluster-name
   RegionName=my-cluster-region
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/main/k8s-quickstart/cwagent-operator-rendered.yaml | sed 's/{{cluster_name}}/'${ClusterName}'/g;s/{{region_name}}/'${RegionName}'/g' | kubectl apply -f -
   ```

   例如，要在名为 `MyCluster` 的集群上部署 Container Insights 并将日志和指标发布到美国西部（俄勒冈），请输入以下命令。

   ```
   ClusterName='MyCluster'
   RegionName='us-west-2'
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/main/k8s-quickstart/cwagent-operator-rendered.yaml | sed 's/{{cluster_name}}/'${ClusterName}'/g;s/{{region_name}}/'${RegionName}'/g' | kubectl apply -f -
   ```

**从 Container Insights 迁移**

如果您已经在 Amazon EKS 集群中配置了 Container Insights，并想要迁移到针对 Amazon EKS 增强了可观测性的 Container Insights，则请参阅 [在 CloudWatch 中升级到针对 Amazon EKS 增强了可观测性的 Container Insights](Container-Insights-upgrade-enhanced.md)

**删除 Container Insights**

如果您想使用快速入门设置删除 Container Insights，则请输入以下命令。

```
ClusterName=my-cluster-name 
RegionName=my-cluster-region
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/main/k8s-quickstart/cwagent-operator-rendered.yaml | sed 's/{{cluster_name}}/'${ClusterName}'/g;s/{{region_name}}/'${RegionName}'/g' | kubectl delete -f -
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/main/k8s-quickstart/cwagent-custom-resource-definitions.yaml | kubectl delete -f -
```

# 设置 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
  ```