使用 AWS 托管收集器 - Amazon Managed Service for Prometheus

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS 托管收集器

要使用 Amazon Managed Service for Prometheus 收集器,您必须创建一个抓取程序,用于发现和提取您的 Amazon EKS 集群中的指标。

  • 您可以在创建 Amazon EKS 集群的过程中创建抓取程序。有关创建 Amazon EKS 集群(包括创建抓取程序)的更多信息,请参阅《Amazon EKS 用户指南》中的创建 Amazon EKS 集群

  • 您可以使用 AWS API 以编程方式创建自己的抓取工具,也可以使用. AWS CLI

Amazon Managed Service for Prometheus 收集器会抓取与 Prometheus 兼容的指标。有关与 Prometheus 兼容的指标的更多信息,请参阅与 Prometheus 兼容的指标有哪些?

注意

从集群中抓取指标可能会产生网络使用费,例如跨区域流量。优化这些成本的一种方法是将您的/metrics终端节点配置为压缩提供的指标(例如,使用 gzip),从而减少必须在网络上移动的数据。如何执行此操作取决于提供指标的应用程序或库。有些库默认为 gzip。

以下主题介绍如何创建、管理和配置抓取程序。

创建抓取程序

Amazon Managed Service for Prometheus 收集器由一个抓取程序组成,用于发现和收集 Amazon EKS 集群中的指标。Amazon Managed Service for Prometheus 为您管理抓取程序,为您提供所需的可扩展性、安全性和可靠性,无需您自行管理任何实例、代理或抓取程序。

当您通过 Amazon EKS 控制台创建 Amazon EKS 集群时,系统会自动为您创建抓取程序。但是,在某些情况下,您可能需要自行创建抓取程序。例如,如果您想向现有 Amazon EKS 集群添加 AWS 托管收集器,或者想要更改现有收集器的配置。

您可以使用 AWS API 或. 创建抓取工具 AWS CLI。

创建您自己的抓取程序时有以下几个先决条件:

  • 您必须创建了 Amazon EKS 集群。

  • 必须将 Amazon EKS 集群的集群端点访问控制设置为包括私有访问。它可以包括私有和公有访问,但必须包括私有访问。

注意

集群将通过其 Amazon 资源名称 (ARN) 与抓取工具相关联。如果您删除了一个集群,然后创建了一个同名的新集群,则 ARN 将重新用于新集群。因此,抓取器将尝试收集新集群的指标。您可以将抓取器与删除集群分开删除。

AWS API

使用 AWS API 创建抓取工具

使用 AWS API 通过 CreateScraper API 操作创建抓取程序。以下示例在 us-west-2 区域中创建抓取程序。您需要将工作空间 AWS 账户、安全和 Amazon EKS 集群信息替换为自己的 ID,并提供用于抓取工具的配置。

注意

应将安全组和子网设置为要连接的集群的安全组和子网。

您必须在至少两个可用区中至少包括两个子网。

scrapeConfiguration 是一个采用 base64 编码的 Prometheus 配置 YAML 文件。您可以通过 GetDefaultScraperConfiguration API 操作下载通用配置。有关格式的更多信息scrapeConfiguration,请参阅抓取程序配置

POST /scrapers HTTP/1.1 Content-Length: 415 Authorization: AUTHPARAMS X-Amz-Date: 20201201T193725Z User-Agent: aws-cli/1.18.147 Python/2.7.18 Linux/5.4.58-37.125.amzn2int.x86_64 botocore/1.18.6 { "alias": "myScraper", "destination": { "ampConfiguration": { "workspaceArn": "arn:aws:aps:us-west-2:account-id:workspace/ws-workspace-id" } }, "source": { "eksConfiguration": { "clusterArn": "arn:aws:eks:us-west-2:account-id:cluster/cluster-name", "securityGroupIds": ["sg-security-group-id"], "subnetIds": ["subnet-subnet-id-1", "subnet-subnet-id-2"] } }, "scrapeConfiguration": { "configurationBlob": <base64-encoded-blob> } }
AWS CLI

要创建刮刀,请使用 AWS CLI

使用create-scraper命令创建带有的抓取器 AWS CLI。以下示例在 us-west-2 区域中创建抓取程序。您需要将工作空间 AWS 账户、安全和 Amazon EKS 集群信息替换为自己的 ID,并提供用于抓取工具的配置。

注意

应将安全组和子网设置为要连接的集群的安全组和子网。

您必须在至少两个可用区中至少包括两个子网。

scrape-configuration 是一个采用 base64 编码的 Prometheus 配置 YAML 文件。您可以使用get-default-scraper-configuration命令下载通用配置。有关格式的更多信息scrape-configuration,请参阅抓取程序配置

