CA(Cluster Autoscaler)

CA는 Node의 정해진 사양에 따라 POD가 더 이상 스케줄링될 수 없어서 Pending 상태에 이르면, Autoscaler가 동작하여 Node의 개수를 증가시킨다.

CA는 AWS ASG를 사용하여 동작하게 된다.

Untitled

Workshop Studio

이제 CA 실습을 시작하겠다.

먼저 ASG의 min, max, desired 값 중에 max를 올린다.

awscli를 통해 ASG를 업데이트했다.

export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 3 --desired-capacity 3 --max-size 6

Untitled 1

그 다음 cluster autoscaler pod를 설치한다! 클러스터 이름은 sed를 통해 바꿔주자!

curl -s -O https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
sed -i "s/<YOUR CLUSTER NAME>/$CLUSTER_NAME/g" cluster-autoscaler-autodiscover.yaml
kubectl apply -f cluster-autoscaler-autodiscover.yaml

그럼 해당 클러스터의 노드가 지정됐다는 것을 태그를 통해 알 수 있다.

Untitled 2

Untitled 3

그리고 테스트 파드를 생성해서 replicas를 다섯 개로 늘려봤다.

처음에는 배치할 수 있는 노드가 없어서 POD가 Pending 상태였다.

잠시 후에 기존 노드 3개에서 max 값인 6개까지 늘어났고 POD도 Running 상태로 변경되었다!

Untitled 4

Untitled 5

노드가 스케일아웃되는 것은 확인했으니, 스케일인되는 것도 확인해 봤다.

기본적으로 CA는 아래 옵션으로 스케일인 설정을 조절할 수 있다.

scan-interval 시각은 기본 10초로, scale-down-delay-after-delete는 10초마다 노드 삭제 이후 체크하게 된다. 또한, scale-down-delay-after-add로 스케일아웃된 이후로 10분 간격으로 스케일인 여부를 확인한다. scale-down-delay-after-failure는 노드 삭제가 실패하면 3분마다 다시 체크한다.

Untitled 6

autoscaler/cluster-autoscaler/FAQ.md at master · kubernetes/autoscaler

POD를 삭제하고 10분 넘어서 확인해 보니 이미 노드는 줄어져 있었다!

Untitled 7

지금 잠깐 실습만 해 봐도 CA의 노드를 늘리는 속도는 정말 느렸다. POD가 Pending 상태를 유지하다가 한참 후에 노드를 추가해 줬다. 이렇게 느린 이유는 ASG에 의존하고 ASG를 통해서 거쳐가기 때문.. 노드 추가/삭제에는 직접 관여하지 않는다.

이런 단점을 보완하기 위해 만들어지게 된 것이 Karpenter라고 한다!

CPA(Cluster Proportional Autoscaler)

CPA는 Node의 스케일링 여부를 고려하여, 성능 처리가 필요한 POD(ex. coredns)의 Replicas를 조절할 수 있다.

실습을 시작하기 위해 규칙이 들어간 values 파일을 생성하였다.

이 규칙은 노드 개수에 따라 POD의 Replicas 개수를 정하는 것이다.

cat <<EOF > cpa-values.yaml
config:
  ladder:
    nodesToReplicas:
      - [1, 1]
      - [2, 2]
      - [3, 3]
      - [4, 3]
      - [5, 5]
options:
  namespace: default
  target: "deployment/nginx-deployment"
EOF

위에 만든 규칙을 적용하기 위해 위 values파일로 CPA 헬름을 생성한다.

helm repo add cluster-proportional-autoscaler https://kubernetes-sigs.github.io/cluster-proportional-autoscaler
helm upgrade --install cluster-proportional-autoscaler -f cpa-values.yaml cluster-proportional-autoscaler/cluster-proportional-autoscaler

해당 규칙이 잘 적용된 점을 확인하였다.

Untitled 8

노드를 5개로 증개시켰다.

export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].AutoScalingGroupName" --output text)
aws autoscaling update-auto-scaling-group --auto-scaling-group-name ${ASG_NAME} --min-size 5 --desired-capacity 5 --max-size 5
aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='eks:cluster-name') && Value=='myeks']].[AutoScalingGroupName, MinSize, MaxSize,DesiredCapacity]" --output table

규칙이 아주 잘 적용되어 테스트 파드가 더 생성되었다!

Untitled

이 Auto Scaler는 노드 개수에 비례하여 생성해야 하는 중요한 POD일 경우에 사용해도 유용할 듯하다!

Categories:

Updated:

Leave a comment