티스토리 뷰

728x90
반응형

 포스팅은 Kubernetes Horizontal Pod Autoscaler 사용 가이드입니다.


Kubernetes & Docker Install 과정을 살펴보며, 추후 CICD 구축에 활용될 수 있도록 하는데 목적이 있습니다.


HPA는 지정된 CPU 사용률을 기반으로 Replication Controller, Deployment 또는 Replica Set의 Pod 수를 자동으로 조정합니다.

Kubernetes는 CPU 자원에 대한 사용량을 다음과 같은 식으로 계산하여 Pod를 자동 Scale-out 할 수 있습니다.


TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)


주기적으로 Pod의 자원 사용을 체크하고, 특정 시간의 여유를 두고 downscale/upscale이 이루어지는데, 이는 kube-controller-manager가 담당합니다. 아래와 같은 설정은 HPA 개별적으로 적용할 수 있는 부분은 아니고 kube-controller-manager에 적용이 된다면 클러스터 환경에 전체적으로 적용이 됩니다.

kube-controller-manager는 Kubernetes 내 daemon 중 하나이고, default로 설정된 사항은 다음과 같습니다.


– horizontal-pod-autoscaler-downscale-delay : 마지막 다운스케일 후 n시간 경과 후 다음 다운스케일 가능 (디폴트 5분)

– horizontal-pod-autoscaler-upscale-delay : 마지막 업스케일 후 m시간 경과 후 다음 업스케일 가능 (디폴트 3분)

– horizontal-pod-autoscaler-sync-period : 필요한 Pod 수 계산을 위한 시간 간격 설정 가능 (디폴트 30초)




지금부터는 Horizontal Pod Autoscaler 적용방법에 대해 알아보겠습니다.

1. Resources Requests 설정 및 애플리케이션 배포

부하 발생에 따른 필요한 Pod의 수를 계산하기 위해 기준이 되는 Resources Requests 사용량을 설정해야 합니다.

최대 자원 사용량도 Deployment yaml에 작성할 수 있습니다.

- gs-spring-boot-docker-deployment.yaml


apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1

kind: Deployment

metadata:

  name: gs-spring-boot-docker-deployment

  labels:

    app: gs-spring-boot-docker

spec:

  replicas: 1

  minReadySeconds: 10

  strategy:

    type: RollingUpdate

    rollingUpdate:

      maxUnavailable: 25%

  selector:

    matchLabels:

      app: gs-spring-boot-docker

  template:

    metadata:

      labels:

        app: gs-spring-boot-docker

    spec:

      containers:

      - name: gs-spring-boot-docker

        image: nara0617/gs-spring-boot-docker:1.0

        imagePullPolicy: Always

        ports:

        - containerPort: 8080

        resources:

          requests:

            memory: "256Mi"

            cpu: "200m"

          limits:

            memory: "1Gi"

            cpu: "500m"


- gs-spring-boot-docker-service.yaml


apiVersion: v1

kind: Service

metadata:

  name: gs-spring-boot-docker-service

spec:

  ports:

    - name: http

      port: 8081

      targetPort: 8080

  selector:

    app: gs-spring-boot-docker

  type: NodePort



2. yaml 파일 반영

- 작성한 yaml 파일은 CLI (kubectl apply) 또는 대시보드에서 반영이 가능합니다.


