pile·
인프라 / DevOps·스캐터랩스캐터랩 (이루다)·

사용자 정의 지표(RPS)로 HPA 설정하기

CPU나 메모리 대신 서비스 요청량을 기준으로 Kubernetes HPA를 동작시키기 위해 Istio, Prometheus, prometheus-adapter를 연결한 과정을 설명한다. 요청 수를 파드별 RPS로 가공해 Custom Metrics API로 노출하고, CPU와 RPS 중 더 많은 파드를 요구하는 값을 선택하도록 HPA를 구성한다.

핵심 포인트
  • HPA는 현재 파드 수와 현재·목표 지표의 비율로 원하는 파드 수를 계산하고 Deployment나 StatefulSet의 replica를 바꾼다.
  • Resource, Custom, External Metric은 서로 다른 API를 사용하므로 HPA 앞에 알맞은 Metric API Server가 필요하다.
  • I/O 병목이 많고 핵심 API가 하나인 모델 서버는 CPU보다 RPS가 실제 부하를 더 잘 나타낸다고 판단했다.
  • Istio의 누적 요청 지표를 PromQL `rate()`로 변환하고 ready 파드 수로 나눠 파드당 RPS를 만든다.
  • prometheus-adapter가 이 값을 Custom Metrics API에 노출하고 HPA가 RPS 30, CPU 80% 목표를 함께 평가한다.
상세 정리
  • 스케일러 구분: Cluster Autoscaler는 파드를 수용할 노드를, HPA는 동일한 파드 수를, VPA는 개별 파드의 request·limit을 조절한다.
  • HPA 선택: Stateless 서버는 파드 재시작 없이 수평 확장하기 쉬워 VPA보다 HPA가 적합하다. 개별 노드의 물리적 한계도 피할 수 있다.
  • 계산식: 원하는 파드 수는 `ceil(현재 파드 수 × 현재 지표 / 목표 지표)`다. 올림으로 확장 후 지표가 목표 이하가 되게 한다.
  • API 계층: Metric Source가 원시 값을 제공하고 Collector가 수집하며 Metric API Server가 Kubernetes API 형식으로 노출한다.
  • 기본 지표: kubelet의 cAdvisor가 CPU·메모리를 수집하고 metrics-server가 Resource Metrics API를 제공한다. 설치 후 `kubectl top`으로 확인한다.
  • 사용자 지표: cAdvisor가 모르는 값은 Prometheus 같은 collector와 별도 adapter가 필요하다. 이 사례는 prometheus-adapter를 썼다.
  • RPS 선택 이유: 모델 서버는 I/O, thread, network 병목이 섞여 CPU만으로 부하를 표현하기 어렵고 대부분 요청이 단일 답변 API로 모인다.
  • 원천 지표: 각 애플리케이션에 계측 라이브러리를 넣는 대신 이미 설치된 Istio의 `istio_requests_total`을 사용했다.
  • 중복 제거: Istio가 source와 destination 양쪽에서 요청을 기록하므로 `reporter="destination"` 조건으로 한쪽만 집계한다.
  • PromQL 변환: 2분 구간의 `rate()`를 합산하고 `kube_deployment_status_replicas_available`로 나눠 ready 파드당 RPS를 계산한다.
  • Recording rule: PrometheusRule에서 계산 결과를 `test_requests_per_second`라는 새 지표로 기록하고 namespace와 service label을 붙인다.
  • Adapter 설치: prometheus-operator Helm values에서 prometheus-adapter를 활성화하고 Prometheus URL과 포트를 지정한다.
  • 노출 확인: `/apis/custom.metrics.k8s.io/v1beta1`을 조회해 `services/test_requests_per_second`가 namespaced metric으로 보이는지 검증한다.
  • HPA 정의: Custom Metric은 Object 타입으로 Service를 가리키고 목표값을 30으로 둔다. CPU는 Resource 타입과 평균 사용률 80%를 사용한다.
  • 복수 지표: HPA는 각 기준이 계산한 파드 수 중 가장 큰 값을 택한다. RPS나 CPU 어느 한쪽이 병목이어도 충분히 확장된다.
왜 읽나CPU 사용률과 실제 처리량이 어긋나는 Kubernetes 서비스에서 비즈니스에 맞는 부하 지표를 안전하게 HPA에 연결하는 전체 경로를 익힐 수 있다.
스캐터랩
스캐터랩 (이루다) 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    대규모 도그푸딩: cdnjs를 Cloudflare 개발자 플랫폼으로 이전하다

    cdnjs는 하루 90억 요청을 처리하는 오픈소스 JS/CSS CDN으로, 전 세계 웹사이트의 12%가 의존한다. 2026년 6월, Cloudflare는 6년간 GCP에서 운영하던 발행 파이프라인을 Workers, Workflows, R2, KV, Queues, Containers, Durable Objects로 완전 전환했다. 성능 문제가 아닌 관측성·유지보수성 한계가 동인이었으며, 마이그레이션 과정에서 플랫폼 한도를 직접 끌어올렸다.

    #durable-objects#workflows#cloudflare-workers+2
  2. 인프라 / DevOps·github-engGitHub Engineering·

    Dependabot 길들이기: 업데이트 묶고, 주기 늦추고, 보안은 빠르게

    GitHub의 Dependabot은 의존성 업데이트를 자동화하지만, 기본 설정에서는 10개 업데이트 = 10개 PR이 쏟아져 메인테이너가 알림을 무시하게 된다. Microsoft의 GCToolkit 사례(578개 커밋 중 92개가 Dependabot 버전 범프)를 바탕으로, 그룹핑·주기 조절·보안 업데이트 분리 3가지 설정으로 노이즈를 줄이면서 보안 속도는 유지하는 방법을 다룬다.

    #github-actions#devops#supply-chain-security+2
  3. 인프라 / DevOps·cloudflare-blogCloudflare Blog·

    Cloudflare, 프라이버시 프로토콜 디버깅 CLI pvcli 오픈소스 공개

    Cloudflare가 OHTTP(Oblivious HTTP) 등 프라이버시 보존 프로토콜 디버깅을 위한 CLI 도구 pvcli를 오픈소스(Apache-2.0)로 공개했다. 기존에는 RFC를 참조하며 바이너리를 수작업으로 파싱해야 했는데, pvcli는 curl과 유사한 문법으로 이 과정을 단일 명령으로 줄인다. Apple Private Relay·Microsoft Edge Secure Network를 구동하는 실전 규모의 경험에서 나온 도구다.

    #rust#cli#ohttp+2