配置用于 Prometheus 监控的 CloudWatch 代理 - Amazon CloudWatch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

配置用于 Prometheus 监控的 CloudWatch 代理

的 CloudWatch 具有Prometheus监控的代理需要两种配置来抓取Prometheus指标。一个用于标准Prometheus配置,如 <scrape_Configuration> Prometheus文档。另一个是 CloudWatch 代理配置。

对于 Amazon EKS 群集中,配置在 prometheus-eks.yaml YAML文件作为两个配置映射:

  • name: prometheus-config 部分包含 Prometheus 抓取的设置。

  • name: prometheus-cwagentconfig 部分包含 CloudWatch 代理的配置。您可以使用此部分配置 CloudWatch 如何收集 Prometheus 指标。例如,您指定要导入哪些指标 CloudWatch,并定义其尺寸。

对于运行中的Kubernetes群集 Amazon EC2 实例,配置在 prometheus-k8s.yaml YAML文件作为两个配置映射:

  • name: prometheus-config 部分包含 Prometheus 抓取的设置。

  • name: prometheus-cwagentconfig 部分包含 CloudWatch 代理的配置。

对于 Amazon ECS 群集,配置与 Parameter Store 第页,共页 AWS Systems Manager 的秘密, Amazon ECS 任务定义:

  • 秘诀 PROMETHEUS_CONFIG_CONTENT 是Prometheus刮片配置。

  • 秘诀 CW_CONFIG_CONTENT 是 CloudWatch 代理配置。

要抓取额外的Prometheus指标来源,并将这些指标导入 CloudWatch,您可以修改Prometheus刮片配置和 CloudWatch 然后,使用更新后的配置重新部署代理。

Prometheus 抓取配置

的 CloudWatch 代理支持标准Prometheus刮片配置,如 <scrape_Configuration> Prometheus文档。您可以编辑此部分以更新此文件中的配置,并添加其他Prometheus抓取目标。默认情况下,示例配置文件包含以下全局配置行:

global: scrape_interval: 1m scrape_timeout: 10s
  • trape_interval— 定义抓取目标的频率。

  • crapee_超时— 定义报废请求超时前等待的时间。

您还可以在作业级别为这些设置定义不同的值,以覆盖全局配置。

Prometheus 抓取作业

CloudWatch 代理 YAML 文件已配置了一些默认的抓取作业。例如, prometheus-eks.yaml,默认报废工作在 job_namescrape_configs 第节。在此文件中,以下默认值 kubernetes-pod-jmx 章节抓取JMX出口商指标。

- job_name: 'kubernetes-pod-jmx' sample_limit: 10000 metrics_path: /metrics kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__address__] action: keep regex: '.*:9404$' - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod_name - action: replace source_labels: - __meta_kubernetes_pod_container_name target_label: container_name - action: replace source_labels: - __meta_kubernetes_pod_controller_name target_label: pod_controller_name - action: replace source_labels: - __meta_kubernetes_pod_controller_kind target_label: pod_controller_kind - action: replace source_labels: - __meta_kubernetes_pod_phase target_label: pod_phase

这些默认目标中的每个目标都会被抓取,并使用嵌入式指标格式在日志事件中将指标发送到 CloudWatch。有关更多信息,请参阅 采用 CloudWatch 嵌入式指标格式提取高基数日志并生成指标。)

记录事件来自 Amazon EKS 和Kubernetes集群存储在 /aws/containerinsights/cluster_name/prometheus 登录组 CloudWatch Logs. 记录事件来自 Amazon ECS 群集存储在 /aws/ecs/containerinsights/cluster_name/prometheus 日志组。

每个抓取作业都包含在此日志组中的不同日志流中。例如,为 App Mesh 定义了 Prometheus 抓取作业 kubernetes-pod-appmesh-envoy。全部 App Mesh Prometheus指标来自 Amazon EKS 和Kubernetes集群被发送到名为 /aws/containerinsights/cluster_name>prometheus/kubernetes-pod-appmeshiesh-envoy/.

要添加新的抓取目标,请将新的 job_name 部分添加到 YAML 文件的 scrape_configs 部分,然后重新启动代理。有关此过程的示例,请参阅 添加新Prometheus报废目标教程: PrometheusAPI服务器指标

Prometheus 的 CloudWatch 代理配置

