Bereitstellen eines selbstgehosteten Gateways in Kubernetes mit OpenTelemetry-Integration

GILT FÜR: Entwickler | Premium

In diesem Artikel erfahren Sie Schritt für Schritt, wie Sie die selbstgehostete Gatewaykomponente von Azure API Management in einem Kubernetes-Cluster bereitstellen und automatisch alle Metriken an einen OpenTelemetry-Collector senden.

Wichtig

Die OpenTelemetry-Unterstützung für das selbstgehostete Gateway von Azure API Management befindet sich derzeit in der Vorschauphase und erfordert mindestens das Tag 2.0.0.

Folgendes wird vermittelt:

  • Konfigurieren und Bereitstellen eines eigenständigen OpenTelemetry-Collectors in Kubernetes
  • Bereitstellen des selbstgehosteten Gateways mit OpenTelemetry-Metriken
  • Generieren von Metriken durch die Nutzung von APIs auf dem selbstgehosteten Gateway
  • Verwenden der Metriken aus dem OpenTelemetry-Collector

Voraussetzungen

Einführung in OpenTelemetry

Bei OpenTelemetry handelt es sich um eine Reihe von Open-Source-Tools und -Frameworks für anbieterneutrale Protokollierung, Metriken und Ablaufverfolgung.

Wichtig

Die OpenTelemetry-Unterstützung für das selbstgehostete Gateway von Azure API Management befindet sich derzeit in der Vorschauphase und erfordert mindestens das Tag 2.0.0.

Das selbstgehostete Gateway kann so konfiguriert werden, dass Metriken automatisch gesammelt und an einen OpenTelemetry-Collector gesendet werden. Dadurch können Sie für das selbstgehostete Gateway Ihre eigene Lösung für die Metriksammlung und Berichterstellung verwenden.

Hinweis

OpenTelemetry ist ein in der Entwicklung befindliches Projekt des CNCF-Ökosystems (Cloud Native Computing Foundation).

Metriken

Das selbstgehostete Gateway beginnt automatisch mit der Messung folgender Metriken:

  • Requests
  • DurationInMs
  • BackendDurationInMs
  • ClientDurationInMs
  • GatewayDurationInMs

Sie werden automatisch im Minutentakt und mit zusätzlichen Dimensionen in den konfigurierten OpenTelemetry-Collector exportiert.

Bereitstellen des OpenTelemetry-Collectors

Zu Beginn wird mithilfe von Helm ein eigenständiger OpenTelemetry-Collector in Kubernetes bereitgestellt.

Tipp

Hier wird zwar das Collector-Helm-Chart verwendet, es steht aber auch ein OpenTelemetry-Collector-Operator zur Verfügung.

Als Erstes muss das Helm-Chartrepository hinzugefügt werden:

  1. Fügen Sie das Helm-Repository hinzu.

    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    
  2. Aktualisieren Sie das Repository, um die neuesten Helm-Diagramme abzurufen.

    helm repo update
    
  3. Überprüfen Sie Ihre Helm-Konfiguration, indem Sie alle verfügbaren Diagramme auflisten.

    $ 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
    

Nachdem wir das Chartrepository konfiguriert haben, können wir den OpenTelemetry-Collector in unserem Cluster bereitstellen:

  1. Erstellen Sie eine lokale Konfigurationsdatei namens opentelemetry-collector-config.yml mit folgender Konfiguration:

    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
    

Dadurch können wir einen eigenständigen Collector verwenden, und der Prometheus-Exporter wird am Port 8889 verfügbar gemacht. Um die Prometheus-Metriken verfügbar zu machen, weisen wir das Helm-Chart an, einen LoadBalancer-Dienst zu konfigurieren.

Hinweis

Wir deaktivieren den kompakten Jaeger-Port, da er UDP verwendet und der Dienst LoadBalancer die gleichzeitige Verwendung mehrerer Protokolle nicht erlaubt.

  1. Installieren Sie das Helm-Chart mit unserer Konfiguration:

    helm install opentelemetry-collector open-telemetry/opentelemetry-collector --values .\opentelemetry-collector-config.yml
    
  2. Überprüfen Sie die Installation, indem Sie alle Ressourcen für unser Helm-Chart abrufen.

    $ 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. Notieren Sie sich die externe IP-Adresse des Diensts, damit wir ihn später abfragen können.

Nach der Installation des OpenTelemetry-Collectors können wir das selbstgehostete Gateway in unserem Cluster bereitstellen.

Bereitstellen des selbstgehosteten Gateways

Wichtig

Eine ausführliche Übersicht darüber, wie Sie das selbstgehostete Gateway mit Helm bereitstellen und die erforderliche Konfiguration abrufen, finden Sie in diesem Artikel.

In diesem Abschnitt stellen wir das selbstgehostete Gateway für unseren Cluster mit Helm bereit und konfigurieren es so, dass OpenTelemetry-Metriken an den OpenTelemetry-Collector gesendet werden.

  1. Installieren Sie das Helm-Chart, und konfigurieren Sie es für die Verwendung von OpenTelemetry-Metriken:

    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
    

Hinweis

Im obigen Befehl ist opentelemetry-collector der Name des OpenTelemetry-Collectors. Aktualisieren Sie den Namen, wenn Ihr Dienst einen anderen Namen besitzt.

  1. Überprüfen Sie die Installation, indem Sie alle Ressourcen für unser Helm-Chart abrufen.

    $ 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. Notieren Sie sich die externe IP-Adresse des Diensts des selbstgehosteten Gateways, damit wir ihn später abfragen können.

Generieren und Nutzen der OpenTelemetry-Metriken

Nachdem nun sowohl der OpenTelemetry-Collector als auch das selbstgehostete Gateway bereitgestellt sind, können wir mit der Nutzung der APIs beginnen, um Metriken zu generieren.

Hinweis

In dieser exemplarischen Vorgehensweise wird die standardmäßige Echo-API genutzt.

Vergewissern Sie sich, dass sie für Folgendes konfiguriert ist:

  • Zulassen von HTTP-Anforderungen
  • Zulassen, dass sie von Ihrem selbstgehosteten Gateway verfügbar gemacht wird
  1. Fragen Sie die Echo-API im selbstgehosteten Gateway ab:

    $ 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.cloudapp.net
    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:c24f5e00-aa25-47f2-bbb5-035847e7f52a
    X-Powered-By: Azure API Management - http://api.azure.com/,ASP.NET
    X-AspNet-Version: 4.0.30319
    

Das selbstgehostete Gateway misst daraufhin die Anforderung und sendet die Metriken an den OpenTelemetry-Collector.

  1. Fragen Sie den Prometheus-Endpunkt für den Collector unter http://<collector-service-ip>:8889/metrics ab. Die Metriken sollten in etwa wie folgt aussehen:

    # 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
    

Bereinigen

Nachdem das Tutorial nun abgeschlossen ist, können Sie Ihren Cluster wie folgt bereinigt:

  1. Deinstallieren Sie das Helm-Chart für das selbstgehostete Gateway:

    helm uninstall apim-gateway
    
  2. Deinstallieren Sie den OpenTelemetry-Collector:

    helm uninstall opentelemetry-collector
    

Nächste Schritte