设置 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 代理创建一个服务账户。

  • 使用 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"]

使用 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
  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 部分的完整示例如下所示。如果您使用 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" } } } }
  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
      4. 运行以下命令以在集群中的 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