Compartilhar via

在 Kubernetes 中部署集成 OpenTelemetry 的自托管网关

适用于:开发人员 | 高级

本文介绍将 Azure API 管理自承载网关组件部署到 Kubernetes 群集并自动将所有指标发送到 OpenTelemetry 收集器的步骤。

你将学会如何:

  • 在 Kubernetes 上配置和部署独立的 OpenTelemetry 收集器
  • 使用 OpenTelemetry 指标部署自承载网关。
  • 通过在自承载网关上使用 API 来生成指标。
  • 从 OpenTelemetry 收集器中获取指标。

先决条件

OpenTelemetry 简介

OpenTelemetry 是一组开源工具和框架,用于以非供应商中立的方式记录、指标和跟踪。

可以将自承载网关配置为自动收集指标并将其发送到 OpenTelemetry 收集器。 这使您能够为自主托管网关提供您自己的指标收集和报告解决方案。

注释

OpenTelemetry 是 Cloud Native Computing Foundation (CNCF) 生态系统的孵化项目。

Metrics

自承载网关将自动开始测量以下指标:

  • 请求
  • 毫秒持续时间
  • BackendDurationInMs (后端持续时间以毫秒为单位)
  • ClientDurationInMs
  • GatewayDurationInMs

它们每隔 1 分钟被自动导出到配置的 OpenTelemetry 收集器,附带额外的维度。

部署 OpenTelemetry 收集器

我们将首先使用 Helm 在 Kubernetes 上部署独立的 OpenTelemetry 收集器。

小窍门

虽然我们将使用收集器 Helm 图表,但它们还提供 OpenTelemetry 收集器控制器

首先,必须添加 Helm 图表存储库:

  1. 添加 Helm 存储库

    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    
  2. 更新存储库以提取最新的 Helm 图表。

    helm repo update
    
  3. 通过列出所有可用图表来验证 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 收集器部署到群集:

  1. 创建一个名为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 Chart 配置 LoadBalancer 服务。

注释

我们禁用简化的 Jaeger 端口,因为它使用 UDP 协议,且LoadBalancer服务不允许同时使用多种协议。

  1. 使用我们的配置安装 Helm 图表:

    helm install opentelemetry-collector open-telemetry/opentelemetry-collector --values .\opentelemetry-collector-config.yml
    
  2. 通过获取我们 Helm 图表的所有资源来验证安装

    $ kubectl get all -l app.kubernetes.io/instance=opentelemetry-collector
    NAME                                           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
    
  3. 记下服务的外部 IP,以便稍后可以对其进行查询。

安装 OpenTelemetry 收集器后,现在可以将自托管网关部署到集群。

部署自托管网关

重要

有关如何使用 Helm 部署自承载网关以及如何获取所需配置的详细概述,建议阅读 本文

在本章节中,我们将使用 Helm 将自托管网关部署到群集,并配置其发送 OpenTelemetry 指标到 OpenTelemetry 数据收集器。

小窍门

以下步骤将自承载网关部署到 Kubernetes,并使用网关访问令牌(身份验证密钥)对 API Management 实例启用身份验证。 还可以使用 Microsoft Entra ID 将自托管网关部署到 Kubernetes,并启用对 API 管理实例的身份验证。 有关详细信息,请参阅 自承载网关身份验证选项

  1. 安装 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 收集器的名称。 如果服务具有其他名称,请更新名称。

  1. 通过获取我们 Helm 图表的所有资源来验证安装

    $ kubectl get all -l app.kubernetes.io/instance=apim-gateway
    NAME                                                            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
    
  2. 记下自承载网关服务的外部 IP,以便稍后可以对其进行查询。

生成和使用 OpenTelemetry 指标

现在,我们的 OpenTelemetry 收集器和自托管网关都已部署完成,可以开始使用 API 来生成指标了。

注释

本次演练将调用默认的“Echo API”。

请确保它已配置为:

  • 允许 HTTP 请求
  • 允许自承载网关公开它
  1. 在自托管网关中查询 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 收集器。

  1. 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
    

清理

完成本教程后,可以轻松清理群集,如下所示:

  1. 卸载自托管网关 Helm Chart:

    helm uninstall apim-gateway
    
  2. 卸载 OpenTelemetry 收集器:

    helm uninstall opentelemetry-collector