hpa(Horizontal Pod Autoscaling) 수평적 포드 스케일링
-
kubernetes에서, workload resource(deployment, statefulset)을 자동으로 업데이트하며, workload 크기를 수요에 맞게 자동으로 scailing하는 것을 목표로 한다.
-
hpa는 부하 증가에 대해 pod를 더 배치하는것을 뜻한다. pod의 수가 최소 설정값 이상인 경우, HPA는 workload resource에게 scale down을 지시한다.
-
hpa는 크기 조절이 불가능한 오브젝트(daemonset)에는 적용할 수 없다.
hpa 작동 원리
hpa는 controller loop 형태로 구현했고 kube-controller-manager의 –horizontal-pod-autoscaler-sync-period 파라미터에 의해 설정된다.
각 주기마다, controller-manager는 hpa 정의에 지정된 메트릭에 대해 resource 사용률을 질의한다. controller-manager는 scaleTargetRef에 의해 정의된 target resource를 찾고 나서, target resource의 .spec.selector label을 보고 pod를 선택하며, resource metric API 또는 custom metric API로부터 metric을 수집한다.
hpa 연습
- kubernetes 1.23 버전 이상 준비 (kubectl version)
- metric server 배포 및 구성
1.php-apache 서버 구동 및 노출
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
index.php
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
hpa controller는 평균 cpu 사용량을 50%로 유지하기 위해 replicaset 개수를 늘리고 줄인다.
kubectl run으로 각 pod는 200 밀리코어를 요청하므로 평균 cpu 사용은 100 밀리코어이다.
2.hpa 생성
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
# 상태 확인
kubectl get hpa
3.부하 증가
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
1분 후 부하 증가 시 replicaset 증가 확인
kubectl get hpa
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 7 3m
kubectl get deployment php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 7/7 7 7 19m
https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/ https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/