Part 3: 고급 기능

EKS에서의 커스텀 스케줄러 구현 사례

이 섹션에서는 EKS에서 커스텀 스케줄러를 구현하는 실제 사례를 살펴보겠습니다.

사례 1: GPU 워크로드 최적화 스케줄러

AI/ML 워크로드를 실행하는 EKS 클러스터에서는 GPU 리소스를 효율적으로 활용하는 것이 중요합니다. 다음은 GPU 워크로드를 최적화하는 커스텀 스케줄러의 구현 사례입니다.

GPU 워크로드 최적화 스케줄러 아키텍처

다음 다이어그램은 GPU 워크로드 최적화 스케줄러의 아키텍처를 보여줍니다:

GPU 워크로드 스케줄링 워크플로우

다음 다이어그램은 GPU 워크로드 스케줄링 워크플로우를 보여줍니다:

요구 사항

  1. GPU 메모리 요구 사항에 따라 노드 선택

  2. GPU 모델(예: NVIDIA A100, V100, T4 등)에 따른 노드 선택

  3. GPU 사용률을 고려한 노드 선택

  4. 다중 GPU 인스턴스에서 GPU 공유 최적화

구현 접근 방식

이 사례에서는 스케줄러 프레임워크 플러그인 접근 방식을 사용합니다.

  1. 노드 레이블링: 각 노드에 GPU 관련 정보를 레이블로 추가합니다.

  1. 커스텀 스케줄러 플러그인 구현:

  1. 스케줄러 구성:

  1. 포드 스펙에서 GPU 요구 사항 지정:

사례 2: 네트워크 지역성 최적화 스케줄러

EKS 클러스터에서 네트워크 비용을 최적화하기 위해 네트워크 지역성을 고려하는 커스텀 스케줄러를 구현할 수 있습니다.

네트워크 지역성 최적화 스케줄러 아키텍처

다음 다이어그램은 네트워크 지역성 최적화 스케줄러의 아키텍처를 보여줍니다.

네트워크 지역성 최적화 워크플로우

다음 다이어그램은 네트워크 지역성 최적화 스케줄러의 워크플로우를 보여줍니다.

Pod Deletion Cost를 이용한 스케일 다운 최적화

Kubernetes 1.22부터 도입된 Pod Deletion Cost는 ReplicaSet, Deployment, StatefulSet과 같은 워크로드 리소스가 스케일 다운될 때 어떤 Pod을 먼저 삭제할지 제어할 수 있는 기능입니다. 이는 애플리케이션의 가용성과 성능을 최적화하는 데 유용합니다.

Pod Deletion Cost 개념

Pod Deletion Cost는 controller.kubernetes.io/pod-deletion-cost 어노테이션을 통해 각 Pod에 비용 값을 할당합니다. 스케일 다운 시 낮은 비용의 Pod이 먼저 삭제됩니다.

주요 특징:

  • 기본값: 0

  • 범위: -2147483648 ~ 2147483647 (int32 범위)

  • 더 높은 값 = 더 중요한 Pod (나중에 삭제)

  • 더 낮은 값 = 덜 중요한 Pod (먼저 삭제)

Pod Deletion Cost 아키텍처

다음 다이어그램은 Pod Deletion Cost가 스케일 다운 시 어떻게 작동하는지 보여줍니다:

spinner

사용 사례

1. 캐시가 워밍업된 Pod 보호

애플리케이션 시작 시 캐시를 로드하는 경우, 워밍업된 Pod을 우선적으로 유지하여 성능을 최적화할 수 있습니다.

2. 활성 연결이 있는 Pod 보호

WebSocket이나 장기 실행 연결이 있는 Pod을 보호합니다:

3. 데이터 지역성이 있는 Pod 보호

특정 노드에 있는 데이터를 캐시하거나 사용하는 Pod을 보호합니다:

4. 새로 시작된 Pod 우선 삭제

새로 시작된 Pod은 아직 충분히 워밍업되지 않았을 수 있으므로 먼저 삭제합니다:

Horizontal Pod Autoscaler와의 통합

