使用 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 兼容的指标有哪些?

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

创建抓取程序

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 地址。

  • 授权-如果不需要授权,则省略。如果需要,则授权必须是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 秒。