오토 스케일링 HPA
포드 스케일링의 두 가지 방법
- HPA: 포드 자체를 복제하여 처리할 수 있는 포드의 개수를 늘리는 방법
- VPA: 리소스를 증가시켜 포드의 사용 가능한 리소스를 늘리는 방법
- CA: 번외로 클러스터 자체를 늘리는 방법(노드 추가)
HPA(Horizontal Pod Autoscaler)
- 쿠버네티스에는 기본 오토스케일링 기능 내장
- CPU 사용률을 모니터링하여 실행된 포드의 개수를 늘리거나 줄임
VPA와 CA는 어떻게!?
공식 쿠버네티스에서 제공하지는 않으나 클라우드 서비스에서 제공
클러스터 자동 확장 처리(CA)
수직형 pod 자동 확장(VPA)
HPA(Horizontal Pod Autoscaler) 설정 방법
명령어를 사용하여 오토 스케일 저장하기
$ kubectl autoscale deployment my-app --max 6 --min 4 --cpu-percent 50
HPA yaml을 작성하여 타겟 포드 지정
autoscaling.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
namespace: default
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: myapp
targetCPUUtilizationPercentage: 30
php-apache 서버 구동 및 노출
GKE 에서는 kube-system 에 모니터링 할 수 있는 metrics-server 서비스등이 이미 떠있음 아직 진도가 거기까지 나가지 않았으므로
GKE 에서 실습 진행
$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
event-exporter-gke-77cccd97c6-hpcd6 2/2 Running 0 13d
fluentd-gke-2z487 2/2 Running 0 13d
fluentd-gke-qsqtr 2/2 Running 0 13d
fluentd-gke-rw29v 2/2 Running 0 13d
fluentd-gke-scaler-54796dcbf7-82xg4 1/1 Running 0 13d
gke-metrics-agent-2lx9b 1/1 Running 0 13d
gke-metrics-agent-nj5h2 1/1 Running 0 13d
gke-metrics-agent-xjftg 1/1 Running 0 13d
kube-dns-7bb4975665-2wfx9 4/4 Running 0 13d
kube-dns-7bb4975665-4trkb 4/4 Running 0 13d
kube-dns-autoscaler-645f7d66cf-262h5 1/1 Running 0 13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-hbbq 1/1 Running 0 13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-hmlx 1/1 Running 0 13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-m8cn 1/1 Running 0 13d
l7-default-backend-678889f899-hqkpg 1/1 Running 0 13d
metrics-server-v0.3.6-64655c969-b29rr 2/2 Running 0 13d
prometheus-to-sd-7kwz6 1/1 Running 0 13d
prometheus-to-sd-bhqrs 1/1 Running 0 13d
prometheus-to-sd-gfzzb 1/1 Running 0 13d
stackdriver-metadata-agent-cluster-level-5667846b58-qvglq 2/2 Running 0 13d
- https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
- 이미지는 이미 구축돼 있으므로 바로 kubectl 명령어를 실행
dockerfile
FROM php:5-apache
ADD 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!";
?>
php-apache.yaml
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 로 실행
php-apache 서비스를 만들면 pod에 대한 ip가 변경되어도 pod를 자동으로 찾아서 이어주는 역할을 하면서 dns 서비스의 역할도 함
php-apache 로 요청을 하면 서비스에 접근이 됨
$ kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
Horizontal Pod Autoscaler 생성
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
hpa 확인
hipster 나 metrics 서비스가 없다면 리소스에 대한 정보를 획득하지 못해서 TARGETS 가 unknown 임
장시간 대기해도 변경사항이 없다면 metrics 서비스가 없는 것임
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache <unknown>/50% 1 10 0 19s
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 59s
오토스케일링을 적용한 서비스에 무한 루프 쿼리를 통해 공격 수행
$ 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"
If you don't see a command prompt, try pressing enter
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!...
1분 후 확인(중간에 unknown이 발생할 수도 있음, 수집까지 시간이 걸림)
트래픽을 분산해 부하를 낮추기 위헤 REPLICAS를 증가 시킴
증가 시키고 부하가 제어가 가능한지 모니터링 하다가 필요에 따라서 REPLICAS를 더 증가 시킴
안정화가 되면 MAXPODS 에 도달하지 않고 현재의 REPLICAS 갯수를 유지함
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 59s
php-apache Deployment/php-apache 37%/50% 1 10 1 8m48s
php-apache Deployment/php-apache 250%/50% 1 10 4 9m34s
php-apache Deployment/php-apache 250%/50% 1 10 5 9m39s
php-apache Deployment/php-apache 76%/50% 1 10 5 10m
php-apache Deployment/php-apache 61%/50% 1 10 5 10m
php-apache Deployment/php-apache 53%/50% 1 10 7 11m
php-apache Deployment/php-apache 46%/50% 1 10 7 11m
php-apache Deployment/php-apache 57%/50% 1 10 7 11m
php-apache Deployment/php-apache 53%/50% 1 10 7 12m
php-apache Deployment/php-apache 54%/50% 1 10 7 13m
php-apache Deployment/php-apache 47%/50% 1 10 7 13m
php-apache Deployment/php-apache 46%/50% 1 10 7 14m
부하를 중지 시키면 CPU 부하가 떨어졌다고 바로 REPLICAS를 축소시키지는 않고 갯수를 유지함
네트워크 상의 병목현상등 트래픽이 안오는 것일 수 있고 유저가 잠시 줄어든 것일 수도 있기때문에
pod 생성과 파괴가 더 부하가 발생할 수 있으므로 일정시간 기간을 두면서 REPLICAS 의 갯수를 줄여감
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 22%/50% 1 10 7 14m
php-apache Deployment/php-apache 0%/50% 1 10 7 14m
php-apache Deployment/php-apache 0%/50% 1 10 7 19m
php-apache Deployment/php-apache 0%/50% 1 10 3 19m
php-apache Deployment/php-apache 0%/50% 1 10 3 19m
php-apache Deployment/php-apache 0%/50% 1 10 1 19m
연습문제
- 이미지 nginx를 생성하고 HPA가 적용하라
- 최대 스케일링 개 수: 10
- 최소 스케일링 개 수: 2
- 스케일링을 수행할 CPU 활동량: 30%
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - 애플리케이션 로그 관리 (0) | 2021.01.19 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - 쿠버네티스 모니터링 시스템과 아키텍처 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 멀티플 스케줄러 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 수동 스케줄링 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 스태틱 포드 (0) | 2021.01.19 |
댓글