본문 바로가기
[DevOps]/Kubernetes

쿠버네티스의 스케줄러 간단 정리

by 팡펑퐁 2023. 11. 10.
728x90

📌 쿠버네티스의 스케줄러

  • 간단히 말하면 Pod를 노드에 할당하는 기능이다.
  • 컨테이너는 클러스터 내의 노드에 적절히 분배하여 실행해야 되어야 하는데 이런 작업을 수행하는 주요 컴포넌트 중 하나가 바로 "스케줄러(Scheduler)"이다.
  • 쿠버네티스 스케줄러는 기본적으로 Pod를 클러스터 내의 적절한 노드에 자동으로 할당한다.
    • 이를 "자동 스케줄링(Auto Scheduling)"이라고도 한다.
    • 스케줄러는 클러스터의 리소스 상태와 각 Pod의 요구사항을 고려하여 최적의 할당을 결정한다.
  • Pod 등의 YAML 파일에는 NodeName이란 필드를 명시할 수 있는데 이를 통해 개발자가 해당 파드를 띄울 노드를 직접 선택할 수 있다.
    • 일반적으로는 Pod의 스케줄링을 위해 YAML 파일에 nodeName을 명시적으로 지정하지 않아도 된다.
    • 위에 언급했듯이 쿠버네티스의 스케줄러가 Pod의 요구사항과 클러스터의 상태를 분석하여 자동으로 적절한 노드에 할당하기 때문이다.
    • 이를 통해 개발자는 각각의 Pod에 대한 노드 할당에 대해 신경 쓰지 않고도 효율적인 자원 활용을 달성할 수 있다.

 

🤖 자동 스케줄러

  • minikube로 실행한 쿠버네티스 내 namespace 중 kube-system의 pod 목록을 살펴보면 기본적으로 작동하는 kube-schduler-minikube가 있음을 확인할 수 있다.
  • 자동 스케줄러가 있으므로 YAML 파일 작성 시 nodeName을 명시하지 않아도 자동으로 스케줄링된다.
  • minikube는 기본적으로 단일 노드만 지원하기 때문에 특정 노드를 지정해서 해당 노드에 파드를 생성하는 테스트가 불가능했다. 따라서 node를 추가하는 명령어를 통해 다중 노드 테스트 환경을 구현했다.

 

⚒️ minikube 다중 노드 환경 구축

  • minikube node list 명령어로 초기 node 리스트룰 출력해보면 minikube라는 node가 하나있다.
  • minikube node add --worker 명령어로 워커 노드 하나를 추가한다.
  • minikube-m02라는 노드가 추가되었다.

 

📖 예시

  • 위와 같이 spec의 하위 집합에 nodeName을 추가할 수 있다.
  • 일부러 존재하지 않는 node 이름으로 설정했다.

 

  • node가 없기 때문에 pending 상태가 유지되다가 자동적으로 삭제되었다.
  • describe를 통해 본 파드의 정보에서 Node 부분에 Node02라고 적혀있는 모습을 확인할 수 있다.
  • 이번에는 위에서 생성한 m02 노드로 지정해보자.

 

  • nodeName을 minikube-m02로 변경했다.

 

  • kubectl apply 명령어로 수정한 YAML 파일을 실행하니 ContainerCreating 상태에서 Running으로 변경되었으며 Node 역시 설정한 노드(m02)로 지정되었음을 확인할 수 있다.

 

📌 스케줄링을 결정하는 요인

  • 스케줄러는 다양한 요소를 고려하여 스케줄링 결정을 내린다.
  • 노드의 리소스 가용성(CPU, 메모리 등), 스토리지 제약 조건, 네트워크 연결성 등이 있다.
  • 또한, 사용자가 지정한 노드 선택 기준(annotation, taint, affinity 등)을 고려할 수도 있다.
  • 위에서 언급한 것처럼 기본적으로는 nodeName을 사용하여 개발자가 특정 노드에 Pod를 직접 할당할 수 있다.

 

 

 

참고

https://peterica.tistory.com/371?category=1144021

뤼튼

Udemy - Certified Kubernetes Administrator (CKA) with Practice Tests

728x90