Amazon CloudWatch
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

CloudWatch Container Insights isn't released yet. It's in preview and is subject to change. The preview is open to all AWS accounts. You do not need to request access.

在以下步骤中,您设置 CloudWatch 代理以便能够从集群中收集指标。

步骤 1:为 CloudWatch 创建命名空间

可以使用以下步骤为 CloudWatch 创建名为 amazon-cloudwatch 的 Kubernetes 命名空间。如果已创建该命名空间,您可以跳过这些步骤。

为 CloudWatch 创建命名空间

  1. 运行以下命令以将命名空间 YAML 下载到 kubectl 客户端主机中:

    curl -O https://s3.amazonaws.com/cloudwatch-agent-k8s-yamls/kubernetes-monitoring/cloudwatch-namespace.yaml
  2. 运行以下命令以创建 amazon-cloudwatch 命名空间:

    kubectl apply -f cloudwatch-namespace.yaml

步骤 2:在集群中创建服务账户

如果您还没有服务账户,请使用以下步骤为 CloudWatch 代理创建一个服务账户。

为 CloudWatch 代理创建服务账户

  1. 运行以下命令以将服务账户 YAML 下载到 kubectl 客户端主机中:

    curl -O https://s3.amazonaws.com/cloudwatch-agent-k8s-yamls/kubernetes-monitoring/cwagent-serviceaccount.yaml
  2. 运行以下命令以在 Amazon EKS 中创建服务账户。

    kubectl apply -f 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 代理创建服务账户

  1. 运行以下命令以将 ConfigMap YAML 下载到 kubectl 客户端主机中:

    curl -O https://s3.amazonaws.com/cloudwatch-agent-k8s-yamls/kubernetes-monitoring/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 – 在 structuredlogs 部分中,如果要覆盖默认终端节点,您可以指定 CloudWatch Logs 终端节点。如果您从 VPC 的集群中发布并希望将数据传输到 VPC 终端节点,则可能需要执行该操作。

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

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

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

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

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

      { "agent": { "region": "us-east-1" }, "structuredlogs": { "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

  1. 运行以下命令以将 DaemonSet YAML 下载到 kubectl 客户端主机中:

    curl -O https://s3.amazonaws.com/cloudwatch-agent-k8s-yamls/kubernetes-monitoring/cwagent-daemonset.yaml
  2. statsd 部分 –(可选)如果您希望 CloudWatch Logs 代理还在集群的每个工作线程节点中作为 StatsD 侦听器运行,请取消注释 cwagent-daemonset.yaml 文件中的 port 部分,如下所示:

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

    kubectl apply -f cwagent-daemonset.yaml
  4. 运行以下命令以验证是否部署了该代理:

    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-name -n amazon-cloudwatch
  • 运行以下命令以检查日志:

    kubectl logs pod-name -n amazon-cloudwatch