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

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