HPA — Pod 개수
Horizontal Pod Autoscaler. 기본 내장. 커리큘럼이 말하는 건 사실상 이것.
부하에 따라 개수를 바꾼다
지금까지 Deployment의 replicas는 사람이 정한 고정값이었다. 부하는 시간에 따라
변하는데 선언은 안 변하니, 피크에 맞추면 평시에 낭비고 평시에 맞추면 피크에 죽는다.
오토스케일러는 지표를 보고 선언(spec) 자체를 고쳐 쓰는 컨트롤러다 —
시작하기 전에의 “선언된 상태 ↔ 실제 상태를 좁히는 루프” 위에,
선언 쪽을 갱신하는 루프가 하나 더 얹힌다.
HPA — Pod 개수
Horizontal Pod Autoscaler. 기본 내장. 커리큘럼이 말하는 건 사실상 이것.
VPA — Pod 크기
Vertical Pod Autoscaler. requests/limits를 조정. 별도 설치 — CRD(CustomResourceDefinition — 새 리소스 종류를 추가하는 확장, CRD)로 깔린다.
Cluster Autoscaler — 노드 개수
Pending Pod이 있으면 노드를 늘린다. 클라우드 제공자별 설치.
셋은 계층이 다르다. 차례로 물려 있다.
| 이름 | 무엇을 늘리나 | 어디에 있나 |
|---|---|---|
| HPA (Horizontal Pod Autoscaler) | Pod 개수 | 기본 내장 |
| VPA (Vertical Pod Autoscaler) | Pod의 requests/limits | 별도 설치 |
| Cluster Autoscaler | 노드 개수 | 클라우드 제공자별 설치 |
“현재 지표”를 판단하려면 사용량 데이터가 필요한데, 코어 Kubernetes에는 사용량을 재는 컴포넌트가 없다 — etcd에 있는 것은 spec과 status지, CPU 사용률이 아니다. 그 구멍을 메우는 애드온이 metrics-server다.
HPA는 메트릭이 없으면 아무것도 하지 않는다.
kubectl top nodeskubectl top podskubectl top pods --containerskubectl top pod web --sort-by=memoryerror: Metrics API not available이 에러가 나오면 metrics-server가 없거나 죽어 있는 것이다.
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlkubectl get deploy metrics-server -n kube-systemkubectl get apiservice v1beta1.metrics.k8s.iometrics.k8s.io) — APIService는 kube-apiserver에
외부 API 그룹을 이어 붙이는 확장점이라, kubectl top도 HPA도 별도 통로 없이
평범한 API 호출로 동작한다. 그래서 진단도 kubectl get apiservice로 한다kubectl autoscale deploy web --min=2 --max=10 --cpu=70%kubectl get hpakubectl describe hpa web--cpu=70%는 requests 대비 평균 사용률 70%를 뜻한다. 옛 자료의 --cpu-percent=70은 v1.35에서도 동작하지만
deprecated로 표시되어 있다(kubectl autoscale --help로 확인).
명령 한 줄이면 대부분 끝나지만, autoscaling/v2 YAML을 직접 써야 하는 문제라면 공식
HorizontalPodAutoscaler Walkthrough에서
매니페스트를 복사해 오는 게 정석이다.
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: webspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70목표 개수 = ceil( 현재 개수 × (현재 지표 / 목표 지표) )
예: 현재 3개, CPU 평균 사용률 90%, 목표 70% → 3 × (90 / 70) = 3.86 → 올림 → 4개
--horizontal-pod-autoscaler-sync-period)kubectl get hpa# NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE# web Deployment/web cpu: 45%/70% 2 10 3 5m| TARGETS 표시 | 뜻 |
|---|---|
45%/70% | 정상 동작 중 |
<unknown>/70% | 메트릭을 못 읽는다 — metrics-server 또는 requests 누락 |
<none> | 대상 워크로드를 못 찾는다 |
kubectl describe hpa web # Conditions 와 Events 를 본다# Conditions:# AbleToScale True ReadyForNewScale# ScalingActive True ValidMetricFound# ScalingLimited False DesiredWithinRangeCPU 하나로는 안 잡히는 부하가 있다 — 메모리가 먼저 차는 워크로드, 큐 길이나 요청 수가 먼저 튀는 워크로드. 그래서 메트릭을 여러 개 걸 수 있다.
metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: AverageValue # 절대값으로도 가능 averageValue: 500Mi - type: Pods # 커스텀 메트릭 (adapter 필요) pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: "1000"type: Pods 같은 커스텀 메트릭은 adapter가 있어야 돌아간다 — 깊게 팔 필요는 없다.
시험 대비로는 Resource(CPU·메모리) 메트릭이면 충분하다계산식대로만 움직이면 지표가 출렁일 때마다 replicas도 출렁인다 — 확장은 즉시가 좋지만, 축소가 성급하면 트래픽이 다시 튈 때 그대로 맞는다. behavior는 이 방향별 속도를 정한다.
spec: behavior: scaleUp: stabilizationWindowSeconds: 0 # 즉시 늘린다 policies: - type: Percent value: 100 # 한 번에 최대 2배 periodSeconds: 15 - type: Pods value: 4 # 또는 한 번에 최대 4개 periodSeconds: 15 selectPolicy: Max scaleDown: stabilizationWindowSeconds: 300 # 5분간 관찰 후 축소 (기본값) policies: - type: Percent value: 10 periodSeconds: 60selectPolicy: Disabled 로 두면 그 방향으로는 아예 안 움직인다kubectl autoscale에는 behavior를 넣는 옵션이 없다. 뼈대를 --dry-run=client -o yaml로 뽑아
spec.behavior를 직접 더한다 — 실전 과제에서 연습한다시험 비중 낮음 둘 다 기본 내장이 아니라 별도 설치물이라 시험 클러스터에 없다. 설치·설정을 묻는 문제로 나오기는 어렵고, “이 상황에 무엇이 필요한가”를 가르는 데 쓴다 — Pod이 부족하면 HPA, Pod 하나가 작으면 VPA, 노드가 부족하면 CA.
updateMode): Off — 계산만 하고 추천값을 status에 적어둔다(사람이 보고 반영),
Initial — Pod이 새로 생길 때만 값을 넣는다, Auto — 실행 중인 Pod에도 적용한다HPA는 scale 서브리소스가 있는 리소스면 무엇이든 대상이 된다
— Deployment, ReplicaSet, StatefulSet. DaemonSet은 안 된다(개수를 노드가 정하므로).
scale 서브리소스는 “개수만 읽고 쓰는 전용 창구”다 (/apis/apps/v1/.../web/scale).
HPA는 대상이 Deployment인지 StatefulSet인지 몰라도 이 창구로 replicas만 바꾸면 된다 —
그래서 커스텀 리소스(CRD)도 scale만 열어두면 HPA로 스케일된다.
kubectl top도 HPA도 죽는다. 이것부터 확인ceil(현재 × 현재지표/목표지표), 0.9~1.1은 무시(tolerance)averageUtilization은 requests 기준. requests가 없으면 <unknown>kubectl scale은 무의미하다