aws amp create-scraper \ --source eksConfiguration="{clusterArn='arn:aws:eks:us-west-2:account-id:cluster/cluster-name', securityGroupIds=['sg-security-group-id'],subnetIds=['subnet-subnet-id-1', 'subnet-subnet-id-2']}" \ --scrape-configuration configurationBlob=<base64-encoded-blob> \ --destination ampConfiguration="{workspaceArn='arn:aws:aps:us-west-2:account-id:workspace/ws-workspace-id'}"

以下是您可以与 AWS API 一起使用的抓取程序操作的完整列表:

注意

必须将您要抓取的 Amazon EKS 集群配置为允许 Amazon Managed Service for Prometheus 访问这些指标。下一个主题介绍如何配置集群。

创建抓取器时的常见错误

以下是尝试创建新抓取器时最常见的问题。

  • 所需 AWS 资源不存在。指定的安全组子网Amazon EKS 集群必须存在。

  • IP 地址空间不足。在传递给 CreateScraper API 的每个子网中,您必须至少有一个可用的 IP 地址。

配置 Amazon EKS 集群

必须将 Amazon EKS 集群配置为允许抓取程序访问指标。此配置有两个选项:

  • 使用 Amazon EKS 访问条目自动为亚马逊托管服务提供 Prometheus 收集者访问您的集群的权限。

  • 手动配置您的 Amazon EKS 集群以进行托管指标抓取。

以下主题更详细地描述了其中的每一个。

将 Amazon EKS 配置为使用访问条目进行抓取器访问

使用 Amazon EKS 的访问条目是授予适用于 Prometheus 的亚马逊托管服务访问权限以从您的集群中抓取指标的最简单方法。

您要抓取的 Amazon EKS 集群必须配置为允许 API 身份验证。集群身份验证模式必须设置为APIAPI_AND_CONFIG_MAP。这可以在 Amazon EKS 控制台的集群详细信息的 “访问配置” 选项卡上查看。有关更多信息,请参阅亚马逊 EKS 用户指南中的允许 IAM 角色或用户访问您的 Amazon EKS 集群上的 Kubernetes 对象

你可以在创建集群时或在创建集群之后创建抓取器:

访问权限策略已创建

当您创建抓取器并让适用于 Prometheus 的亚马逊托管服务为您生成访问权限策略时,它会生成以下策略。有关访问条目的更多信息,请参阅 A mazon EKS 用户指南中的允许 IAM 角色或用户访问 Kubernetes

{ "rules": [ { "effect": "allow", "apiGroups": [ "" ], "resources": [ "nodes", "nodes/proxy", "nodes/metrics", "services", "endpoints", "pods", "ingresses", "configmaps" ], "verbs": [ "get", "list", "watch" ] }, { "effect": "allow", "apiGroups": [ "extensions", "networking.k8s.io" ], "resources": [ "ingresses/status", "ingresses" ], "verbs": [ "get", "list", "watch" ] }, { "effect": "allow", "nonResourceURLs": [ "/metrics" ], "verbs": [ "get" ] } ] }

手动配置 Amazon EKS 以获取抓取工具访问权限

如果您更喜欢使用aws-auth ConfigMap来控制对 kubernetes 集群的访问权限,您仍然可以让适用于 Prometheus 抓取器的亚马逊托管服务访问您的指标。以下步骤将使适用于 Prometheus 的亚马逊托管服务能够从您的亚马逊 EKS 集群中获取指标。

注意

有关ConfigMap和访问条目的更多信息,请参阅 A mazon EKS 用户指南中的允许 IAM 角色或用户访问 Kubernetes

此过程使用kubectl和 AWS CLI。有关安装 kubectl 的信息,请参阅《Amazon EKS 用户指南》中的安装 kubectl

