고기 대신 SW 한점/Public Cloud

[AWS] Cluster Autoscaler (CA)

지식한점 2023. 1. 4. 16:14
반응형

> 개요

 

 

GitHub - kubernetes/autoscaler: Autoscaling components for Kubernetes

Autoscaling components for Kubernetes. Contribute to kubernetes/autoscaler development by creating an account on GitHub.

github.com

 

> 동작 방식

 

  • Cluster 사이즈 변화 기준
    • Pod을 추가로 예약할 때 (HPA 등), 현재 Node에 필요한 리소스가 부족하여 Pending Pod의 수가 늘어나면 Scale-out
    • 리소스를 거의 사용하지 않는 불필요한 Node가 지정된 시간 이상 유지되는 경우 Scale-in
  • HPA & CA 연계
    • How does scale-up work?
      1. HPA는 CPU 부하를 기준으로 replica 수가 변경할 때, 부하가 증가하면 새로운 Pod을 예약하고자 시도
      2. 클러스터에 사용가능한 여유자원이 없는 경우, HPA의 Pod 예약을 대기(pending)한 상태 유지
      3. 이 때, CA는 클러스터에 추가 노드를 확보하고, node가 사용가능한 상태가 되면 대기 pod를 해당 노드에 배치
    • How does scale-down work?
      1. CPU 부하가 줄어들면, HPA는 Replica의 숫자를 줄이므로, pod의 숫자를 줄이도록 시도
      2. 클러스터에는 사용되지 않는 불필요한 자원이 확인되며, 지정된 시간 이후 CA는 해당 노드를 제거
  • CA & AWS Auto Scaling 연계
    • Kubernetes Cluster Autoscaler는 EC2 Auto Scaling Groups과 호환
    • 기본적으로 10초 간격으로 Pending 상태의 Pod에 대하여 Scan을 수행
    • 그러나 Node 가 시작되기까지 Pod은 예약될 수 없으므로 EC2 AutoScaling 혹은 EKS Managed Node Group API에 불요한 API Call이 발생할 수 있으므로, Node 생성 시간에 맞춘 CA Scan Interval 설정을 권장

 

 

> Best Practices

EKS Best Practice : Spot Instances

  • Node group에 Spot Instances를 적용하여 비용을 절감할 수 있음
  • Spot Instance는 On-demand Instance 대비 가격이 매우 저렴(70~90% 절감)하지만 Instance가 언제든 종료될 수 있음
    • Spot Instance는 종료되기 2분 전에 이벤트를 생성
    • aws-node-termination-handler를 구성하여 해당 노드 draining 작업을 자동으로 수행하도록 구성 가능

적용 권장 사항

  • On-demand와 Spot Instance Node group을 별도로 생성하고 별도의 Auto Scaling Group에 할당
  • Cluster Autoscaler Expander를 --expander=priority,least-waste로 설정
  • On-demand Node group -> Spot Instance Node group 순으로 Priority 설정
 
1
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-autoscaler-priority-expander
  namespace: kube-system
data:
  priorities: |-
    10:
  - .*on-demand*
20:
  - .*spot*

 

EKS Best Practice : Overprovisioning

  • Cluster Autoscaler에서 Scale up을 수행할 때 Node가 준비되어 Pod이 정상적으로 기동되는데 수 분의 지연 시간이 발생
  • Overprovisioning을 적용하면 워크로드를 즉시 배포 가능한 여분의 Node를 미리 준비하여 HPA에 의해 새로 생성된 Pod이 빠르게 기동될 수 있음
    • 작동 원리 : 낮은 우선순위를 가지는 dummy Pod를 다수 생성하여 Scale up Trigger를 미리 적용시킴
    • 항상 여분의 Node를 준비하므로 추가 비용이 발생(Cost-Performance trade-off)
  • Overprovisioning 적용

EKS Best Practice : Prevent Scale Down Eviction

  • 빅데이터 분석, ML Tasks, Test runner와 같이 중간에 interrupt되면 처음부터 다시 작업을 수행해야 하는 워크로드는 Cluster Autoscaler에 의해 Scale Down되지 않도록 구성해야 함
  • 적용 대상 pod에 cluster-autoscaler.kubernetes.io/safe-to-evict=false label을 부여하면 Cluster Autoscaler가 해당 Pod을 제거하지 않음

 

> 기타 : CA Parameter

 
설정 설명 기본값
scan-interval 스케일 업 또는 다운을 위해 클러스터를 다시 평가하는 빈도 10초
scale-down-delay-after-add 스케일 업 후 스케일 다운 평가가 다시 시작되기 전까지 경과 시간 10분
scale-down-delay-after-delete 노드 삭제 후 스케일 다운 평가가 다시 시작되기 전까지 경과 시간 scan-interval
scale-down-delay-after-failure 스케일 다운 실패 후 스케일 다운 평가가 다시 시작되기 전까지 경과 시간 3분
scale-down-unneeded-time 불필요한 노드를 스케일 다운하기 전까지 경과 시간 10분
scale-down-unready-time 준비되지 않은 노드를 스케일 다운하기 전까지 경과 시간 20분
scale-down-utilization-threshold 요청된 리소스의 합계를 용량으로 나눈 노드 사용률 수준으로, 이 수준 미만의 노드는 스케일 다운 대상으로 고려할 수 있음 0.5
max-graceful-termination-sec 노드를 스케일 다운하려고 할 때 클러스터 자동 크기 조정기가 Pod 종료를 위해 대기하는 최대 시간(초) 600초
balance-similar-node-groups 비슷한 노드 풀을 검색하고 두 노드 풀의 노드 수 균형 맞추기 false
확장기 스케일 업에 사용할 노드 풀 확장기의 유형입니다. 가능한 값: most-pods, random, least-waste, priority random
skip-nodes-with-local-storage true인 경우 클러스터 자동 크기 조정기가 로컬 스토리지가 있는 Pod를 사용하여 노드를 절대로 삭제하지 않음(예: EmptyDir 또는 HostPath) true
skip-nodes-with-system-pods true인 경우 클러스터 자동 크기 조정기가 kube-system에서 Pod를 사용하여 노드를 절대로 삭제하지 않음 (DaemonSet 또는 미러 Pod 제외) true
max-empty-bulk-delete 동시에 삭제할 수 있는 빈 노드의 최대 수 10개 노드
new-pod-scale-up-delay Kubernetes 스케줄러가 모든 Pod를 예약하기 전에 CA가 작동하지 않도록 하려는 버스트/일괄 처리 규모와 같은 시나리오의 경우, 어느 정도 시간이 지나기 전에 예약되지 않은 Pod를 CA가 무시하도록 지시할 수 있습니다. 0초
max-total-unready-percentage 클러스터에서 준비되지 않은 노드의 최대 비율입니다. 이 비율을 초과하면 CA가 작업을 중단합니다. 45%
max-node-provision-time 노드가 프로비저닝될 때까지 자동 크기 조정기가 대기하는 최대 시간입니다. 15분
ok-total-unready-count max-total-unready-percentage에 관계없이 준비되지 않은 노드가 허용되는 수 3개 노드

 

References

 

반응형