Pod Auto Scaling

Pod Auto Scaling

Auto Scale-Out 실습 (hpa: HorizontalPodAutoscaler 설정)

클라우드의 리소스를 잘 활용하기 위해서는 요청이 적을때는 최소한의 Pod 를 유지한 후에 요청이 많아질 경우 Pod를 확장하여 요청을 처리할 수 있다.
Pod 를 Kubernetes에서 수평적으로 확장하는 방법을 HorizontalPodAutoscaler(HPA) 라고 부른다. replicas 를 관리하는 Deployment, StatefulSet 에 적용이 가능하고, 확장이 불가능한 DaemonSets 에는 설정이 불가능하다.

HPA는 워크로드의 CPU 또는 메모리를 측정하여 작동하기 때문에 Kubernetes 에 metric server 를 필수적으로 설치가 되어있어야 한다.

이번시간에는 HPA 설정을 적용 한 후에, siege 라는 부하 테스트 툴을 사용하여 서비스에 부하를 주어 Pod 가 Auto Scale-Out 되는 실습을 한다.

선행과정

  • 이전 랩에서 배포한 order 서비스가 클러스터에 실행되고 있어야 한다. - kubectl get svc 하였을 때 order 서비스 존재확인. - kubectl get pod 하였을 때 order의 STATUS 가 Running 상태확인.

    order 서비스가 없는 경우:

kubectl create deploy order --image=jinyoung/monolith-order:v20210504
kubectl expose deploy order --port=8080

Manual Scale Out 적용해보기

kubectl scale deploy order --replicas=3
# 주문서비스가 3개로 확장된다.
kubectl scale deploy order --replicas=1
  • 부하 테스트 Pod 설치

    • 워크로드 생성기를 설치하여 자동 확장 랩에 활용한다. - 아래 스크립트를 terminal 에 복사하여 siege 라는 Pod 를 생성한다.

      		```

      kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: siege spec: containers:

      • name: siege image: apexacme/siege-nginx EOF

        		```
        		- 생성된 siege Pod 안쪽에서 정상작동 확인
        		```
        		kubectl exec -it siege -- /bin/bash
        		siege -c1 -t2S -v http://order:8080/orders
        		exit
        		```
  • Metric server 설치 확인 방법 - kubectl top pods 를 실행했을때, 아래와 같이 정보가 나오면 설치가 되어있다.

    	```
    	NAME                     CPU(cores)   MEMORY(bytes)   
    	order-684647ccf9-ltlqg   3m           288Mi           
    	siege                    0m           8Mi   
    	```
    	- "error: Metrics API not available" 메시지가 나오면 metric server가 설치되지 않은은 것으로 아래와 같은 명령어로 설치한다.
    	> kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    	> kubectl get deployment metrics-server -n kube-system

1. Auto Scale-Out 설정

1.0 Auto Scaler를 설정한다

  • 오토 스케일링 설정명령어 호출
kubectl autoscale deployment order --cpu-percent=50 --min=1 --max=3
  • "cpu-percent=50 : Pod 들의 요청 대비 평균 CPU 사용율(YAML Spec.에서 요청량이 200 milli-cores일때, 모든 Pod의 평균 CPU 사용율이 100 milli-cores(50%)를 넘게되면 HPA 발생)"
  • kubectl get hpa 명령어로 설정값을 확인 한다.
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
order   Deployment/order   <unknown>/20%   1         3         0          7s

1.1 배포파일에 CPU 요청에 대한 값을 지정한다.

  • Gitpod의 order > kubernetes 폴더로 이동하여 deployment.yaml 파일을 수정한다.
  • 19 Line 의 image 을 jinyoung/monolith-order:v20210602 로 변경한다.
  • 21과 22 Line의 ports 와 readinessProbe 사이에 resources.requests.cpu: "200m"을 추가한다.
  • indent 에 주의하여 파일을 저장한다.
		ports:
          - containerPort: 8080
        resources:
          requests:
            cpu: "200m"
        readinessProbe:

1.2 터미널을 열어서 변경된 yaml 파일을 사용하여 쿠버네티스에 배포한다.

  • cd order/kubernetes
  • kubectl delete -f deployment.yaml
  • kubectl apply -f deployment.yaml

1.3 배포 완료 후 kubectl get deploy order -o yaml 명령을 쳐서 image 와 resources의 값이 정상적으로 설정되어있는지 확인

  • kubectl get po 실행하여 STATUS가 정상적으로 Running 상태 확인

2. Auto Scale-Out 증명

2.1 새로운 터미널을 열어서 seige 명령으로 부하를 주어서 Pod 가 늘어나도록 한다.

kubectl exec -it siege -- /bin/bash
siege -c20 -t40S -v http://order:8080/orders
exit

2.2 터미널 1개는 kubectl get po -w 명령을 사용하여 pod 가 생성되는 것을 확인한다.

order-7b76557b8f-bgptv   1/1     Running   0          34m
siege                    1/1     Running   0          33m
order-7b76557b8f-7g9d6   0/1     Pending   0          0s
order-7b76557b8f-hmssb   0/1     Pending   0          0s
order-7b76557b8f-7g9d6   0/1     ContainerCreating   0          0s
order-7b76557b8f-hmssb   0/1     ContainerCreating   0          0s
order-7b76557b8f-7g9d6   0/1     Running             0          6s
order-7b76557b8f-hmssb   0/1     Running             0          6s
order-7b76557b8f-7g9d6   1/1     Running             0          23s
order-7b76557b8f-hmssb   1/1     Running             0          27s

2.3 kubectl get hpa 명령어로 CPU 값이 늘어난 것을 확인 한다.

NAME    REFERENCE          TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
order   Deployment/order   1152%/20%   1         3         3          37m