- Schedular는 Pod가 배포될 적합한 Node 리스트를 생성하기 위해 먼저 Filtering을 한다
볼륨 필터 : pod를 생성되고자 하는 디스크 볼륨에 대해서 노드가 지원할 수 있는 확인하고, 마운트 되는 볼륨이 충돌되는지 확인한다. 사용자가 Node Affinity를 통해 특정 Node에만 Volume을 생성하게 했는지도 확인한다
리소스 필터 : 파드가 배포될 충분한 리소스를 가지고 잇는지 확인. 네트워크 포트도 체크한다
토폴로지 필터 : pod affinity, node selector, taint - toleration 을 확인하여 파드가 해당 노드에서 실행될 수 있는지 확인한다
- 토폴로지 : 컴퓨터 네트워크 요소들을 물리적으로 연결해 놓은 것 혹은 연결 방식
Nodename, Node Selector, Node Affinity, Pod Affinity, Taint / Toleration 이 있다
- Taint / Toleration을 통해 Node를 필터링 하여 배치될 Node를 선정할 수 있다
- Nodename, Node Selector, Affinity를 통해 배치될 Node를 선택할 수 있다
쿠버네티스의 Node를 용도에 맞게 구분할 수 있다. 이때, 용도에 맞게 Pod를 배치하기 위해 Label과 Label을 선택할 Node Selector & Affinity & Taint 기능을 사용한다
nodename은 pod 배포 시, 배포될 node의 이름을 명시하는 방법
nodename은 node selector나 affinity보다 우선적으로 적용된다 ( overrule )
단점 : 클라우드 환경에 노드 이름은 항상 안정적이거나 예측가능하지 않으므로 만약 해당 노드 이름이 없어진 경우 파드가 실행되지 않으며, 해당 노드의 리소스가 없는 경우 파드 배포가 실패한다
node 역시 쿠버네티스 오브젝트로 관리되기에 label을 할당할 수 있다
nodeselector를 통해 배치할 node의 label을 지정하여, 해당 node에 파드 배치가 가능하다
- label : 쿠버네티스 클러스터 상의 오브젝트를 식별하기 위한 key-value 쌍의 메타 정보
- selector : label을 이용해 쿠버네티스 클러스터 상의 오브젝트를 필터링하고, 원하는 오브젝트를 구하기 위한 기능
- annotation : 메타데이터로 쿠버네티스 시스템이 필요한 정보를 표시한다. 필드, 사용자 지시사항, 이미지 정보 등과 같은 메타데이터를 설정할 수 있다
pod 배치간에 선호 사항을 설정할 수 있는 리소스로, matchExpressions을 이용하여 nodeselector보다 더 다양한 조건을 제시할 수 있다
- matchExpressions는 operator 필드를 통해 논리 연산자 지정 가능 → key, value, operator 로 구성
노드를 기준으로 하는 node affinity와 파드를 기준으로 하는 pod affinity, anti affinity가 있다
옵션을 통해 하드한 규칙과 소프트한 규칙을 설정할 수 있다
- 소프트한 규칙 : 반드시 충족해야하는 hard가 아닌, 선호하는 조건을 말한다
requiredDuringSchedulingIgnoredDuringExecution : 규칙이 만족되지 않으면 파드를 스케줄링 불가. 기존에 존재하는 파드들은 이 조건을 무시 ( hard )
preferredDuringSchedulingIgnoredDuringExecution : 해당 규칙을 선호하며, 만족되지 않아도 파드를 스케줄링한다. 기존에 존재하는 파드들은 이 조건을 무시 ( soft )
- 가중치 설정 가능 → 조건에 맞는 노드를 찾으면, weight 값 계산을 통해 가중치 값이 가장 높은 노드에 스케줄링 한다
- 옵션의 앞 부분은 Scheduling 되는 Pod에 대한 옵션이고, 뒷 부분은 이미 실행중인 Pod에 대한 옵션이다
선호하는 노드를 선택하는 방법으로 Node Selector 보다 확장된 Label Selector 기능을 지원한다
Node Label을 기준으로 Pod를 Scheduling 한다
Node Selector와 함께 설정할 수 있으며, 둘 다 설정되어 있다면, 두 조건을 만족하는 Node에 Pod가 배치된다
선호하는 파드를 선택하는 방법으로 Node의 Label 대신, 각 노드에 실행중인 Pod의 Label을 기반으로 스케줄링될 노드를 제한한다
토폴로지키를 통해 label selector를 수행할 노드의 범위를 설정한다. 노드 단위, 존 단위, 리전 단위로 설정 가능
- 토폴로지키에 설정한 단위의 범위에 적용되며, 특정 규칙을 만족하는 pod가 존재하는 노드에 배치되게 한다
선호하지 않는 파드를 선택하는 방법으로, 구현은 Pod Affinity와 비슷하다
토폴로지키에 설정한 단위의 범위에 적용되며, 특정 규칙을 만족하는 Pod가 존재하는 Node에는 배치되지 않게 한다
만약, Pod Anti Affinity를 requiredDuringSchedulingIgnoredDuringExecution 모드로 설정하면, 각 Node에는 하나의 파드만 스케줄링 될 수 있다. 이를 통해, 동일한 Pod가 서로 다른 노드에서 실행되어야 할 때 사용되기도 한다