的 CloudWatch 代理配置文件具有 prometheus 章节 metrics_collected Prometheus报废配置。它包括以下配置选项:

  • cluster_name(群集名称)— 指定在日志事件中作为标签添加的群集名称。此字段为可选项 如果您省略了,代理可以检测到 Amazon EKS 或 Amazon ECS 群集名称。

  • log_组_名称— 指定报废Prometheus指标的日志组名称。此字段为可选项 如果省略了, CloudWatch 使用 /aws/containerinsights/cluster_name/prometheus 日志来自 Amazon EKS 和Kubernetes集群,并使用 /aws/ecs/containerinsights/cluster_name/prometheus 日志来自 Amazon ECS 群集。

  • prometheus_config_path— 指定 Prometheus 抓取配置文件路径。如果该字段的值开头为 env: Prometheus抓取的配置文件内容将从容器的环境变量中检索。请勿更改此字段。

  • ecs_服务_发现— 是用于指定 Amazon ECS Prometheus目标为自动发现功能。支持两种模式来发现Prometheus目标:基于容器docker标签的发现或基于 Amazon ECS 任务定义ARN规则表达。您可以同时使用这两种模式, CloudWatch 代理将根据以下因素对发现的目标进行去重复: {private_ip}:{port}/{metrics_path}.

    ecs_service_discovery 部分可包含以下字段:

    • sd_frequency 是发现Prometheus出口商的频率。指定一个数字和一个单位后缀。例如, 1m 每分钟一次或 30s 每30秒一次。有效单位后缀为 ns, us, ms, s, m、和 h.

      此字段为可选项 默认值为60秒(1分钟)。

    • sd_target_cluster 是 Amazon ECS 自动发现的群集名称。此字段为可选项 默认是 Amazon ECS 聚类,其中 CloudWatch 代理安装。

    • sd_cluster_region 是 Amazon ECS 群集的“区域”。此字段为可选项 默认值为 Amazon ECS 聚类,其中 CloudWatch 代理已安装。

    • sd_result_file 是Prometheus目标结果的YAML文件的路径。Prometheus刮片配置将引用此文件。

    • docker_label 是可选部分,您可以使用它来指定基于docker标签的服务发现的配置。如果您省略了此部分,则不使用基于docker标签的发现。此部分可包含以下字段:

      • sd_port_label 是容器的docker标签名称,用于指定Prometheus指标的容器端口。默认值为 ECS_PROMETHEUS_EXPORTER_PORT。如果容器上没有此停泊标签, CloudWatch 代理将跳过它。

      • sd_metrics_path_label 是指定Prometheus指标路径的容器的docker标签名称。默认值为 ECS_PROMETHEUS_METRICS_PATH。如果容器没有此docker标签,则代理会采用默认路径 /metrics.

      • sd_job_name_label 是容器的docker标签名称,用于指定Prometheus抓取作业名称。默认值为 job。如果容器上没有此停泊标签, CloudWatch 代理在Prometheus抓取配置中使用作业名称。

    • task_definition_list 是可选部分,您可以使用它来指定基于任务定义的服务发现的配置。如果省略此部分,则不使用基于任务定义的发现。此部分可包含以下字段:

      • sd_task_definition_arn_pattern 是用于指定 Amazon ECS 任务定义以发现。这是一个规则表达。

      • sd_metrics_ports 列出了Prometheus指标的容器端口。用分号分隔容器端口。

      • sd_container_name_pattern 指定 Amazon ECS 任务容器名称。这是一个规则表达。

      • sd_metrics_path 指定Prometheus指标路径。如果省略了此操作,代理将假定默认路径 /metrics

      • sd_job_name 指定Prometheus刮片作业名称。如果您省略了该字段, CloudWatch 代理在Prometheus抓取配置中使用作业名称。

  • metric_declaration— 是指定要生成的采用嵌入式指标格式的日志数组的部分。默认情况下,CloudWatch 代理从中进行导入的每个 Prometheus 源都有 metric_declaration 部分。这些部分各包括以下字段:

    • label_matcher 是一种常规表达,用于检查 source_labels。匹配的指标被启用,以包含在发送到的嵌入指标格式中 CloudWatch.

    • source_labels 指定由 label_matcher 行检查的标签的值。

    • label_separator 指定要在 label_matcher 行中使用的分隔符(如果指定了多个 source_labels)。默认值为 ;。您可以看到,在 label_matcher 示例如下。

    • metric_selectors 是一个正则表达式,用于指定要收集并发送到 CloudWatch 的指标。

    • dimensions 是要用作每个选定指标的 CloudWatch 维度的标签列表。

请参阅以下 metric_declaration 示例。

"metric_declaration": [ { "source_labels":[ "Service", "Namespace"], "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system$", "dimensions":[ ["Service", "Namespace"] ], "metric_selectors":[ "^coredns_dns_request_type_count_total$" ] } ]

此示例配置嵌入式指标格式部分,以便在满足以下条件时作为日志事件发送:

  • Service 的值包含 node-exporterkube-dns

  • Namespace 的值为 kube-system

  • Prometheus 指标 coredns_dns_request_type_count_total 同时包含 ServiceNamespace 标签。

