본문으로 건너뛰기

3.2. 오토스케일링 (APM HPA)

개요

APM 의 애플리케이션 지표(TPS)를 기준으로 파드를 자동 확장·축소합니다. CPU/메모리만으로는 잡기 어려운 실제 트래픽에 맞춰 스케일할 수 있습니다.

1. 동작 방식

APM HPA 는 Kubernetes 의 External Metrics API(external.metrics.k8s.io/v1beta1)를 구현합니다. HPA 가 외부 지표를 요청하면, APM HPA 가 OPENMARU APM 서버에 해당 그룹의 지표를 질의해 값을 돌려줍니다.

APM HPA 동작 방식
  • 지원 지표: tps (애플리케이션 그룹의 초당 처리 건수). 현재 제공되는 외부 지표입니다.
  • groupName: OPENMARU APM 의 애플리케이션 그룹 이름.
  • apmAlias: 어느 APM 서버에 물어볼지 고르는 별칭(설치 시 envHpa 에 등록한 name).

2. 사용법 — HPA 만들기

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: tomcat-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: tomcat
minReplicas: 1
maxReplicas: 3
metrics:
- type: External
external:
metric:
name: tps # 지표 이름 (현재 tps 지원)
selector:
matchLabels:
apmAlias: APM-SERVER # 어느 APM 서버 (envHpa 의 name 과 일치)
groupName: TOMCAT # APM 애플리케이션 그룹 이름
target:
type: AverageValue
value: 50 # 파드당 평균 TPS 50 을 목표로 스케일

적용은 다음과 같습니다.

kubectl apply -f tomcat-hpa.yaml
kubectl get hpa tomcat-hpa

NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
tomcat-hpa Deployment/tomcat 0/50 1 3 1 8s
  • TARGETS 의 왼쪽 값(현재 TPS)이 정상적으로 표시되면 연동 성공입니다.

3. 동작 확인 (부하 테스트)

# 부하 생성
ab -n 18000 -c 10 http://tomcat-openmaru-test1.apps.example.local/

# TPS 가 목표를 넘으면 파드가 늘어남
kubectl get hpa tomcat-hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
tomcat-hpa Deployment/tomcat 506/50 1 3 3 24m

직접 외부 지표 API 를 확인할 수도 있습니다.

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/<namespace>/tps" | jq .

4. 여러 APM 서버 사용

APM 서버가 여러 대면, 설치 시 envHpa 에 서로 다른 name(=apmAlias)으로 등록합니다.

envHpa:
- name: APM-INTERNAL
value: "http://openmaru-apm-server.openmaru-apm.svc.cluster.local:8080"
- name: APM-SERVER
value: "http://192.168.80.190"
- name: APM-SERVER_ACCESS_KEY # 해당 APM 서버 API 액세스 키 (<apmAlias>_ACCESS_KEY)
value: "<APM API access key>"

그리고 HPA 의 matchLabels.apmAlias 로 골라 씁니다.

matchLabels:
apmAlias: APM-INTERNAL # 내부 APM 서버로 질의
groupName: TOMCAT

apmAliasenvHpa 의 어떤 name 과도 맞지 않으면 기본 서버로 질의하므로, 의도한 서버를 쓰려면 이름을 정확히 맞추십시오.

5. 핵심 설정 요약

HPA 필드의미
metrics[].typeExternal외부 지표 기반 스케일
metric.nametps사용할 지표(현재 tps)
selector.matchLabels.apmAlias예: APM-SERVER질의할 APM 서버 별칭(envHpa name)
selector.matchLabels.groupName예: TOMCATAPM 애플리케이션 그룹
target.type / target.valueAverageValue / 50파드당 목표 TPS

6. 잘 안 될 때

증상점검
TARGETS<unknown>groupName 이 APM 의 실제 그룹명과 일치하는지, apmAlias 서버 주소가 도달 가능한지
항상 0 으로만 나옴해당 그룹에 실제 트래픽이 있는지, APM 서버가 그룹 TPS 를 집계 중인지
다른 APM 서버로 질의됨apmAliasenvHpaname 과 정확히 일치하는지(대소문자 포함)
스케일이 안 일어남minReplicas/maxReplicas 범위, target.value 가 너무 큰지 확인