OpenTelemetry 통합을 통해 Kubernetes에 자체 호스팅 게이트웨이 배포
적용 대상: 개발자 | 프리미엄
이 문서에서는 Azure API Management 자체 호스팅 게이트웨이 구성 요소를 Kubernetes 클러스터에 배포하고 모든 메트릭을 OpenTelemetry Collector에 자동으로 보내는 단계를 설명합니다.
Important
Azure API Management 자체 호스팅 게이트웨이에 대한 OpenTelemetry 지원은 현재 미리 보기로 제공되며 2.0.0
이상 태그가 필요합니다.
다음 방법에 대해 설명합니다.
- Kubernetes에 독립 실행형 OpenTelemetry Collector 배포 및 구성
- OpenTelemetry 메트릭을 사용하여 자체 호스팅 게이트웨이 배포
- 자체 호스팅 게이트웨이에서 API를 사용하여 메트릭 생성
- OpenTelemetry Collector의 메트릭 사용
필수 조건
- Azure API Management 인스턴스 만들기
- Azure CLI를 사용하거나 Azure PowerShell을 사용하거나 Azure Portal을 사용하여 Azure Kubernetes 클러스터를 만듭니다.
- API Management 인스턴스에 자체 호스팅 게이트웨이 리소스를 프로비전합니다.
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 차트 리포지토리를 추가해야 합니다.
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: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로 보낼 것입니다.
수집기에서
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 게이트웨이의 관찰 기능에 대해 자세히 알아봅니다.