HPA와 함께 사용할 때 Pod Deletion Cost를 활용하여 스케일 다운 시 중요한 Pod을 보호할 수 있습니다:

동적 Pod Deletion Cost 업데이트 패턴

실시간으로 Pod의 중요도가 변경되는 경우 동적으로 deletion cost를 업데이트할 수 있습니다:

모니터링 및 디버깅

Pod Deletion Cost가 올바르게 작동하는지 확인하는 방법:

Prometheus 메트릭 수집

Grafana 대시보드

모범 사례

  1. 일관된 비용 범위 사용: 팀 내에서 일관된 비용 범위를 정의하여 사용합니다.

    • -100 ~ -1: 우선 삭제 (새로운 Pod, 워밍업 중인 Pod)

    • 0: 기본값 (일반 Pod)

    • 1 ~ 100: 보통 중요도 (활성 연결이 있는 Pod)

    • 100 ~ 1000: 높은 중요도 (캐시가 워밍업된 Pod, 많은 연결이 있는 Pod)

  2. 동적 업데이트: Pod의 상태가 변경될 때 deletion cost를 동적으로 업데이트합니다.

  3. 상한선 설정: deletion cost에 상한선을 설정하여 너무 큰 값으로 인한 문제를 방지합니다.

  4. 모니터링: deletion cost의 분포를 모니터링하여 예상대로 작동하는지 확인합니다.

  5. 테스트: 프로덕션에 적용하기 전에 스테이징 환경에서 스케일 다운 동작을 테스트합니다.

  6. 문서화: 각 비용 범위가 의미하는 바를 문서화합니다.

제한사항

  • Pod Disruption Budget과의 상호작용: PDB와 함께 사용할 때는 PDB가 우선됩니다.

  • Kubernetes 버전: 1.22 이상에서만 사용 가능합니다.

  • 워크로드 유형 제한: ReplicaSet 컨트롤러를 사용하는 워크로드(Deployment, ReplicaSet)에서만 작동합니다.

  • Node 장애 시: Node가 완전히 장애가 발생한 경우에는 deletion cost가 고려되지 않습니다.

커스텀 스케줄러 모니터링 및 디버깅

커스텀 스케줄러를 구현한 후에는 모니터링 및 디버깅이 중요합니다. 이 섹션에서는 커스텀 스케줄러를 모니터링하고 디버깅하는 방법을 알아보겠습니다.

모니터링 아키텍처

다음 다이어그램은 EKS에서 커스텀 스케줄러를 모니터링하기 위한 아키텍처를 보여줍니다.

주요 모니터링 메트릭

다음 다이어그램은 커스텀 스케줄러의 주요 모니터링 메트릭과 그 관계를 보여줍니다:

로깅

커스텀 스케줄러의 로그를 확인하여 스케줄링 결정을 이해할 수 있습니다:

이벤트 확인

포드 스케줄링과 관련된 이벤트를 확인할 수 있습니다:

메트릭 수집

Prometheus를 사용하여 커스텀 스케줄러의 메트릭을 수집할 수 있습니다:

대시보드 구성

Grafana를 사용하여 커스텀 스케줄러의 메트릭을 시각화할 수 있습니다:

결론

커스텀 스케줄러는 특정 요구 사항에 맞게 Kubernetes 스케줄링 동작을 조정할 수 있는 강력한 방법입니다. EKS에서는 다중 스케줄러 접근 방식, 스케줄러 확장 접근 방식, 스케줄러 프레임워크 플러그인 접근 방식 등 다양한 방법으로 커스텀 스케줄러를 구현할 수 있습니다.

GPU 워크로드 최적화, 네트워크 지역성 최적화 등 다양한 사례에서 커스텀 스케줄러를 활용할 수 있습니다. 커스텀 스케줄러를 구현할 때는 모니터링 및 디버깅을 위한 도구를 함께 구성하는 것이 중요합니다.

퀴즈

이 장에서 배운 내용을 테스트하려면 주제 퀴즈를 풀어보세요.

마지막 업데이트