使用 AWS Distro 在亚马逊 Elastic Kubernetes Service 集群 OpenTelemetry 上设置指标提取 - Amazon Managed Service for Prometheus

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

使用 AWS Distro 在亚马逊 Elastic Kubernetes Service 集群 OpenTelemetry 上设置指标提取

您可以使用 AWS Distro for OpenTelemetry (ADOT) 收集器从装有 Prometheus 工具的应用程序中获取指标,然后将这些指标发送到适用于 Prometheus 的亚马逊托管服务。

注意

有关 ADOT 收集器的更多信息,请参阅AWS 发行版。 OpenTelemetry

有关 Prometheus 分析的应用程序的更多信息,请参阅与 Prometheus 兼容的指标有哪些?

使用 ADOT 收集 Prometheus 指标涉及三个 OpenTelemetry 组成部分:Prometheus 接收器、Prometheus 远程写入导出器和 Sigv4 身份验证扩展。

您可以使用现有的 Prometheus 配置来配置 Prometheus Receiver,以执行服务发现和指标抓取。Prometheus Receiver 以 Prometheus 展览格式抓取指标。您要抓取的任何应用程序或终端节点都应使用 Prometheus 客户端库进行配置。Prometheus Receiver 支持 Prometheus 文档配置中描述的全套 Prometheus 抓取和重新标记配置。您可以将这些配置直接粘贴到 ADOT 收集器配置中。

Prometheus Remote Write Exporter 使用 remote_write 终端节点将抓取的指标发送到您的管理门户工作区。导出数据的 HTTP 请求将使用 AWS Sigv4(安全身份验证 AWS 协议)和 Sigv4 身份验证扩展插件进行签名。有关更多信息,请参阅签名版本 4 签名流程

收集器会自动发现 Amazon EKS 上的 Prometheus 指标终端节点,并使用 <kubernetes_sd_config> 中发现的配置。

以下演示是在运行 Amazon Elastic Kubernetes Service 或自行管理 Kubernetes 的集群上进行此配置的示例。要执行这些步骤,您必须拥有来自默认 AWS 凭证链中任何潜在选项的 AWS 证书。有关更多信息,请参阅配置 AWS SDK for Go。此演示使用了一个用于流程集成测试的示例应用程序。该示例应用程序在 /metrics 端点处公开指标,就像 Prometheus 客户端库一样。

先决条件

在开始以下摄取设置步骤之前,您必须为服务账户和信任策略设置 IAM 角色。

为服务账户和信任策略设置 IAM 角色
  1. 按照设置服务角色从 Amazon EKS 集群中摄取指标中的步骤为服务账户创建 IAM 角色。

    ADOT 收集器将在抓取和导出指标时使用此角色。

  2. 接下来,编辑信任策略。使用 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  3. 在左侧导航窗格中,选择角色并找到您在步骤 1 中创建的。amp-iamproxy-ingest-role

  4. 选择信任关系选项卡,然后选择编辑信任关系

  5. 在信任关系策略 JSON 中,将 aws-amp 替换为 adot-col,然后选择更新信任策略。最终的信任策略应如下所示:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:adot-col:amp-iamproxy-ingest-service-account", "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
  6. 选择权限选项卡,并确保将以下权限策略附加到该角色。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "aps:RemoteWrite", "aps:GetSeries", "aps:GetLabels", "aps:GetMetricMetadata" ], "Resource": "*" } ] }

启用 Prometheus 指标收集

注意

在 Amazon EKS 中创建命名空间时,默认情况下,alertmanager 和 Node Exporter 处于禁用状态。