手动配置您的 Amazon EKS 集群以进行托管指标抓取
  1. 使用以下文本创建名为 clusterrole-binding.yml 的文件:

    apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: aps-collector-role rules: - apiGroups: [""] resources: ["nodes", "nodes/proxy", "nodes/metrics", "services", "endpoints", "pods", "ingresses", "configmaps"] verbs: ["describe", "get", "list", "watch"] - apiGroups: ["extensions", "networking.k8s.io"] resources: ["ingresses/status", "ingresses"] verbs: ["describe", "get", "list", "watch"] - nonResourceURLs: ["/metrics"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: aps-collector-user-role-binding subjects: - kind: User name: aps-collector-user apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: aps-collector-role apiGroup: rbac.authorization.k8s.io
  2. 在集群中运行以下命令。

    kubectl apply -f clusterrole-binding.yml

    这将创建集群角色绑定和规则。此示例使用 aps-collector-role 作为角色名称,使用 aps-collector-user 作为用户名。

  3. 以下命令为您提供有关 ID 为 scraper-id 的抓取程序的信息。这是您使用上一节中的命令创建的抓取程序。

    aws amp describe-scraper --scraper-id scraper-id
  4. describe-scraper 的结果中找到 roleArn。其格式如下所示:

    arn:aws:iam::account-id:role/aws-service-role/scraper.aps.amazonaws.com/AWSServiceRoleForAmazonPrometheusScraper_unique-id

    Amazon EKS 要求此 ARN 采用不同的格式。您必须调整返回的 ARN 的格式,以便在下一步中使用。对其进行编辑以匹配以下格式:

    arn:aws:iam::account-id:role/AWSServiceRoleForAmazonPrometheusScraper_unique-id

    例如,此 ARN:

    arn:aws:iam::111122223333:role/aws-service-role/scraper.aps.amazonaws.com/AWSServiceRoleForAmazonPrometheusScraper_1234abcd-56ef-7

    必须重新编写为:

    arn:aws:iam::111122223333:role/AWSServiceRoleForAmazonPrometheusScraper_1234abcd-56ef-7
  5. 使用上一步中修改过的 roleArn 以及您的集群名称和区域,在集群中运行以下命令:

    eksctl create iamidentitymapping --cluster cluster-name --region region-id --arn roleArn --username aps-collector-user

    这允许抓取程序使用您在 clusterrole-binding.yml 文件中创建的角色和用户访问集群。

查找和删除抓取程序

您可以使用 AWS API 或列 AWS CLI 出您账户中的抓取器或将其删除。

注意

请确保您使用的是 AWS CLI 或 SDK 的最新版本。最新版本为您提供最新的特性和功能以及安全更新。或者,也可以使用 AWS Cloudshell,它可以自动提供始终是 up-to-date 命令行体验。

要列出您账户中的所有抓取器,请使用 ListScrapersAPI 操作。

或者,使用 AWS CLI,拨打:

aws amp list-scrapers

ListScrapers 返回您账户中的所有抓取程序,例如:

{ "scrapers": [ { "scraperId": "s-1234abcd-56ef-7890-abcd-1234ef567890", "arn": "arn:aws:aps:us-west-2:123456789012:scraper/s-1234abcd-56ef-7890-abcd-1234ef567890", "roleArn": "arn:aws:iam::123456789012:role/aws-service-role/AWSServiceRoleForAmazonPrometheusScraper_1234abcd-2931", "status": { "statusCode": "DELETING" }, "createdAt": "2023-10-12T15:22:19.014000-07:00", "lastModifiedAt": "2023-10-12T15:55:43.487000-07:00", "tags": {}, "source": { "eksConfiguration": { "clusterArn": "arn:aws:eks:us-west-2:123456789012:cluster/my-cluster", "securityGroupIds": [ "sg-1234abcd5678ef90" ], "subnetIds": [ "subnet-abcd1234ef567890", "subnet-1234abcd5678ab90" ] } }, "destination": { "ampConfiguration": { "workspaceArn": "arn:aws:aps:us-west-2:123456789012:workspace/ws-1234abcd-5678-ef90-ab12-cdef3456a78" } } } ] }

要删除抓取器,请使用ListScrapers操作找到要删除的抓取器,然后使用该DeleteScraper操作将其删除。scraperId

或者,使用 AWS CLI,拨打:

aws amp delete-scraper --scraper-id scraperId

抓取程序配置

您可以使用兼容 Prometheus 的抓取程序配置来控制抓取程序如何发现和收集指标。例如,您可以更改将指标发送到工作区的时间间隔。您还可以使用重新标记来动态重写指标的标签。抓取程序配置是一个 YAML 文件,是抓取程序定义的一部分。

创建新的抓取程序时,您需通过在 API 调用中提供 base64 编码的 YAML 文件来指定配置。您可以在 Amazon Managed Service for Prometheus API 中通过 GetDefaultScraperConfiguration 操作下载通用配置文件。

要修改抓取程序的配置,请删除抓取程序并使用新的配置重新创建它。

支持的配置

有关抓取器配置格式的信息,包括可能值的详细明细,请参阅 Prometheus 文档中的配置。全局配置选项和 <scrape_config> 选项描述了最常用的选项。

由于 Amazon EKS 是唯一支持的服务,因此唯一支持的服务发现配置 (<*_sd_config>) 是<kubernetes_sd_config>

允许的配置部分的完整列表:

  • <global>

  • <scrape_config>

  • <static_config>

  • <relabel_config>

  • <metric_relabel_configs>

  • <kubernetes_sd_config>

这些部分中的限制列在示例配置文件之后。

示例配置文件

以下是抓取间隔为 30 秒的 YAML 配置文件示例。

global: scrape_interval: 30s external_labels: clusterArn: apiserver-test-2 scrape_configs: - job_name: pod_exporter kubernetes_sd_configs: - role: pod - job_name: cadvisor scheme: https authorization: type: Bearer credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - replacement: kubernetes.default.svc:443 target_label: __address__ - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor # apiserver metrics - scheme: https authorization: type: Bearer credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token job_name: kubernetes-apiservers kubernetes_sd_configs: - role: endpoints relabel_configs: - action: keep regex: default;kubernetes;https source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_name - __meta_kubernetes_endpoint_port_name # kube proxy metrics - job_name: kube-proxy honor_labels: true kubernetes_sd_configs: - role: pod relabel_configs: - action: keep source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_pod_name separator: '/' regex: 'kube-system/kube-proxy.+' - source_labels: - __address__ action: replace target_label: __address__ regex: (.+?)(\\:\\d+)? replacement: $1:10249

以下是 AWS 托管收集器特有的限制:

  • 抓取间隔:抓取程序配置无法将抓取间隔指定为小于 30 秒。

  • 目标:必须将 static_config 中的目标指定为 IP 地址。

  • DNS 解析 — 与目标名称相关,此配置中唯一可识别的服务器名称是 Kubernetes api 服务器。kubernetes.default.svc所有其他计算机的名称必须通过 IP 地址指定。

  • 授权-如果不需要授权,则省略。如果需要,则授权必须是Bearer,并且必须指向文件/var/run/secrets/kubernetes.io/serviceaccount/token。换句话说,如果使用,授权部分必须如下所示:

    authorization: type: Bearer credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    注意

    type: Bearer是默认值,因此可以省略。

排查抓取程序配置问题

Amazon Managed Service for Prometheus 收集器可自动发现和抓取指标。但是,当您在 Amazon Managed Service for Prometheus 工作区中看不到预期的指标时,如何排查问题呢?

up 指标是一种有用的工具。对于 Amazon Managed Service for Prometheus 收集器发现的每个端点,它都会自动提供此指标。此指标有三种状态,可以帮助您对收集器内部发生的问题进行排查。

  • up 不存在 - 如果某个端点没有 up 指标,则表示收集器找不到该端点。

    如果您确定端点存在,则可能需要调整抓取配置。发现 relabel_config 可能需要调整,或者用于发现的 role 可能存在问题。

  • up 存在,但始终为 0 - 如果 up 存在,但为 0,则表示收集器能够发现端点,但找不到任何与 Prometheus 兼容的指标。

    在这种情况下,您可以尝试直接对端点使用 curl 命令。您可以验证您的详细信息是否正确,例如您正在使用的协议(httphttps)、端点或端口。您还可以检查端点是否使用有效的响应进行响200应,并遵循 Prometheus 格式。最后,响应的主体不能大于允许的最大大小。(有关 AWS 托管收集器的限制,请参阅以下部分。)

  • up 存在且大于 0 - 如果 up 存在且大于 0,则表示指标将发送到 Amazon Managed Service for Prometheus。

    检查您在 Amazon Managed Service for Prometheus(或您的备用控制面板,例如 Amazon Managed Grafana)中查找的指标是否正确。您可以再次使用 curl 来检查 /metrics 端点中的预期数据。还需检查您是否没有超过其他限制,例如每个抓取程序的端点数量。您可以使用,通过检查指标计数来检查正在抓取的up指标端点的数量。count(up)

抓取程序限制

Amazon Managed Service for Prometheus 提供的完全托管的抓取程序几乎没有限制。

  • 区域:您的 EKS 集群、托管抓取程序和 Amazon Managed Service for Prometheus 工作区必须全部位于同一个 AWS 区域。

  • 账户:您的 EKS 集群、托管抓取程序和 Amazon Managed Service for Prometheus 工作区必须全部位于同一个 AWS 账户。

  • 收集器:每个区域每个账户最多可以有 10 个 Amazon Managed Service for Prometheus 抓取程序。

    注意

    您可以通过请求增加配额,请求提高此限额。

  • 指标响应:来自任何一个 /metrics 端点请求的响应正文不能超过 50 兆字节(MB)。

  • 每个抓取程序的端点:一个抓取程序最多可以抓取 3 万个 /metrics 端点。

  • 抓取间隔:抓取程序配置无法将抓取间隔指定为小于 30 秒。