3.2. 오토스케일링 (APM HPA)
개요
APM 의 애플리케이션 지표(TPS)를 기준으로 파드를 자동 확장·축소합니다. CPU/메모리만으로는 잡기 어려운 실제 트래픽에 맞춰 스케일할 수 있습니다.
1. 동작 방식
APM HPA 는 Kubernetes 의 External Metrics API(external.metrics.k8s.io/v1beta1)를 구현합니다. HPA 가 외부 지표를 요청하면, APM HPA 가 OPENMARU APM 서버에 해당 그룹의 지표를 질의해 값을 돌려줍니다.
- 지원 지표:
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
apmAlias가envHpa의 어떤name과도 맞지 않으면 기본 서버로 질의하므로, 의도한 서버를 쓰려면 이름을 정확히 맞추십시오.
5. 핵심 설정 요약
| HPA 필드 | 값 | 의미 |
|---|---|---|
metrics[].type | External | 외부 지표 기반 스케일 |
metric.name | tps | 사용할 지표(현재 tps) |
selector.matchLabels.apmAlias | 예: APM-SERVER | 질의할 APM 서버 별칭(envHpa name) |
selector.matchLabels.groupName | 예: TOMCAT | APM 애플리케이션 그룹 |
target.type / target.value | AverageValue / 50 | 파드당 목표 TPS |
6. 잘 안 될 때
| 증상 | 점검 |
|---|---|
TARGETS 가 <unknown> | groupName 이 APM 의 실제 그룹명과 일치하는지, apmAlias 서버 주소가 도달 가능한지 |
| 항상 0 으로만 나옴 | 해당 그룹에 실제 트래픽이 있는지, APM 서버가 그룹 TPS 를 집계 중인지 |
| 다른 APM 서버로 질의됨 | apmAlias 가 envHpa 의 name 과 정확히 일치하는지(대소문자 포함) |
| 스케일이 안 일어남 | minReplicas/maxReplicas 범위, target.value 가 너무 큰지 확인 |