本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS 托管收集器
要使用 Amazon Managed Service for Prometheus 收集器,您必须创建一个抓取程序,用于发现和提取您的 Amazon EKS 集群中的指标。
-
您可以在创建 Amazon EKS 集群的过程中创建抓取程序。有关创建 Amazon EKS 集群(包括创建抓取程序)的更多信息,请参阅《Amazon EKS 用户指南》中的创建 Amazon EKS 集群。
-
您可以使用 AWS API 以编程方式创建自己的抓取工具,也可以使用. AWS CLI
注意
使用客户托管密钥创建的 Amazon Prometheus 托管服务工作空间不能使用托管收集器进行摄取。 AWS
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 一起使用的抓取程序操作的完整列表:
-
使用 CreateScraperAPI 操作创建抓取工具。
-
使用 ListScrapersAPI 操作列出您现有的抓取器。
-
使用 DeleteScraperAPI 操作删除抓取工具。
-
DescribeScraper通过 API 操作获取有关抓取器的更多详细信息。
-
GetDefaultScraperConfiguration通过 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 身份验证。集群身份验证模式必须设置为API
或API_AND_CONFIG_MAP
。这可以在 Amazon EKS 控制台的集群详细信息的 “访问配置” 选项卡上查看。有关更多信息,请参阅亚马逊 EKS 用户指南中的允许 IAM 角色或用户访问您的 Amazon EKS 集群上的 Kubernetes 对象。
你可以在创建集群时或在创建集群之后创建抓取器:
-
创建集群时 — 您可以在通过 A mazon EKS 控制台创建 Amazon EKS 集群时配置此访问权限(按照说明在集群中创建抓取工具),并且将自动创建访问进入策略,从而允许适用于 Prometheus 的亚马逊托管服务访问集群指标。
-
在@@ 创建集群后添加 — 如果您的 Amazon EKS 集群已经存在,则将身份验证模式设置为API或API_AND_CONFIG_MAP,并且您通过适用于 Prometheus 的亚马逊托管服务 API 或 CLI 创建的任何抓取器都将自动为您创建正确的访问进入策略,并且抓取器将有权访问您的集群。
访问权限策略已创建
当您创建抓取器并让适用于 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 集群以进行托管指标抓取
-
使用以下文本创建名为
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
-
在集群中运行以下命令。
kubectl apply -f clusterrole-binding.yml
这将创建集群角色绑定和规则。此示例使用
aps-collector-role
作为角色名称,使用aps-collector-user
作为用户名。 -
以下命令为您提供有关 ID 为
scraper-id
的抓取程序的信息。这是您使用上一节中的命令创建的抓取程序。aws amp describe-scraper --scraper-id
scraper-id
-
从
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
-
使用上一步中修改过的
roleArn
以及您的集群名称和区域,在集群中运行以下命令:eksctl create iamidentitymapping --cluster
cluster-name
--regionregion-id
--arnroleArn
--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
命令。您可以验证您的详细信息是否正确,例如您正在使用的协议(http
或https
)、端点或端口。您还可以检查端点是否使用有效的响应进行响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 秒。