반응형
> 개요
- CA는 Kubernetes 클러스터 Node의 리소스 사용률에 따라 Worker Node의 Scale out/in을 수행
- AWS에서는 Auto Scaling Group을 이용하여 Node의 수를 조정
- Kubernetes v1.8 부터 Kubernetes Autoscaler 프로젝트 중 하나로 Cluster Autoscaler v1.0(GA)이 포함
- 각 Cloud Provider에 맞는 가이드 제공
- Cluster Autoscaler on AWS : IAM Policy & OIDC Ferderation, Auto-Discovery Setup이 포함
- Cluster Autoscaler on AWS using Helm chart
> 동작 방식
- Cluster 사이즈 변화 기준
- Pod을 추가로 예약할 때 (HPA 등), 현재 Node에 필요한 리소스가 부족하여 Pending Pod의 수가 늘어나면 Scale-out
- 리소스를 거의 사용하지 않는 불필요한 Node가 지정된 시간 이상 유지되는 경우 Scale-in
- HPA & CA 연계
- How does scale-up work?
- HPA는 CPU 부하를 기준으로 replica 수가 변경할 때, 부하가 증가하면 새로운 Pod을 예약하고자 시도
- 클러스터에 사용가능한 여유자원이 없는 경우, HPA의 Pod 예약을 대기(pending)한 상태 유지
- 이 때, CA는 클러스터에 추가 노드를 확보하고, node가 사용가능한 상태가 되면 대기 pod를 해당 노드에 배치
- How does scale-down work?
- CPU 부하가 줄어들면, HPA는 Replica의 숫자를 줄이므로, pod의 숫자를 줄이도록 시도
- 클러스터에는 사용되지 않는 불필요한 자원이 확인되며, 지정된 시간 이후 CA는 해당 노드를 제거
- How does scale-up work?
- 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 설정
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
- Introduction - EKS Best Practices Guides
- https://aws.amazon.com/ko/ec2/spot/?cards.sort-by=item.additionalFields.startDateTime&cards.sort-order=asc
- https://aws.amazon.com/ko/about-aws/whats-new/2019/11/aws-supports-automated-draining-for-spot-instance-nodes-on-kubernetes/
- autoscaler/readme.md at master · kubernetes/autoscaler
반응형
'고기 대신 SW 한점 > Public Cloud' 카테고리의 다른 글
[AWS] LandingZone - OU 설계안 (0) | 2023.01.06 |
---|---|
[AWS] HPA - Horizontal Pod Autoscaler (0) | 2023.01.05 |
[AWS] WAF Managed Rule Set 적용 예 (0) | 2023.01.04 |
[AWS] DynamoDB에 대해서.. (0) | 2023.01.03 |
[AWS] Amazon EKS Version - 2 (0) | 2022.12.22 |