OpenTelemetry 통합을 통해 Kubernetes에 자체 호스팅 게이트웨이 배포
적용 대상: 개발자 | 프리미엄
이 문서에서는 Azure API Management 자체 호스팅 게이트웨이 구성 요소를 Kubernetes 클러스터에 배포하고 모든 메트릭을 OpenTelemetry Collector에 자동으로 보내는 단계를 설명합니다.
다음 방법에 대해 설명합니다.
- Kubernetes에 독립 실행형 OpenTelemetry Collector 배포 및 구성
- OpenTelemetry 메트릭을 사용하여 자체 호스팅 게이트웨이 배포
- 자체 호스팅 게이트웨이에서 API를 사용하여 메트릭 생성
- OpenTelemetry Collector의 메트릭 사용
필수 조건
- Azure API Management 인스턴스 만들기
- Azure CLI를 사용하거나 Azure PowerShell을 사용하거나 Azure Portal을 사용하여 Azure Kubernetes 클러스터를 만듭니다.
- API Management 인스턴스에 자체 호스팅 게이트웨이 리소스를 프로비전합니다.
OpenTelemetry 소개
OpenTelemetry는 공급업체 중립적인 방식으로 로깅, 메트릭, 추적하는 오픈 소스 도구 및 프레임워크 세트입니다.
자체 호스팅 게이트웨이는 자동으로 메트릭을 수집하여 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 차트 리포지토리를 추가해야 합니다.
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 Collector를 클러스터에 배포할 수 있습니다.
다음 구성을 사용하여 로컬 구성 파일
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 포트를 사용하지 않도록 설정하겠습니다.
다음 구성을 사용하여 Helm 차트를 설치합니다.
helm install opentelemetry-collector open-telemetry/opentelemetry-collector --values .\opentelemetry-collector-config.yml
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
나중에 쿼리할 수 있도록 서비스의 외부 IP를 기록해 둡니다.
OpenTelemetry Collector가 설치되었으므로 이제 자체 호스팅 게이트웨이를 클러스터에 배포할 수 있습니다.
자체 호스팅 게이트웨이 배포
Important
Helm을 사용하여 자체 호스팅 게이트웨이를 배포하는 방법과 필요한 구성을 가져오는 방법에 대한 자세한 개요를 알아보려면 이 문서를 읽는 것이 좋습니다.
이 섹션에서는 Helm을 사용하여 자체 호스팅 게이트웨이를 클러스터에 배포하고 OpenTelemetry 메트릭을 OpenTelemetry Collector로 보내도록 구성합니다.
다음과 같이 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의 이름입니다. 서비스의 이름이 다른 경우 이름을 업데이트합니다.
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
나중에 쿼리할 수 있도록 자체 호스팅 게이트웨이 서비스의 외부 IP를 기록해 둡니다.
OpenTelemetry 메트릭 생성 및 사용
OpenTelemetry Collector와 자체 호스팅 게이트웨이가 모두 배포되었으므로 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.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:00001111-aaaa-2222-bbbb-3333cccc4444 X-Powered-By: Azure API Management - http://api.azure.com/,ASP.NET X-AspNet-Version: 4.0.30319
이제 자체 호스팅 게이트웨이가 요청을 측정하고 메트릭을 OpenTelemetry Collector로 보낼 것입니다.
수집기에서
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 Collector를 제거합니다.
helm uninstall opentelemetry-collector
다음 단계
- 자체 호스팅 게이트웨이에 대한 자세한 내용은 자체 호스팅 게이트웨이 개요를 참조하세요.
- Azure API Management 게이트웨이의 관찰 기능에 대해 자세히 알아봅니다.