在 Amazon EKS 或 Kubernetes 集群上启用 Prometheus 收集
  1. 从存储库中分叉并克隆示例应用程序,网址为aws-otel-community

    然后,运行以下命令。

    cd ./sample-apps/prometheus-sample-app docker build . -t prometheus-sample-app:latest
  2. 将此映像推送到注册表,例如 Amazon ECR 或 DockerHub。

  3. 通过复制此 Kubernetes 配置并应用,在集群中部署示例应用程序。通过在 prometheus-sample-app.yaml 文件中替换 {{PUBLIC_SAMPLE_APP_IMAGE}},将映像更改为刚才推送的映像。

    curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-sample-app.yaml -o prometheus-sample-app.yaml kubectl apply -f prometheus-sample-app.yaml
  4. 输入以下命令以验证示例应用程序是否已启动。在命令的输出中,您将在 NAME 列中看到 prometheus-sample-app

    kubectl get all -n aoc-prometheus-pipeline-demo
  5. 启动 ADOT 收集器的默认实例。为此,请先输入以下命令来提取 ADOT 收集器的 Kubernetes 配置。

    curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-daemonset.yaml -o prometheus-daemonset.yaml

    然后编辑模板文件,用您 Amazon Managed Service for Prometheus 工作区的 remote_write 终端节点替换 YOUR_ENDPOINT,并用您的区域替换 YOUR_REGION。查看工作区详细信息时,请使用 Amazon Managed Service for Prometheus 控制台中显示的 remote_write 终端节点。

    你还需要YOUR_ACCOUNT_ID在 Kubernetes 配置的服务账户部分更改为你的 AWS 账户 ID。

    在本示例中,ADOT 收集器配置使用注释(scrape=true)来告知要抓取哪些目标终端节点。如此,ADOT 收集器便可以将示例应用程序终端节点与您集群中的 kube-system 终端节点区分开来。如果您想抓取其他示例应用程序,则可以将其从重新标记配置中删除。

  6. 输入以下命令以部署 ADOT 收集器。

    kubectl apply -f prometheus-daemonset.yaml
  7. 输入以下命令以验证 ADOT 收集器是否已启动。在 NAMESPACE 列中查找 adot-col

    kubectl get pods -n adot-col
  8. 使用日志导出器验证管道是否正常运行。我们的示例模板已经与日志导出器集成。输入以下命令。

    kubectl get pods -A kubectl logs -n adot-col name_of_your_adot_collector_pod

    从示例应用程序中抓取的一些指标如下所示:

    Resource labels: -> service.name: STRING(kubernetes-service-endpoints) -> host.name: STRING(192.168.16.238) -> port: STRING(8080) -> scheme: STRING(http) InstrumentationLibraryMetrics #0 Metric #0 Descriptor: -> Name: test_gauge0 -> Description: This is my gauge -> Unit: -> DataType: DoubleGauge DoubleDataPoints #0 StartTime: 0 Timestamp: 1606511460471000000 Value: 0.000000
  9. 要测试 Amazon Managed Service for Prometheus 是否已收到这些指标,请使用 awscurl此工具允许您通过 AWS Sigv4 身份验证通过命令行发送 HTTP 请求,因此您必须在本地设置 AWS 凭证,并具有从亚马逊托管服务查询 Prometheus 的正确权限。有关安装的说明,请参阅 awscurl。awscurl

    在以下命令中,将 AMP_REGIONAMP_ENDPOINT替换为您 Amazon Managed Service for Prometheus 工作区的信息。

    awscurl --service="aps" --region="AMP_REGION" "https://AMP_ENDPOINT/api/v1/query?query=adot_test_gauge0" {"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"adot_test_gauge0"},"value":[1606512592.493,"16.87214000011479"]}]}}

    如果您收到指标响应,则表示您的管道设置已成功,并且该指标已成功从示例应用程序传播到 Amazon Managed Service for Prometheus。

清理

要清理此演示,请输入以下命令。

kubectl delete namespace aoc-prometheus-pipeline-demo kubectl delete namespace adot-col

高级配置

Prometheus Receiver 支持 Prometheus 文档配置中描述的全套 Prometheus 抓取和重新标记配置。您可以将这些配置直接粘贴到 ADOT 收集器配置中。

Prometheus Receiver 的配置包括您的服务发现、抓取配置和重新标记配置。接收方配置如下所示。

receivers: prometheus: config: [[Your Prometheus configuration]]

下面是一个配置示例:

receivers: prometheus: config: global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: kubernetes-service-endpoints sample_limit: 10000 kubernetes_sd_configs: - role: endpoints 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

如果您已有 Prometheus 配置,则必须将 $ 字符替换为 $$,以避免将值替换为环境变量。*这对于 relabel_configurations 的替换值尤其重要。例如,如果您从以下 relabel_configuration 开始:

relabel_configs: - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path] regex: (.+);(.+);(.+) replacement: ${1}://${2}${3} target_label: __param_target

它将变成以下内容:

relabel_configs: - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path] regex: (.+);(.+);(.+) replacement: $${1}://${2}${3} target_label: __param_target

Prometheus Remote Write Exporter 和 Sigv4 Authentication Extension

Prometheus Remote Write Exporter 和 Sigv4 Authentication Extension 的配置比 Prometheus Receiver 简单。在管道的这个阶段,指标已经被摄取完毕,我们准备将这些数据导出到 Amazon Managed Service for Prometheus。对可与 Amazon Managed Service for Prometheus 进行通信的成功配置的最低要求如以下示例所示。

extensions: sigv4auth: service: "aps" region: "user-region" exporters: prometheusremotewrite: endpoint: "https://aws-managed-prometheus-endpoint/api/v1/remote_write" auth: authenticator: "sigv4auth"

此配置使用默认 AWS 凭证链中的 AWS 凭据发送由 AWS Sigv4 签名的 HTTPS 请求。有关更多信息,请参阅配置 适用于 Go 的 AWS SDK。必须将服务指定为 aps

无论采用何种部署方法,ADOT 收集器都必须有权访问默认 AWS 凭证链中列出的选项之一。Sigv4 身份验证扩展依赖于 适用于 Go 的 AWS SDK 并使用它来获取凭据和进行身份验证。您必须确保这些凭证对于 Amazon Managed Service for Prometheus 具有远程写入权限。