Share via


OpenTelemetry 통합을 통해 Kubernetes에 자체 호스팅 게이트웨이 배포

적용 대상: 개발자 | 프리미엄

이 문서에서는 Azure API Management 자체 호스팅 게이트웨이 구성 요소를 Kubernetes 클러스터에 배포하고 모든 메트릭을 OpenTelemetry Collector에 자동으로 보내는 단계를 설명합니다.

Important

Azure API Management 자체 호스팅 게이트웨이에 대한 OpenTelemetry 지원은 현재 미리 보기로 제공되며 2.0.0 이상 태그가 필요합니다.

다음 방법에 대해 설명합니다.

  • Kubernetes에 독립 실행형 OpenTelemetry Collector 배포 및 구성
  • OpenTelemetry 메트릭을 사용하여 자체 호스팅 게이트웨이 배포
  • 자체 호스팅 게이트웨이에서 API를 사용하여 메트릭 생성
  • OpenTelemetry Collector의 메트릭 사용

필수 조건

OpenTelemetry 소개

OpenTelemetry는 공급업체 중립적인 방식으로 로깅, 메트릭, 추적하는 오픈 소스 도구 및 프레임워크 세트입니다.

Important

Azure API Management 자체 호스팅 게이트웨이에 대한 OpenTelemetry 지원은 현재 미리 보기로 제공되며 2.0.0 이상 태그가 필요합니다.

자체 호스팅 게이트웨이는 자동으로 메트릭을 수집하여 OpenTelemetry Collector로 보내도록 구성할 수 있습니다. 이렇게 하면 자체 호스팅 게이트웨이에 대한 사용자 고유한 메트릭 수집 및 보고 솔루션을 얻을 수 있습니다.

참고 항목

OpenTelemetry는 CNCF(Cloud Native Computing Foundation) 에코시스템의 인큐베이팅 프로젝트입니다.

메트릭

자체 호스팅 게이트웨이는 자동으로 다음 메트릭 측정을 시작합니다.

  • 요청
  • DurationInMs
  • BackendDurationInMs
  • ClientDurationInMs
  • GatewayDurationInMs

이러한 메트릭은 1분마다 구성된 OpenTelemetry Collector로 추가 차원과 함께 자동으로 전송됩니다.

OpenTelemetry Collector 배포

먼저 Helm을 사용하여 Kubernetes에 독립 실행형 OpenTelemetry Collector를 배포합니다.

Collector Helm 차트를 사용할 것이지만, OpenTelemetry Collector 연산자도 제공됩니다.

먼저 다음과 같이 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 Collector를 클러스터에 배포할 수 있습니다.

  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
    

이렇게 하면 Prometheus 내보내기가 8889 포트에 노출되는 독립 실행형 수집기를 사용할 수 있습니다. Prometheus 메트릭을 노출하기 위해 Helm 차트에 LoadBalancer 서비스를 구성하도록 요청하고 있습니다.

참고 항목

소형 Jaeger 포트는 UDP를 사용하며 LoadBalancer 서비스는 동시에 여러 프로토콜을 사용할 수 없다는 점을 감안하여 소형 Jaeger 포트를 사용하지 않도록 설정하겠습니다.

  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 Collector가 설치되었으므로 이제 자체 호스팅 게이트웨이를 클러스터에 배포할 수 있습니다.

자체 호스팅 게이트웨이 배포

Important

Helm을 사용하여 자체 호스팅 게이트웨이를 배포하는 방법과 필요한 구성을 가져오는 방법에 대한 자세한 개요를 알아보려면 이 문서를 읽는 것이 좋습니다.

이 섹션에서는 Helm을 사용하여 자체 호스팅 게이트웨이를 클러스터에 배포하고 OpenTelemetry 메트릭을 OpenTelemetry Collector로 보내도록 구성합니다.

  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 Collector의 이름입니다. 서비스의 이름이 다른 경우 이름을 업데이트합니다.

  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 Collector와 자체 호스팅 게이트웨이가 모두 배포되었으므로 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.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
    

이제 자체 호스팅 게이트웨이가 요청을 측정하고 메트릭을 OpenTelemetry Collector로 보낼 것입니다.

  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 차트를 제거합니다.

    helm uninstall apim-gateway
    
  2. 다음과 같이 OpenTelemetry Collector를 제거합니다.

    helm uninstall opentelemetry-collector
    

다음 단계