ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 오토스케일링(kubernetes autoscaling)
    Kubernetes 2018. 9. 12. 09:00
    클라우드를 사용하면서 유용한 기능으로 언급하는 것중에 가장 많이이야기하는게 오토스케일링이 아닐까 싶습니다. 컨테이너 오케스트레이션 쪽에서는 컨테이너만 잘 준비되어 있으면 오토스케일링이 더욱 쉬워지게 되었습니다. 쿠버네티스에서도 HPA(Horizontal Pod Autoscaler)라는 기본 오토스케일링 기능이 내장되어 있습니다. HPA는 CPU 사용률 기반으로 디플로이먼트로 실행된 포드의 개수를 개수를 늘리거나 줄이는 역할을 해줍니다. 

    HPA 설정하기
    오토스케일링 설정을 해보도록 하겠습니다. 다음 파일을 autoscaling.yaml로 저장한 다음에 kubectl apply -f autosclinging.yaml로 적용시키면 됩니다.
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: kubernetes-simple-app-hpa
      namespace: default
    spec:
      maxReplicas: 10
      minReplicas: 1
      scaleTargetRef:
        apiVersion: extensions/v1beta1
        kind: Deployment
        name: kubernetes-simple-app
      targetCPUUtilizationPercentage: 30

    kind에 보면 HorizontalPodAutoscaler이 있어서 이 설정이 HPA에 대한 설정인걸 확인할 수 있습니다. metadata부분에는 이 HPA의 이름을 kubernetes-simple-app-hpa로 적용했고 네임스페이스는 default인걸 알 수 있습니다. 실제 HPA 관련 옵션 설정은 spec영역에 있습니다. maxReplicas은 오토스케일링이 적용되서 포드 개수를 증가시킬때 최대 몇개까지 증가시킬 것인지에 대한 옵션입니다. 반대로 minReplicas은 포드 개수가 줄어들때 최소한 여기 지정된 개수 만큼은 포드가 실행되고 있게 지정한 값입니다. 실제 어떤 대상을 오토스케일링 할 것인지는 scaleTargetRef옵션에 있습니다. kubernetes-simple-app이라는 디플로이먼트가 대상입니다. 그리고 targetCPUUtilizationPercentage은 CPU 사용률이 30%가 됐을때 오토스케일링을 적용하라는 내용입니다. 이런 내용들을 이렇게 yaml파일이 아니라 다음처럼 kubectl로 한번에 적용할 수도 있습니다.
    kubectl autoscale deployment kubernetes-simple-app --cpu-percent=30 --min=1 --max=10

    hpa를 생성한 다음 kubectl get hpa 명령으로 hpa상태를 확인할 수 있습니다. 혹시 TARGETS 부분에 cpu 사용률이 <unknown>으로 나온다면 metrics-server가 제대로 실행중인지 kubectl top pods 명령으로 포드 cpu 사용률 모니터링이 정상적으로 되는지 확인해 줘야 합니다. kubectl top이 정상적으로 출력이 되는데도 hpa 상태에서 cpu사용률을 확인하지 못하고 있다면 디플로이먼트의 컨테이너쪽 옵션에 cpu request옵션이 제대로 걸려 있는지 확인해 주면 됩니다. cpu request옵션이 없으면 hpa가 cpu사용량에 필요한 계산을 할 수 없어서 상태가 <unknown>으로 나오기도 합니다.
    $  kubectl get hpa
    NAME                        REFERENCE                          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    kubernetes-simple-app-hpa   Deployment/kubernetes-simple-app   0%/30%    1         10        1          25s

    오토스케일링 테스트하기
    오토스케일링이 되는지 확인하려면 앱에 부하를 걸어야 하는데, 아래처럼 간단한 스크립트를 실행해서 계속해서 요청을 보내도록 하면 됩니다. 
    while true;do curl localhost:30080;done

    요청을 시작하고 cpu사용률이 갱신될때까지 조금 기다려 줘야 합니다. 아래처림 watch를 통해서 포드 개수와 hpa상태를 모니터링해보면 TARGETS의 사용률이 올라가고 포드가 2개 늘어난걸 확인할 수 있습니다. 포드가 늘어나고나면 들어오는 요청을 늘어난 포드에서 분산해서 받기 때문에 TARGETS의 사용률이 다시 낮아지는걸 확인할 수 있습니다.


    이 상태에서 부하를 발생시키던 스크립트를 중지하면 TARGETS쪽의 사용률이 줄어들고 포드개수가 MINPODS개수인 1개만 남기고 줄어드는걸 확인할 수 있습니다. 

    HPA 구조
    HPA는 컨트롤러 매니저 안에서 주기적으로 루프를 돌면서 설정된 HPA의 상태를 체크하도록 되어 있습니다. 매 루프마다 지정된 자원의 사용량을 api를 통해서 확인하고 설정된 HPA조건에 맞을때 오토스케일링을 수행하도록 되어 있습니다. 기본적인 루프도는 시간은 --horizontal-pod-autoscaler-sync-period 옵션으로 지정이 가능하고 기본값은 30초입니다. 다음 그림이 전체 구조를 보여주고 있습니다.



    오토스케일링이 어떻게 이루어지는지 대략적인 계산은 다음처럼 이뤄집니다.
    TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

    오토스케일링이 이뤄질때의 기준이 되는 자원 사용량은 현재 시점의 데이터만을 사용합니다. 그러다 보니 오토스케일링이 이뤄지고 나서 실제로 포드가 늘어나고 있긴 하지만 아직 포드가 실행되고 있는 도중에 다시 오토스케일링을 통해서 포드를 늘리라는 요청이 발생할 수도 있습니다. 그래서 일단 한번 오토스케일링이 일어나면 일정시간동안은 추가로 오토스케일링이 일어나지 않게 쿨다운 시간을 둘 수 있습니다. 포드가 늘어날때의 기본 쿨다운 시간은 3분이고 --horizontal-pod-autoscaler-downscale-delay 옵션을 통해 조정할 수 있습니다. 포드가 줄어들때의 기본 쿨다운 시간은 5분이고 --horizontal-pod-autoscaler-downscale-delay 옵션을 통해 조정할 수 있ㅅ브니다.



    참고


    댓글 0

Designed by Tistory.