设置 CloudWatch 代理以收集集群指标 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

设置 CloudWatch 代理以收集集群指标

重要

如果您要在 Amazon EKS 集群上安装 Container Insights,我们建议您使用 Amazon CloudWatch Observability EKS 附加组件进行安装,而不是按照本部分中的说明进行安装。有关更多信息和说明,请参阅 安装 Amazon CloudWatch Observability EKS 附加组件

要设置 Container Insights 以收集指标,您可以按照Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置中的步骤操作,也可以按照本节中的步骤操作。在以下步骤中,您设置 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 代理创建一个服务账户。

为 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: ["watch", "list"] - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"] - apiGroups: [""] resources: ["nodes/stats", "configmaps", “events”] verbs: ["create"] - apiGroups: [""] resources: ["configmaps"] resourceNames: ["cwagent-clusterleader"] verbs: ["get", "update"] - nonResourceURLs: ["/metrics"] verbs: ["get"]

步骤 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.yaml
  2. 编辑下载的 YAML 文件,如下所示:

    • cluster_name – 在 kubernetes 部分中,将 {{cluster_name}} 替换为您的集群的名称。删除 {{}} 字符。或者,如果使用的是 Amazon EKS 集群,您可以删除 "cluster_name" 字段和值。如果这样做,CloudWatch 代理将从 Amazon EC2 标签中检测集群名称。

  3. (可选)根据您的监控要求,对 ConfigMap 进行进一步的更改,如下所示:

    • metrics_collection_interval – 在 kubernetes 部分中,您可以指定代理收集指标的频率。默认值为 60 秒。kubelet 中的默认 cadvisor 收集间隔为 15 秒,因此,请不要将该值设置为小于 15 秒。

    • endpoint_override – 在 logs 部分中,如果要覆盖默认端点,您可以指定 CloudWatch Logs 端点。如果您从 VPC 的集群中发布并希望将数据传输到 VPC 终端节点,则可能需要执行该操作。

    • force_flush_interval – 在 logs 部分中,您可以指定在将日志事件发布到 CloudWatch Logs 之前批量处理这些事件的间隔。默认值为 5 秒。

    • region – 默认情况下,代理将指标发布到 Worker 节点所在的区域。要覆盖该区域,您可以在 agent 部分中添加 region 字段:例如,"region":"us-west-2"

    • statsd 部分 – 如果希望 CloudWatch Logs 代理还在集群的每个 Worker 节点中作为 StatsD 侦听器运行,您可以将 statsd 部分添加到 metrics 部分中,如以下示例中所示。有关该部分的其他 StatsD 选项的信息,请参阅 使用 StatsD 检索自定义指标

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

      JSON 部分的完整示例如下所示。

      { "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "MyCluster", "metrics_collection_interval": 60 } }, "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. 运行以下命令以将 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
      2. 取消注释 port 文件中的 cwagent-daemonset.yaml 部分,如下所示:

        ports: - containerPort: 8125 hostPort: 8125 protocol: UDP
      3. 运行以下命令以在集群中部署 CloudWatch 代理。

        kubectl apply -f cwagent-daemonset.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