[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-deployment.yaml

deployment.apps/gs-spring-boot-docker-deployment created

[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-service.yaml

service/gs-spring-boot-docker-service unchanged

[root@k8s-master HPA]#



3. 확인

- 정상적으로 추가되었는 지 CLI 또는 대시보드에서 확인합니다.


[root@k8s-master HPA]# kubectl get deploy

NAME                               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

gs-spring-boot-docker-deployment   1         1         1            1           96s

[root@k8s-master HPA]# kubectl get service

NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

gs-spring-boot-docker-service   NodePort    10.106.48.153   <none>        8081:30490/TCP   28h

kubernetes                      ClusterIP   10.96.0.1       <none>        443/TCP          7d21h

[root@k8s-master HPA]#




다음으로 HPA를 생성해 보도록 하겠습니다.

1. yaml 파일 작성


apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

  name: gs-spring-boot-docker-hpa

spec:

  maxReplicas: 10

  minReplicas: 1

  scaleTargetRef:

    apiVersion: apps/v1beta2

    kind: Deployment

    name: gs-spring-boot-docker-deployment

  targetCPUUtilizationPercentage: 50


주요 설정을 살펴보겠습니다.

- kind : 어떤 Object를 생성할 것인지에 대한 내용입니다. HorizontalPodAutoscaler를 지정하여 생성합니다.

- maxReplicas, minReplicas : 업스케일, 다운스케일 시 생성할 수 있는 최대, 최소값을 설정합니다.

- targetCPUUtilizationPercentage : 업스케일을 진행할 CPU 임계치를 설정합니다.


2. HPA 생성

- 먼저 kubectl autoscale 명령어를 사용한 생성방법입니다.


[root@k8s-master HPA]# kubectl autoscale deployment gs-spring-boot-docker-deployment --cpu-percent=50 --min=1 --max=10

horizontalpodautoscaler.autoscaling/gs-spring-boot-docker-deployment autoscaled

[root@k8s-master HPA]#


위와 같이 지정한 deployment의 CPU 임계치, 업스케일, 다운스케일을 위한 설정을 입력하여 HPA를 생성합니다.


생성을 확인하는 방법은 다음과 같습니다.

먼저 CLI입니다.


[root@k8s-master HPA]# kubectl get hpa

NAME                               REFERENCE                                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE

gs-spring-boot-docker-deployment   Deployment/gs-spring-boot-docker-deployment   <unknown>/50%   1         10        1          2m30s

[root@k8s-master HPA]#


다음으로 Dashboard에서 확인하는 방법입니다.




- 다음으로 yaml파일을 사용한 생성방법입니다.


[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-hpa.yaml

horizontalpodautoscaler.autoscaling/gs-spring-boot-docker-hpa created

[root@k8s-master HPA]#


위와 같이 손쉽게 추가할 수 있습니다.



차이를 두기 위해 YAML 파일의 targetCPUUtilizationPercentage로 생성하였습니다.

위와 같이 정상추가 된것을 볼 수 있습니다.

이를 기반으로 정리해보면

CPU를 70%이상 사용할 경우 자동 AutoScale을 일으켜 최대 10개까지 업스케일 할 수 있고 다운스케일할 수 있다는 의미입니다.



자 그럼 HPA의 동작방식에 대해 테스트를 수행해 보도록 하겠습니다.

현재 Pod는 하나로 고정되어 있고



http://172.21.70.22:30490 호출 시 Hello Docker World를 출력하는 애플리케이션이 Deploy되어 있습니다.




테스트 과정은 다음과 같습니다.

- 먼저 해당 URL로 반복 요청을 진행합니다.

- CPU 임계치를 50%로 셋팅 후 사용량에 따른 POD의 AutoScale UP, DOWN의 추이를 지켜봅니다.


호출에 앞서 모니터링은 kubectl get hpa -w로 수행합니다.


[root@k8s-master HPA]# kubectl get hpa -w

NAME                        REFERENCE                                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   <unknown>/70%   1         10        1          11m


초기 상태입니다.



[root@k8s-master ~]# while true; do wget -q -O- http://172.21.70.22:30490; done

Hello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker World....


위와 같이 wget을 사용하여 요청을 늘려줍니다.


[root@k8s-master HPA]# kubectl get hpa -w

NAME                        REFERENCE                                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   28% / 50%   1         10        1         25m

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   41% / 50%   1         10        1         1d

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   96% / 50%   1         10        1         1d

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   74% / 50%   1         10        3         1d

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   52% / 50%   1         10        3         2d

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   21% / 50%   1         10        3         2d

gs-spring-boot-docker-hpa   Deployment/gs-spring-boot-docker-deployment   31% / 50%   1         10        3         3d


결과적으로 AutoScale이 발생하여 위와 같이 총 7개의 Pod가 기동 된것을 확인할 수 있습니다.

오토스케일 인/아웃은 클라우드에서 매우 중요한 개념입니다.

사실상 클라우드의 이유라고도 볼 수 있을 정도로.

그럼 학습하시구요. 다음시간에는 Ingress에 대해 살펴보도록 하겠습니다.

728x90
반응형