适用于:开发人员 | 高级
本文介绍如何将 Azure API 管理的自承载网关组件部署到 Kubernetes 群集,并将所有指标自动发送到 OpenTelemetry 收集器。
你将学会如何:
- 在 Kubernetes 上配置和部署独立的 OpenTelemetry 收集器。
- 使用 OpenTelemetry 指标部署自承载网关。
- 通过在自承载网关上使用 API 来生成指标。
- 从 OpenTelemetry 收集器中获取指标。
先决条件
- 创建 Azure API 管理实例。
- 使用 Azure CLI、使用 Azure PowerShell 或使用 Azure 门户创建 Azure Kubernetes 群集。
- 在 API 管理实例中预配自承载网关资源。
- 安装 Helm。
OpenTelemetry 简介
OpenTelemetry 是一组开源工具和框架,用于以非供应商中立的方式记录、指标和跟踪。
可以将自承载网关配置为自动收集指标并将其发送到 OpenTelemetry 收集器。 这使您能够为自主托管网关提供您自己的指标收集和报告解决方案。
注释
OpenTelemetry 是 Cloud Native Computing Foundation (CNCF) 生态系统的孵化项目。
Metrics
自承载网关会自动开始测量以下指标:
- 请求
- 毫秒持续时间
- BackendDurationInMs (后端持续时间以毫秒为单位)
- ClientDurationInMs
- GatewayDurationInMs
每分钟都会自动导出到配置的 OpenTelemetry 收集器,并包含其他维度。
部署 OpenTelemetry 收集器
首先,使用 Helm 在 Kubernetes 上部署独立的 OpenTelemetry 收集器。
小窍门
虽然我们使用收集器 Helm 图表,但他们还提供 OpenTelemetry 收集器运维工具。
首先,添加 Helm 图表存储库。
使用以下命令添加 Helm 存储库。
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts更新存储库以提取最新的 Helm 图表。
helm repo update通过列出所有可用图表来验证 Helm 配置。
helm search repo open-telemetry以下示例显示了可用的图表。
NAME CHART VERSION APP VERSION DESCRIPTION open-telemetry/opentelemetry-collector 0.8.1 0.37.1 OpenTelemetry Collector Helm chart for Kubernetes open-telemetry/opentelemetry-operator 0.4.0 0.37.0 OpenTelemetry Operator Helm chart for Kubernetes
配置图表存储库后,可以将 OpenTelemetry 收集器部署到群集:
使用以下配置创建名为 opentelemetry-collector-config.yml 的 本地配置文件:
mode: deployment config: exporters: prometheus: endpoint: "0.0.0.0:8889" namespace: azure_apim send_timestamps: true service: pipelines: metrics: exporters: - prometheus service: type: LoadBalancer ports: jaeger-compact: enabled: false prom-exporter: enabled: true containerPort: 8889 servicePort: 8889 protocol: TCP这样,我们可以使用一个独立的收集器,并在端口
8889上公开 Prometheus 导出程序。 若要公开 Prometheus 指标,我们要求 Helm 图表配置LoadBalancer服务。注释
你正在禁用压缩的 Jaeger 端口,因为它使用 UDP,并且
LoadBalancer服务不允许同时拥有多个协议。使用您的配置来安装 Helm chart(即 Helm 图表)。
helm install opentelemetry-collector open-telemetry/opentelemetry-collector --values ./opentelemetry-collector-config.yml通过获取 Helm 图表的所有资源来验证安装。
kubectl get all -l app.kubernetes.io/instance=opentelemetry-collectorNAME READY STATUS RESTARTS AGE pod/opentelemetry-collector-58477c8c89-dstwd 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/opentelemetry-collector LoadBalancer 10.0.175.135 20.103.18.53 14250:30982/TCP,14268:32461/TCP,4317:31539/TCP,4318:31581/TCP,8889:32420/TCP,9411:30003/TCP 27m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/opentelemetry-collector 1/1 1 1 27m NAME DESIRED CURRENT READY AGE replicaset.apps/opentelemetry-collector-58477c8c89 1 1 1 27m记下服务的外部 IP,以便稍后可以对其进行查询。
安装 OpenTelemetry Collector 后,现在可以将自托管网关部署到集群。
部署自托管网关
重要
有关如何使用 Helm 部署自承载网关以及如何获取所需配置的详细概述,请参阅 使用 Helm 将自承载网关部署到 Kubernetes。
在本部分中,你将使用 Helm 将自承载网关部署到群集,并将其配置为将 OpenTelemetry 指标发送到 OpenTelemetry 收集器。
小窍门
以下步骤将自承载网关部署到 Kubernetes,并使用网关访问令牌(身份验证密钥)对 API Management 实例启用身份验证。 还可以使用 Microsoft Entra ID 将自托管网关部署到 Kubernetes,并启用对 API 管理实例的身份验证。 有关详细信息,请参阅 自承载网关身份验证选项。
安装 Helm 图表并将其配置为使用 OpenTelemetry 指标:
helm install azure-api-management-gateway \ --set gateway.configuration.uri='<your configuration url>' \ --set gateway.auth.key='<your auth token>' \ --set observability.opentelemetry.enabled=true \ --set observability.opentelemetry.collector.uri=http://opentelemetry-collector:4317 \ --set service.type=LoadBalancer \ azure-apim-gateway/azure-api-management-gateway注释
opentelemetry-collector在此命令中,是 OpenTelemetry 收集器的名称。 如果服务具有其他名称,请更新名称。通过获取 Helm 图表的所有资源来验证安装。
kubectl get all -l app.kubernetes.io/instance=apim-gatewayNAME READY STATUS RESTARTS AGE pod/apim-gateway-azure-api-management-gateway-fb77c6d49-rffwq 1/1 Running 0 63m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/apim-gateway-azure-api-management-gateway LoadBalancer 10.0.67.177 20.71.82.110 8080:32267/TCP,8081:32065/TCP 63m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/apim-gateway-azure-api-management-gateway 1/1 1 1 63m NAME DESIRED CURRENT READY AGE replicaset.apps/apim-gateway-azure-api-management-gateway-fb77c6d49 1 1 1 63m记下自托管网关服务的外部 IP,以便后续可以进行查询。
生成和使用 OpenTelemetry 指标
现在,已部署 OpenTelemetry 收集器和自承载网关,接下来可以开始使用 API 来生成指标。
注释
在本演练中使用默认Echo API。
请确保它已配置为:
- 允许 HTTP 请求
- 允许自承载网关公开它
在自托管网关中查询 Echo API。
curl -i "http://<self-hosted-gateway-ip>:8080/echo/resource?param1=sample&subscription-key=abcdef0123456789" HTTP/1.1 200 OK Date: Mon, 20 Dec 2021 12:58:09 GMT Server: Microsoft-IIS/8.5 Content-Length: 0 Cache-Control: no-cache Pragma: no-cache Expires: -1 Accept: */* Host: echoapi.chinacloudapp.cn User-Agent: curl/7.68.0 X-Forwarded-For: 10.244.1.1 traceparent: 00-3192030c89fd7a60ef4c9749d6bdef0c-f4eeeee46f770061-01 Request-Id: |3192030c89fd7a60ef4c9749d6bdef0c.f4eeeee46f770061. Request-Context: appId=cid-v1:00001111-aaaa-2222-bbbb-3333cccc4444 X-Powered-By: Azure API Management - http://api.azure.com/,ASP.NET X-AspNet-Version: 4.0.30319自承载网关测量请求并将指标发送到 OpenTelemetry 收集器。
在
http://<collector-service-ip>:8889/metrics上的收集器查询 Prometheus 终结点。 应会看到类似于以下示例的指标:# HELP azure_apim_BackendDurationInMs # TYPE azure_apim_BackendDurationInMs histogram azure_apim_BackendDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_BackendDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_ClientDurationInMs # TYPE azure_apim_ClientDurationInMs histogram azure_apim_ClientDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 22 1640093731340 [...] azure_apim_ClientDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_DurationInMs # TYPE azure_apim_DurationInMs histogram azure_apim_DurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_DurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_GatewayDurationInMs # TYPE azure_apim_GatewayDurationInMs histogram azure_apim_GatewayDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_GatewayDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_Requests # TYPE azure_apim_Requests counter azure_apim_Requests{BackendResponseCode="200",BackendResponseCodeCategory="2xx",Cache="None",GatewayId="Docs",Hostname="20.71.82.110",LastErrorReason="None",Location="GitHub",ResponseCode="200",ResponseCodeCategory="2xx",Status="Successful"} 22 1640093731340
清理资源
完成本教程后,可以使用以下命令轻松清理群集。
卸载自托管网关的 Helm 图表。
helm uninstall apim-gateway卸载 OpenTelemetry 收集器。
helm uninstall opentelemetry-collector