Kubernetes에서의 Autoscaling Part 2

 

번개장터 / 19. 12. 18. 오후 6:23

안녕하세요. 번개장터 백엔드 엔지니어 박상조입니다. 저번 포스팅에서 hpa에 대해 알아봤는데요. 궁금하시거나 hpa에 대해 잘 모르시는 분들은 아래 링크를 먼저 보시는 걸 추천해 드립니다.

Kubernetes 에서의 Autoscaling Part 1 - Horizontal Pod Autoscaler

그럼 이제 Cluster를 Autoscaling 하는 방법에 대해서 알아보겠습니다. 예전에는 이런 자원을 모니터링하고 늘릴 때 CPU 사용률이나 메모리 같은 지표를 보고 일정 수준을 기준으로 Scale Out 하는 방식을 주로 사용했습니다. 하지만 k8s에서는 이런 방식으로 자원을 관리하기는 어려운 점이 많습니다. 그래서 사용하는 것이 Cluster Autoscaler입니다.

Cluster Autoscaler

hpa로 pod를 계속 늘리다 보면 작업자 노드가 가득 차게 됩니다. Pod의 request 값만큼의 공간이 남아있지 않으면 Pod는 배포되지 못하고 Pending 상태가 됩니다. Cluster Autoscaler는 바로 이 상태가 되면 작업자 노드를 늘립니다.

EKS의 경우 작업자 노드는 EC2 Instance로 돼 있고 이 노드들은 Autoscaling Group(이하 ASG)으로 관리 합니다. Cluster Autoscaler는 이 ASG를 통해 작업자 노드의 수를 늘리거나 줄입니다. 따라서 Cluster에 권한이 필요합니다. 권한을 추가하고 Helm을 이용해 Cluster Autoscaler를 설치해 보도록 하겠습니다.

Cluster IAM Role 추가
  1. IAM 콘솔을 엽니다. (https://console.aws.amazon.com/iam/)
  2. Roles에서 자신의 작업자 노드 Role을 선택합니다.
  3. Add inline policy를 선택해 줍니다.
  4. JSON탭을 선택한 후 아래 내용을 복사해 넣고 Review policy를 선택합니다.
     {
       "Version": "2012-10-17",
       "Statement": [
         {
           "Effect": "Allow",
           "Action": [
             "autoscaling:DescribeAutoScalingGroups",
             "autoscaling:DescribeAutoScalingInstances",
             "autoscaling:DescribeLaunchConfigurations",
             "autoscaling:DescribeTags",
             "autoscaling:SetDesiredCapacity",
             "autoscaling:TerminateInstanceInAutoScalingGroup"
           ],
           "Resource": "*"
         }
       ]
     }
    

  5. Name에 사용할 이름을 입력하고 Create policy를 선택합니다.

이제 Cluster가 ASG를 통해 Cluster 수를 조절할 수 있게 됐습니다.

Cluster Autoscaler 설치

이제 Cluster Autosclaer를 설치할 차례입니다. 여러 가지 방법이 있지만, Helm을 이용해 설치하고 Tag를 추가해 자동으로 ASG를 찾도록 하겠습니다.

  1. Helm을 이용해 Cluster Autoscaler를 설치해줍니다.
    helm install stable/cluster-autoscaler \
     --name aws-cluster-autoscaler \
     --namespace kube-system \
     --set autoDiscovery.clusterName=NAME \
     --set awsRegion=ap-northeast-2 \
     --set sslCertPath=/etc/kubernetes/pki/ca.crt \
     --set rbac.create=true
    

    NAME에는 자신의 EKS 클러스터 이름을 입력해 줍니다.

    kubectl get po -n kube-system
    

    위 명령어를 통해 배포가 잘 됐는지 확인해 줍니다.

  2. EC2 콘솔을 엽니다. (https://console.aws.amazon.com/ec2/)
  3. Auto Scaling Groups에서 자신의 작업자 노드의 ASG를 선택합니다.
  4. 아래에서 Tags탭을 선택합니다.
  5. Add/Edit tags를 선택합니다.
  6. Add tag를 선택합니다.

    Key: k8s.io/cluster-autoscaler/enabled
    

    value: true

    아래처럼 위의 Key와 Value를 입력 후 Save를 선택합니다.

이제 Cluster Autoscaler가 ASG를 통해 클러스터 수를 조절할 수 있습니다. hpa의 minReplicas를 늘려 Pod 수를 많이 늘려보면 새로 생긴 Pod가 Pending 상태가 됩니다. 그럼 ASG에서 설정한 max 값까지 작업자 노드를 확장하는 것을 보실 수 있습니다.

지금까지 두 포스팅에 걸쳐 k8s의 Autoscaling에 대해 알아봤습니다. k8s를 사용하면서 확실히 구성이 간편해진 것 같습니다.

다음에 기회가 되면 배포와 관련해서도 포스팅하도록 하겠습니다.

읽어주셔서 감사합니다.

기업문화 엿볼 때, 더팀스

로그인

/