

# 在 Amazon EKS 和 Kubernetes 上设置 Container Insights


Amazon EKS 版本 1.23 及更高版本支持 Container Insights。仅版本 1.24 及更高版本支持快速启动安装方法。

在 Amazon EKS 或 Kubernetes 上设置 Container Insights 的整个过程如下所示：

1. 验证您是否满足所需的先决条件。

1. 在集群上设置 Amazon CloudWatch Observability EKS 附加组件、CloudWatch 代理或 AWS Distro for OpenTelemetry，以将指标发送到 CloudWatch。
**注意**  
要使用针对 Amazon EKS 增强了可观测性的 Container Insights，您必须使用 Amazon CloudWatch Observability EKS 附加组件或 CloudWatch 代理。有关此版本的 Container Insights 的更多信息，请参阅 [针对 Amazon EKS 增强了可观测性的 Container Insights](container-insights-detailed-metrics.md)。  
要将 Container Insights 与 Fargate 一起使用，您必须使用 AWS Distro for OpenTelemetry。Fargate 不支持针对 Amazon EKS 增强了可观测性的 Container Insights。
**注意**  
Container Insights 现在支持 Amazon EKS 集群中的 Windows Worker 节点。Windows 还支持针对 Amazon EKS 增强了可观测性的 Container Insights。有关在 Windows 上启用 Container Insights 的信息，请参阅 [使用启用了 Container Insights 增强可观测性的 CloudWatch 代理](Container-Insights-EKS-agent.md)。

   要使用采用 OpenTelemetry 指标的 Container Insights，请安装 Amazon CloudWatch Observability EKS 附加组件版本 `v6.0.1-eksbuild.1` 或更新版本。有关更多信息，请参阅 [适用于 Amazon EKS 的采用 OpenTelemetry 指标的 Container Insights](container-insights-otel-metrics.md)。

   设置 Fluent Bit 或 Fluentd 以将日志发送到 CloudWatch Logs。（如果您安装了 Amazon CloudWatch Observabity EKS 附加组件，则默认启用此功能。）

   如果您正在使用 CloudWatch 代理，您可以作为快速入门设置的一部分立即执行这些步骤，也可以单独执行这些步骤。

1. （可选）设置 Amazon EKS 控制面板日志记录。

1. （可选）在集群上将 CloudWatch 代理设置为 StatsD 端点以将 StatsD 指标发送到 CloudWatch。

1. （可选）启用 App Mesh Envoy 访问日志。

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

**Topics**
+ [

# 在 CloudWatch 中验证 Container Insights 的先决条件
](Container-Insights-prerequisites.md)
+ [

# 使用启用了 Container Insights 增强可观测性的 CloudWatch 代理
](Container-Insights-EKS-agent.md)
+ [

# 使用 AWS Distro for OpenTelemetry
](Container-Insights-EKS-otel.md)
+ [

# 将日志发送到 CloudWatch Logs
](Container-Insights-EKS-logs.md)
+ [

# 在 Amazon EKS 和 Kubernetes 上更新或删除 Container Insights
](ContainerInsights-update-delete.md)

# 在 CloudWatch 中验证 Container Insights 的先决条件
验证先决条件

