DevOps/Kubernetes

Scheduling101

노프Nope 2022. 8. 15. 03:10

스케줄러의 역할

  • 모든 팟(pod)이 노드에 있도록 한다
  • 컨트롤러의 일종이다

스케줄링 과정

  • 할당되지 않은 팟을 담는 Object Store라는 걸 모니터링
  • 팟을 실행할 최적의 노드를 찾는다
  • 노드에 팟을 할당한다.
    • 실행은 kubelet이 한다

어떻게?

  • 노드 셀렉터
    • 예전에 사용
    • 지금은 affinity로 발전
    • 노드는 해당 셀렉터의 모든 label을 포함해야 팟의 타겟이 된다
  • 노드 affinity
    • label에 기반하는 것은 같지만
    • 강제로 할당
      • required~ → hard
      • preferred~ → soft
    • 무엇이 할당될까?
      • node label 확인은 kubectl get nodes --show-labels | grep mynode
  • anti node affinity
    • 사용하면 안 될 노드가 있을 때 사용 (ex. 모니터링 어플리케이션)
    • NotIn 연산자
  • Taints and tolerations
    • taint == mark == 쓰면 안 되는 노드를 지정해두기
      • taint를 하면 스케줄러에서 노드가 제외된다
      • anti node affinity와 다른 점: pod definition을 건드리지 않고도 노드를 제외 (관리자 예제)
      • :
    • tolerate == 허용 조건 설정
      • taint를 무시하는 방법(이지만 그 tainted 노드에 할당된다는 보장은 x)
        • 가용 노드가 된다는 뜻
        • 보장하려면, nodeSelector, node affinity 사용
      • 노드에 적용되는 게 아니라 팟에 적용

만약에..

  • label 없으면 어느 노드에 할당?
    • 0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector
  • 같은 label이 여러 개 있으면 어느 노드에 할당?
    • 0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector

참고
An Ultimate Kubernetes Hands-on Labs and Tutorials