发送的日志事件包括以下突出显示的部分:

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"coredns_dns_request_type_count_total" } ], "Dimensions":[ [ "Namespace", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "Namespace":"kube-system", "Service":"kube-dns", "coredns_dns_request_type_count_total":2562, "eks_amazonaws_com_component":"kube-dns", "instance":"192.168.61.254:9153", "job":"kubernetes-service-endpoints", ... }

添加新Prometheus报废目标教程: PrometheusAPI服务器指标

默认情况下,Kubernetes API 服务器会在终端节点上公开 Prometheus 指标。Kubernetes API 服务器抓取配置的官方示例可在 Github 上找到。

以下教程演示如何执行以下步骤以开始将 Kubernetes API 服务器指标导入到 CloudWatch 中:

  • 将 Kubernetes API 服务器的 Prometheus 抓取配置添加到 CloudWatch 代理 YAML 文件。

  • 在 CloudWatch 代理 YAML 文件中配置嵌入式指标格式指标定义。

  • (可选)为 Kubernetes API 服务器指标创建 CloudWatch 控制面板。

注意

Kubernetes API 服务器公开计量表、计数器、直方图和摘要指标。在此版本的 Prometheus 指标支持中,CloudWatch 仅导入具有计量表和计数器类型的指标。

开始在 CloudWatch 中收集 Prometheus Kubernetes API 服务器指标

  1. 通过输入以下命令之一,下载 prometheus-eks.yamlprometheus-k8s.yaml 文件的最新版本。对于 Amazon EKS 集群,请输入以下命令:

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml

    对于在 Amazon EC2 实例上运行的 Kubernetes 集群,请输入以下命令:

    https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/master/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
  2. 使用文本编辑器打开文件,找到 prometheus-config 部分,然后在该部分中添加以下部分。然后,保存更改:

    # Scrape config for API servers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints namespaces: names: - default scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: kubernetes;https - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: Service
  3. 当 YAML 文件仍在文本编辑器中处于打开状态时,找到 cwagentconfig.json 部分。添加以下子部分并保存更改。本部分将API服务器指标放在 CloudWatch 允许列出。将三种类型的API服务器指标添加到允许列表中:

    • etcd 对象计数

    • API 服务器注册控制器指标

    • API 服务器请求指标

    {"source_labels": ["job", "resource"], "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)", "dimensions": [["ClusterName","Service","resource"]], "metric_selectors": [ "^etcd_object_counts$" ] }, {"source_labels": ["job", "name"], "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$", "dimensions": [["ClusterName","Service","name"]], "metric_selectors": [ "^workqueue_depth$", "^workqueue_adds_total$", "^workqueue_retries_total$" ] }, {"source_labels": ["job","code"], "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$", "dimensions": [["ClusterName","Service","code"]], "metric_selectors": [ "^apiserver_request_total$" ] }, {"source_labels": ["job"], "label_matcher": "^kubernetes-apiservers", "dimensions": [["ClusterName","Service"]], "metric_selectors": [ "^apiserver_request_total$" ] },
  4. 如果您已在集群中部署了具有 Prometheus 支持的 CloudWatch 代理,则必须通过输入以下命令将其删除:

    kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
  5. 通过输入以下命令之一,使用更新的配置部署 CloudWatch 代理。对于 Amazon EKS 集群,请输入:

    kubectl apply -f prometheus-eks.yaml

    对于 Kubernetes 集群,请输入此命令:

    kubectl apply -f prometheus-k8s.yaml

完成此操作后,您应该看到名为 kubernetes-apiservers /aws/containerinsights/cluster_name/prometheus 日志组。此日志流应使用嵌入式指标格式定义来嵌入日志事件,如下所示:

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"apiserver_request_total" } ], "Dimensions":[ [ "ClusterName", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "ClusterName":"my-cluster-name", "Namespace":"default", "Service":"kubernetes", "Timestamp":"1592267020339", "Version":"0", "apiserver_request_count":0, "apiserver_request_total":0, "code":"0", "component":"apiserver", "contentType":"application/json", "instance":"192.0.2.0:443", "job":"kubernetes-apiservers", "prom_metric_type":"counter", "resource":"pods", "scope":"namespace", "verb":"WATCH", "version":"v1" }

您可以在 CloudWatch 控制台中的 ContainerInsights/Prometheus 命名空间中查看您的指标。您也可以选择创建一个 CloudWatch PrometheusKubernetesAPI服务器指标的控制面板。

(可选)为KubernetesAPI服务器指标创建仪表板

要在控制面板中查看 Kubernetes API 服务器指标,您必须先完成前面几个部分中的步骤,然后才能开始在 CloudWatch 中收集这些指标。

如何创建KubernetesAPI服务器指标的仪表盘

  1. 通过以下网址打开 CloudWatch 控制台:https://console.amazonaws.cn/cloudwatch/

  2. 确保选择了正确的 AWS 区域。

  3. 在导航窗格中,选择 Dashboards

  4. 选择创建控制面板。输入新控制面板的名称,然后选择创建控制面板

  5. 添加到该控制面板中,选择取消

  6. 依次选择操作编辑控制面板

  7. 下载以下JNS文件: KubernetesAPI仪表板来源.

  8. 使用文本编辑器打开下载的 JSON 文件,然后执行以下更改:

    • 将所有 {{YOUR_CLUSTER-NAME}} 字符串替换为您的集群的确切名称。请勿在文本之前或之后添加空格。

    • 将所有 {{YOUR_REGION}} 字符串替换为在其中收集指标的区域的名称。例如 us-west-2。确保在文本前后不要添加空白。

  9. 复制整个 JSON blob 并将其粘贴到 CloudWatch 控制台的文本框中,替换框中已有的内容。

  10. 选择更新保存控制面板