在 Amazon EKS 或 Kubernetes 上安装 Container Insights 之前，请验证以下内容。无论您是使用 CloudWatch 代理还是 AWS Distro for OpenTelemetry 在 Amazon EKS 集群上设置 Container Insights，这些先决条件都适用。
+ 在其中一个支持适用于 Amazon EKS 和 Kubernetes 的 Container Insights 的区域中，您具有正常工作的 Amazon EKS 集群或 Kubernetes 集群并附加了节点。有关支持的区域列表，请参阅[Container Insights](ContainerInsights.md)。
+ 您已安装并正在运行 `kubectl`。有关更多信息，请参阅 *Amazon EKS 用户指南* 中的[安装 `kubectl`](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。
+ 如果您使用在 AWS 上运行的 Kubernetes，而不是使用 Amazon EKS，则还需要满足以下先决条件：
  + 确保您的 Kubernetes 集群已启用基于角色的访问控制 (RBAC)。有关更多信息，请参阅《Kubernetes 参考》中的 [使用 RBAC 授权](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)。
  + 您的 kubelet 已启用 Webhook 授权模式。有关更多信息，请参阅《Kubernetes 参考》中的 [Kubelet 身份验证/授权](https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/)。

您还必须授予 IAM 权限，以使 Amazon EKS Worker 节点能够向 CloudWatch 发送指标和日志。有两种方式可执行此操作：
+ 将策略附加到 Worker 节点的 IAM 角色。这同时适用于 Amazon EKS 集群和其他 Kubernetes 集群。
+ 对集群的服务账户使用 IAM 角色，并将策略附加到此角色。这仅适用于 Amazon EKS 集群。

第一个选项授予 CloudWatch 对整个节点的权限，而对服务账户使用 IAM 角色仅授予 CloudWatch 对相应守护程序集 Pod 的访问权限。

**将策略附加到 Worker 节点的 IAM 角色**

按照以下步骤将策略附加到 Worker 节点的 IAM 角色。这同时适用于 Amazon EKS 外部的 Amazon EKS 集群和 Kubernetes 集群。

**将所需的策略附加到 Worker 节点的 IAM 角色**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 选择其中的一个 Worker 节点实例，然后在描述中选择 IAM 角色。

1. 在 IAM 角色页面上，选择 **Attach policies（附加策略）**。

1. 在策略列表中，选中 **CloudWatchAgentServerPolicy** 旁边的复选框。如有必要，请使用搜索框查找该策略。

1. 选择**附加策略**。

如果您在 Amazon EKS 外部运行 Kubernetes 集群，则可能无法将 IAM 角色附加到 Worker 节点。如果没有，您必须先将一个 IAM 角色附加到实例，然后按照前面步骤中所述添加策略。有关将角色附加到实例的更多信息，请参阅《Amazon EC2 用户指南》**中的[将 IAM 角色附加到实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)。

如果您在 Amazon EKS 外部运行 Kubernetes 集群，并且希望在指标中收集 EBS 卷 ID，则必须向附加到该实例的 IAM 角色添加另一个策略。添加以下内容作为内联策略。有关更多信息，请参阅 *IAM 用户指南*中的[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "ec2:DescribeVolumes"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

**使用 IAM 服务账户角色**

此方法仅适用于 Amazon EKS 集群。

**使用 IAM 服务账户角色向 CloudWatch 授予权限**

1. 为集群上的服务账户启用 IAM 角色（如果尚未执行此操作）。有关更多信息，请参阅[为集群上的服务账户启用 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

1. 配置服务账户以使用 IAM 角色（如果尚未进行此配置）。有关更多信息，请参阅[配置 Kubernetes 服务账户以代入 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html)。

   创建角色时，除了您为角色创建的策略外，还将 **CloudWatchAgentServerPolicy** IAM 策略附加到角色。此外，应在 `amazon-cloudwatch` 命名空间中创建链接至此角色的关联 Kubernetes 服务账户，在接下来的步骤中，CloudWatch 和 Fluent Bit 进程守护程序集将在其中部署

1. 将 IAM 角色与集群中的服务账户相关联（如果尚未执行此操作）。有关更多信息，请参阅[配置 Kubernetes 服务账户以代入 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html)。

# 使用启用了 Container Insights 增强可观测性的 CloudWatch 代理
使用启用了 Container Insights 增强可观测性

按照以下任一部分中的说明，使用 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 插件快速入门


您可以使用 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 的快速入门设置


**重要**  
如果您要在 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 快速入门


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 代理以收集集群指标


**重要**  
如果您要在 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 创建命名空间


使用以下步骤为 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"]
  - apiGroups: [ "discovery.k8s.io" ]
    resources: [ "endpointslices" ]
    verbs: [ "list", "watch", "get" ]
```

### 使用 `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}` 用户创建证书签名请求（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
   ```

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


要完成 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 指标。

### 问题排查


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

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

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

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

# 使用 AWS Distro for OpenTelemetry


您可以通过使用 AWS Distro for OpenTelemetry 收集器设置 Container Insights 从 Amazon EKS 集群收集指标。有关 AWS Distro for OpenTelemetry 的更多信息，请参阅 [AWS Distro for OpenTelemetry](https://aws.amazon.com/otel/)。

**重要**  
如果您使用 AWS Distro for OpenTelemetry 进行安装，则会安装 Container Insights，但无法获取针对 Amazon EKS 增强了可观测性的 Container Insights。您将不会收集针对 Amazon EKS 增强了可观测性的 Container Insights 中支持的详细指标。

如何设置 Container Insights 取决于集群托管在 Amazon EC2 实例上还是 AWS Fargate 上。

## 托管在 Amazon EC2 上的 Amazon EKS 集群


如果您尚未执行此操作，请确保您已满足先决条件，例如必要的 IAM 角色。有关更多信息，请参阅 [在 CloudWatch 中验证 Container Insights 的先决条件](Container-Insights-prerequisites.md)。

Amazon 提供 Helm Chart，您可以用它来设置对 Amazon EC2 上的 Amazon Elastic Kubernetes Service 的监控。此监控使用 AWS Distro for OpenTelemetry(ADOT) 收集器用于指标，使用 Fluent Bit 用于日志。因此，Helm Chart 对使用 Amazon EC2 上的 Amazon EKS 并希望收集指标和日志以发送到 CloudWatch Container Insights 的客户非常有用。有关此 Helm Chart 的更多信息，请参阅[发送到 Amazon CloudWatch Container Insights 的 EC2 上 EKS 的指标和日志的 ADOT Helm chart](https://github.com/aws-observability/aws-otel-helm-charts/tree/main/charts/adot-exporter-for-eks-on-ec2)。

或者，您也可以使用本部分剩余内容中的说明。

首先，通过输入以下命令将 AWS Distro for OpenTelemetry 收集器部署为 DaemonSet。

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

要确认该收集器正在运行，请输入以下命令。

```
kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks
```

如果此命令的输出包含处于 `Running` 状态的多个 Pod，则收集器正在运行并从集群收集指标。收集器会创建一个名为 `aws/containerinsights/cluster-name/performance` 的日志组并将性能日志事件发送给它。

有关如何在 CloudWatch 中查看 Container Insights 指标的信息，请参阅 [查看 Container Insights 指标](Container-Insights-view-metrics.md)。

AWS 还在 GitHub 上为此情况提供了文档。如果要自定义 Container Insights 发布的指标和日志，请参阅 [https://aws-otel.github.io/docs/getting-started/container-insights/eks-infra](https://aws-otel.github.io/docs/getting-started/container-insights/eks-infra)。

## 托管在 Fargate 上的 Amazon EKS 集群


有关如何配置和部署 ADOT 收集器以从部署到 Fargate 上的 Amazon EKS 集群的工作负载收集系统指标并将其发送到 CloudWatch Container Insights 的说明，请参阅 AWS Distro for OpenTelemetry 文档中的 [Container Insights EKS Fargate](https://aws-otel.github.io/docs/getting-started/container-insights/eks-fargate)。

# 将日志发送到 CloudWatch Logs


要将日志从您的容器发送到 Amazon CloudWatch Logs，您可以使用 Fluent Bit。有关更多信息，请参阅 [Fluent Bit](https://fluentbit.io/)。

**注意**  
自 2025 年 2 月 10 日起，AWS 已不再支持使用 FluentD 作为 CloudWatch Logs 的日志转发器。我们建议您使用 Fluent Bit，这是一种轻量级的资源高效型替代方案。现有的 FluenTD 部署将继续正常运行。将您的日志记录管道迁移到 Fluent Bit，以确保继续获得支持和实现最佳性能。  
Container Insights 以前还支持使用 FluentD 从容器发送日志。FluenTD 已被弃用，现在不支持 Container Insights。改为使用 Fluent Bit。

**Topics**
+ [

# 将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs
](Container-Insights-setup-logs-FluentBit.md)
+ [

# （可选）设置 Amazon EKS 控制面板日志记录
](Container-Insights-setup-control-plane-logging.md)
+ [

# （可选）为大型集群启用 Use\$1Kubelet 功能
](ContainerInsights-use-kubelet.md)

# 将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch Logs


以下部分帮助您部署 Fluent Bit 以将日志从容器发送到 CloudWatch Logs。

**Topics**
+ [

## 设置 Fluent Bit
](#Container-Insights-FluentBit-setup)
+ [

## 多行日志支持
](#ContainerInsights-fluentbit-multiline)
+ [

## （可选）从 Fluent Bit 减少日志卷
](#ContainerInsights-fluentbit-volume)
+ [

## 问题排查
](#Container-Insights-FluentBit-troubleshoot)
+ [

## 控制面板
](#Container-Insights-FluentBit-dashboard)

## 设置 Fluent Bit


要设置 Fluent Bit 以从容器中收集日志，您可以按照 [Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置](Container-Insights-setup-EKS-quickstart.md) 中的步骤操作，也可以按照本节中的步骤操作。

无论使用哪种方法，附加到集群节点的 IAM 角色必须具有足够的权限。有关运行 Amazon EKS 集群所需权限的更多信息，请参阅 *Amazon EKS 用户指南*中的 [Amazon EKS IAM 策略、角色和权限](https://docs.aws.amazon.com/eks/latest/userguide/IAM_policies.html)。

在以下步骤中，您将 Fluent Bit 设置为 daemonSet 以将日志发送到 CloudWatch Logs。在完成该步骤时，Fluent Bit 将创建以下日志组（如果尚不存在）。

**重要**  
如果您已经在 Container Insights 中配置了 FluentD 并且 FluentD DaemonSet 没有按预期运行（如果您使用 `containerd` 运行时系统可能会发生这种情况），则必须在安装 Fluent Bit 之前将其卸载，以防止 Fluent Bit 处理 FluentD 错误日志消息。否则，您必须在成功安装 Fluent Bit 后立即卸载 FluentD。在安装 Fluent Bit 后卸载 Fluentd 可确保在此迁移过程中日志记录的连续性。将日志发送到 CloudWatch Logs 只需要 Fluent Bit 或 FluentD 中的其中一个。


| 日志组名称 | 日志源 | 
| --- | --- | 
|  `/aws/containerinsights/Cluster_Name/application`  |  `/var/log/containers` 中的所有日志文件  | 
|  `/aws/containerinsights/Cluster_Name/host`  |  `/var/log/dmesg`、`/var/log/secure` 和 `/var/log/messages` 中的日志  | 
|  `/aws/containerinsights/Cluster_Name/dataplane`  |  `kubelet.service`、`kubeproxy.service` 和 `docker.service` 的 `/var/log/journal` 中的日志。  | 

**安装 Fluent Bit 以将日志从容器发送到 CloudWatch Logs**

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

1. 运行以下命令以创建一个名为 `cluster-info` 的 ConfigMap，该 ConfigMap 以集群名称和要向其发送日志的区域命名。将 *cluster-name* 和 *cluster-region* 分别替换为您的集群的名称和区域。

   ```
   ClusterName=cluster-name
   RegionName=cluster-region
   FluentBitHttpPort='2020'
   FluentBitReadFromHead='Off'
   [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
   [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On'
   kubectl create configmap fluent-bit-cluster-info \
   --from-literal=cluster.name=${ClusterName} \
   --from-literal=http.server=${FluentBitHttpServer} \
   --from-literal=http.port=${FluentBitHttpPort} \
   --from-literal=read.head=${FluentBitReadFromHead} \
   --from-literal=read.tail=${FluentBitReadFromTail} \
   --from-literal=logs.region=${RegionName} -n amazon-cloudwatch
   ```

   在此命令中，默认情况下，用于监控插件指标的 `FluentBitHttpServer` 处于启用状态。要将其关闭，请将命令中的第三行更改为命令中的 `FluentBitHttpPort=''`（空字符串）。

   同样，默认情况下，Fluent Bit 从尾部读取日志文件，并在部署后仅捕获新日志。如果您想要相反的设置，请设置 `FluentBitReadFromHead='On'`，它将收集文件系统中的所有日志。

1. 运行以下任一命令，将 Fluent Bit daemonset 下载并部署到集群中。
   + 如果需要针对 Linux 计算机的 Fluent Bit 优化配置，则请运行此命令。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
     ```
   + 如果需要针对 Windows 计算机的 Fluent Bit 优化配置，则请运行此命令。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-windows.yaml
     ```
   + 如果使用 Linux 计算机且需要更类似于 Fluentd 的 Fluent Bit 配置，则请运行此命令。

     ```
     kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
     ```
**重要**  
默认情况下，Fluent Bit 守护程序集配置会将日志级别设置为 INFO，这可能会导致 CloudWatch Logs 摄取成本增加。要减少日志摄取量和成本，您可以将日志级别更改为 ERROR。  
有关如何减少日志量的更多信息，请参阅 [（可选）从 Fluent Bit 减少日志卷](#ContainerInsights-fluentbit-volume)。

1. 运行以下命令以验证部署。每个节点应具有一个名为 **fluent-bit-\$1** 的 pod。

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

上述步骤在集群中创建了以下资源：
+ `amazon-cloudwatch` 命名空间中名为 `Fluent-Bit` 的服务账户。该服务账户用于运行 Fluent Bit daemonSet。有关更多信息，请参阅《Kubernetes 参考》中的 [管理服务账户](https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/)。
+ `amazon-cloudwatch` 命名空间中名为 `Fluent-Bit-role` 的集群角色。该集群角色为 `Fluent-Bit` 服务账户授予有关 pod 日志的 `get`、`list` 和 `watch` 权限。有关更多信息，请参阅《Kubernetes 参考》中的 [API 概述](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#api-overview/)。
+ `amazon-cloudwatch` 命名空间中的名为 `Fluent-Bit-config` 的 ConfigMap。该 ConfigMap 包含由 Fluent Bit 使用的配置。有关更多信息，请参阅《Kubernetes 任务》文档中的 [配置 Pod 以使用 ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/)。

如果要验证 Fluent Bit 设置，请按照下列步骤操作。

**验证 Fluent Bit 设置**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Log groups（日志组）**。

1. 确保您位于部署 Fluent Bit 的区域中。

1. 检查区域中的日志组列表。您将看到以下内容：
   + `/aws/containerinsights/Cluster_Name/application`
   + `/aws/containerinsights/Cluster_Name/host`
   + `/aws/containerinsights/Cluster_Name/dataplane`

1. 导航到其中一个日志组，并检查日志流的 **Last Event Time（上次事件时间）**。如果相对于您部署 Fluent Bit 的时间，它是最近的，则会验证设置。

   创建 `/dataplane` 日志组时，可能会稍有延迟。这是正常的，因为只有在 Fluent Bit 开始为该日志组发送日志时才会创建这些日志组。

## 多行日志支持


有关如何将 Fluent Bit 用于多行日志的信息，请参阅 Fluent Bit 文档的以下部分：
+ [多行解析](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing)
+ [多行和容器（v1.8）](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-and-containers-v1.8)
+ [多行核心（v1.8）](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-core-v1.8)
+ [始终在尾部输入中使用多行](https://github.com/aws/aws-for-fluent-bit/blob/mainline/troubleshooting/debugging.md#always-use-multiline-the-tail-input)

## （可选）从 Fluent Bit 减少日志卷


默认情况下，我们将 Fluent Bit 应用程序日志和 Kubernetes 元数据发送到 CloudWatch。如果您要减少发送到 CloudWatch 的数据量，可以停止将这些数据源中的一个或两个发送到 CloudWatch。如果您已按照本页上的步骤设置 Fluent Bit，则请通过之前运行的 kubectl `apply` 命令下载 Kubernetes 清单 YAML 文件，并根据您的更改对其进行修改，然后可以将其重新应用到集群。或者，如果您使用的是 Amazon CloudWatch 可观测性 EKS 加载项或 Helm 图表，则请参阅 [（可选）其他配置](install-CloudWatch-Observability-EKS-addon.md#install-CloudWatch-Observability-EKS-addon-configuration)，了解有关使用加载项的高级配置或 Helm 图表管理 Fluent Bit 配置的信息。

要停止 Fluent Bit 应用程序日志，请从 `Fluent Bit configuration` 文件中删除以下部分。

```
[INPUT]
        Name                tail
        Tag                 application.*
        Path                /var/log/containers/fluent-bit*
        Parser              docker
        DB                  /fluent-bit/state/flb_log.db
        Mem_Buf_Limit       5MB
        Skip_Long_Lines     On
        Refresh_Interval    10
```

要取消将 Kubernetes 元数据附加到发送到 CloudWatch 的日志事件，请在 Fluent Bit 配置的 `application-log.conf` 部分中添加以下筛选条件。将 *<Metadata\$11>* 和类似字段替换为实际的元数据标识符。

```
application-log.conf: |
    [FILTER]
        Name                nest
        Match               application.*
        Operation           lift
        Nested_under        kubernetes
        Add_prefix          Kube.

    [FILTER]
        Name                modify
        Match               application.*
        Remove              Kube.<Metadata_1>
        Remove              Kube.<Metadata_2>
        Remove              Kube.<Metadata_3>
    
    [FILTER]
        Name                nest
        Match               application.*
        Operation           nest
        Wildcard            Kube.*
        Nested_under        kubernetes
        Remove_prefix       Kube.
```

## 问题排查


如果您没有看到这些日志组并且查看的是正确区域，请检查 Fluent Bit daemonSet pod 日志以查找错误。

运行以下命令，并确保状态为 `Running`。

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

如果日志具有与 IAM 权限相关的错误，请检查附加到集群节点的 IAM 角色。有关运行 Amazon EKS 集群所需权限的更多信息，请参阅 *Amazon EKS 用户指南*中的 [Amazon EKS IAM 策略、角色和权限](https://docs.aws.amazon.com/eks/latest/userguide/IAM_policies.html)。

如果 pod 状态为 `CreateContainerConfigError`，请运行以下命令以获取确切的错误。

```
kubectl describe pod pod_name -n amazon-cloudwatch
```

## 控制面板


您可以创建一个控制面板来监控每个正在运行的插件的指标。您可以查看输入和输出字节以及记录处理率以及输出错误和重试/失败率的数据。要查看这些指标，您需要为 Amazon EKS 和 Kubernetes 集群安装带有 Prometheus 指标集合的 CloudWatch 代理。有关如何设置控制面板的更多信息，请参阅 [在 Amazon EKS 和 Kubernetes 集群上安装带有 Prometheus 指标收集功能的 CloudWatch 代理在 Amazon EKS 和 Kubernetes 集群上安装带有 Prometheus 指标收集功能的 CloudWatch 代理](ContainerInsights-Prometheus-Setup.md)。

**注意**  
在设置此控制面板之前，您必须为 Prometheus 指标设置 Container Insights。有关更多信息，请参阅 [Container Insights Prometheus 指标监控](ContainerInsights-Prometheus.md)。

**为 Fluent Bit Prometheus 指标创建控制面板**

1. 创建环境变量，替换以下行中右侧的值以匹配您的部署。

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   REGION_NAME=your_metric_region_such_as_us-west-1
   CLUSTER_NAME=your_kubernetes_cluster_name
   ```

1. 通过运行以下命令来创建控制面板。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body
   ```

# （可选）设置 Amazon EKS 控制面板日志记录


如果使用的是 Amazon EKS，您可以选择启用 Amazon EKS 控制面板日志记录，以直接从 Amazon EKS 控制面板中向 CloudWatch Logs 提供审计和诊断日志。有关更多信息，请参阅 [Amazon EKS 控制面板日志记录](https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html)。

# （可选）为大型集群启用 Use\$1Kubelet 功能


默认情况下，在 FluentBit Kubernetes 插件中禁用 Use\$1Kubelet 功能。启用此功能可以减少 API 服务器的流量，并缓解 API 服务器成为瓶颈的问题。我们建议您为大型集群启用此功能。

要启用 Use\$1Kubelet，请先将节点和节点/代理权限添加到 clusterRole config 中。

```
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluent-bit-role
rules:
  - nonResourceURLs:
      - /metrics
    verbs:
      - get
  - apiGroups: [""]
    resources:
      - namespaces
      - pods
      - pods/logs
      - nodes
      - nodes/proxy
    verbs: ["get", "list", "watch"]
```

在 DaemonSet 配置中，此功能需要主机网络访问权限。适用于 `amazon/aws-for-fluent-bit` 的镜像版本应为 2.12.0 或更高版本，或者 fluent bit 镜像版本应为 1.7.2 或更高版本。

```
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  namespace: amazon-cloudwatch
  labels:
    k8s-app: fluent-bit
    version: v1
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      k8s-app: fluent-bit
  template:
    metadata:
      labels:
        k8s-app: fluent-bit
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: fluent-bit
        image: amazon/aws-for-fluent-bit:2.19.0
        imagePullPolicy: Always
        env:
            - name: AWS_REGION
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: logs.region
            - name: CLUSTER_NAME
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: cluster.name
            - name: HTTP_SERVER
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: http.server
            - name: HTTP_PORT
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: http.port
            - name: READ_FROM_HEAD
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: read.head
            - name: READ_FROM_TAIL
              valueFrom:
                configMapKeyRef:
                  name: fluent-bit-cluster-info
                  key: read.tail
            - name: HOST_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: HOSTNAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name      
            - name: CI_VERSION
              value: "k8s/1.3.8"
        resources:
            limits:
              memory: 200Mi
            requests:
              cpu: 500m
              memory: 100Mi
        volumeMounts:
        # Please don't change below read-only permissions
        - name: fluentbitstate
          mountPath: /var/fluent-bit/state
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
        - name: runlogjournal
          mountPath: /run/log/journal
          readOnly: true
        - name: dmesg
          mountPath: /var/log/dmesg
          readOnly: true
      terminationGracePeriodSeconds: 10
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      volumes:
      - name: fluentbitstate
        hostPath:
          path: /var/fluent-bit/state
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config
      - name: runlogjournal
        hostPath:
          path: /run/log/journal
      - name: dmesg
        hostPath:
          path: /var/log/dmesg
      serviceAccountName: fluent-bit
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - operator: "Exists"
        effect: "NoExecute"
      - operator: "Exists"
        effect: "NoSchedule"
```

Kubernetes 插件配置应该类似于以下内容：

```
[FILTER]
        Name                kubernetes
        Match               application.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_Tag_Prefix     application.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Labels              Off
        Annotations         Off
        Use_Kubelet         On
        Kubelet_Port        10250 
        Buffer_Size         0
```

# 在 Amazon EKS 和 Kubernetes 上更新或删除 Container Insights


使用这些章节中的步骤更新 CloudWatch 代理容器镜像，或从 Amazon EKS 或 Kubernetes 集群中删除 Container Insights。

**Topics**
+ [

# 在 CloudWatch 中升级到针对 Amazon EKS 增强了可观测性的 Container Insights
](Container-Insights-upgrade-enhanced.md)
+ [

# 更新 CloudWatch 代理容器镜像
](ContainerInsights-update-image.md)
+ [

# 删除 Container Insights 的 CloudWatch 代理和 Fluent Bit
](ContainerInsights-delete-agent.md)

# 在 CloudWatch 中升级到针对 Amazon EKS 增强了可观测性的 Container Insights


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

针对 Amazon EKS 增强了可观测性的 Container Insights 是 Container Insights 的最新版本。它从运行 Amazon EKS 的集群收集详细指标，并提供精选的、可立即使用的控制面板，以深入了解应用程序和基础设施的遥测数据。有关此版本的 Container Insights 的更多信息，请参阅 [针对 Amazon EKS 增强了可观测性的 Container Insights](container-insights-detailed-metrics.md)。

如果您已在 Amazon EKS 集群中安装了 Container Insights 的原始版本，并且想要将其升级到增强了可观测性的较新版本，请按照本部分中的说明进行操作。

**重要**  
在完成本节中的步骤之前，您必须已对包含 cert-manager 等先决条件进行验证。有关更多信息，请参阅 [使用 CloudWatch 代理 operator 和 Fluent Bit 快速入门](Container-Insights-setup-EKS-quickstart.md#Container-Insights-setup-EKS-quickstart-FluentBit)。

**将 Amazon EKS 集群升级到针对 Amazon EKS 增强了可观测性的 Container Insights**

1. 输入以下命令以安装 CloudWatch 代理 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 -
   ```

   如果您发现由于资源冲突而导致故障，则可能是因为您已在集群上安装了 CloudWatch 代理和 Fluent Bit 及其关联组件（例如 ServiceAccount、ClusterRole 和 ClusterRoleBinding）。当 CloudWatch 代理 operator 尝试安装 CloudWatch 代理及其关联组件时，如果检测到内容有任何变化，则在默认情况下这会使安装或更新失败，以避免覆盖集群上资源的状态。建议您删除之前在集群上安装的带有 Container Insights 设置的所有现有 CloudWatch 代理，然后安装 CloudWatch 代理 operator。

1. （可选）要应用现有的自定义 Fluent Bit 配置，必须更新与 Fluent Bit 守护程序集关联的 configmap。CloudWatch 代理 operator 为 Fluent Bit 提供了默认配置，您可以根据需要覆盖或修改默认配置。要应用自定义配置，请按照以下步骤操作。

   1. 通过输入以下命令打开现有配置。

      ```
      kubectl edit cm fluent-bit-config -n amazon-cloudwatch
      ```

   1. 在文件中进行更改，然后输入 `:wq` 保存文件并退出编辑模式。

   1. 通过输入以下命令重启 Fluent Bit。

      ```
      kubectl rollout restart ds fluent-bit -n amazon-cloudwatch
      ```

# 更新 CloudWatch 代理容器镜像


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

如果需要将容器映像更新到最新版本，请使用本节中的步骤。

**更新您的容器映像**

1. 通过输入以下命令，验证 `amazoncloudwatchagent` 客户资源定义（CRD）是否已经存在。

   ```
   kubectl get crds amazoncloudwatchagents.cloudwatch.aws.amazon.com -n amazon-cloudwatch
   ```

   如果此命令返回缺少 CRD 的错误，则集群没有使用 CloudWatch 代理 operator 配置针对 Amazon EKS 增强了可观测性的 Container Insights。在这种情况下，请参阅[在 CloudWatch 中升级到针对 Amazon EKS 增强了可观测性的 Container Insights](Container-Insights-upgrade-enhanced.md)。

1. 输入以下命令，应用最新的 `cwagent-version.yaml` 文件。

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

# 删除 Container Insights 的 CloudWatch 代理和 Fluent Bit


如果您通过安装适用于 Amazon EKS 的 CloudWatch Observability 附加组件来安装 Container Insights，则可以通过输入以下命令删除 Container Insights 和 CloudWatch 代理：

**注意**  
Amazon EKS 附加组件现在支持 Windows Worker 节点上的 Container Insights。如果您删除 Amazon EKS 附加组件，则 Container Insights for Windows 也会被删除。

```
aws eks delete-addon —cluster-name my-cluster —addon-name amazon-cloudwatch-observability
```

否则，要删除与 CloudWatch 代理和 Fluent Bit 相关的所有资源，请输入以下命令。在此命令中，*My\$1Cluster\$1Name* 是 Amazon EKS 或 Kubernetes 集群的名称，*My\$1Region* 是在其中发布日志的区域的名称。

```
ClusterName=My_Cluster_Name
RegionName=My-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 -
```