파드 스펙의 노드 셀렉터를 통해 특정 노드로 스케줄링되는 것을 수행할 수 있지만, 이것만으로는 특정 니즈를 처리할 수 없기 때문에 쿠버네티스에서는 이를 확장하는 매커니즘을 제공한다.
16.1 테인트와툴러레이션을 사용해 특정 노드에서 파드 실행 제한
노드 테인트(taint)와 테인트에 대한 파드 툴러레이션(toleration)은 어떤 파드가 특정 노드를 사용할 수 있는지를 제한할 수 있는 기능이다.
노드의 테인트가 허용된(tolerate) 경우에만 파드가 노드에 스케줄링 될수 있음을 뜻한다.
테인트와 노드 어피니티 규칙의 차이점 이해
노드 어피니티 규칙을 사용하면 특정 정보를 파드에 추가해 파드가 스케줄링되거나 스케줄링될 수 없는 노드를 선택할 수 있다.
반면 테인트는 기존의 파드를 수정하지 않고, 노드에 테인트를 추가하는 것만으로도 파드가 특정 노드에 배포되지 않도록 한다.
16.1.1 테인트와 툴러레이션 소개
클러스터 마스터 노드에 컨트롤 플레인 파드 배치를 어떻게 되어있는지를 살펴보자.
노드의 테인트 구성
key, value, effect로 구성되어 있음.
# <key>=<value>:<effect>
# key : node-role.kubernetes.io/master
# value : null
# effect : NoSchedule
# 파드가 이 테인트를 허용하지 않는 한 마스터 노드에 스케줄링되지 못하게 막는다는 의미를 가진다.(이 테인트를 허용하는 파드는 주로 시스템 파드에 해당된다.)
node-role.kubernetes.io/master:NoSchedule
시스템파드의 톨러레이션과 노드의 테인트가 일치하기 때문에 마스터 노드에 스케줄링된다.
톨러레이션이 없는 파드는 테인트가 없는 일반 노드에 스케줄링 된다.
파드의 톨러레이션 표시하기
파드로 실행되는 마스터 노드 컴포넌트도 쿠버네티스 서비스에 접근해야 할 수도 있기 때문에 kube-proxy가 마스터 노드에서도 실행된다. 이 정보를 확인해보면 다음과 같다.
node-role.kubernetes.io/master=:NoSchedule 톨러레이션은 마스터 노드의 테인트와 일치하므로 kube-proxy 파드가 마스터 노드에 스케줄링되도록 허용한다.
node.alpha.kubernetes.io/notReady=Exists:NoExecute와 node.alpha.kubernetes.io/unreachable=Exists:NoExecute는 준비되지 않았거나(notReady), 도달할 수 없는(unreachable)노드에서 파드를 얼마나 오래 실행할 수 있는지를 정의하는 용도의 톨러레이션이다.
테인트 효과 이해
NoSchedule
파드가 테인트를 허용하지 않는 경우 노드에 스케줄링되지 않는다.
PreferNoSchedule
NoSchedule과 동일하지만, 다른 곳에 스케줄링할 수 없는 상황이면 해당 노드에 스케줄링이 될 수도 있는 효과이다.
NoExecute
NoSchedule,PreferNoSchedule 와 달리 이미 실행중인 파드에도 영향을 주고, 해당 노드에서 이미 실행중이지만 해당 테인트를 허용하지 않은 파드는 노드에서 제거되는 효과이다.
16.1.2 노드에 사용자 정의 테인트 추가하기
# 노드에 테인트 추가
kubectl taint node node1.k8s node-type=production:NoSchedule
# 파드 생성(deployment)
kubectl run test --image busybox --replicas 5 -- sleep 9999
16. 고급 스케줄링
16.1 테인트와툴러레이션을 사용해 특정 노드에서 파드 실행 제한
테인트와 노드 어피니티 규칙의 차이점 이해
16.1.1 테인트와 툴러레이션 소개
노드의 테인트 구성
파드의 톨러레이션 표시하기
node-role.kubernetes.io/master=:NoSchedule
톨러레이션은 마스터 노드의 테인트와 일치하므로 kube-proxy 파드가 마스터 노드에 스케줄링되도록 허용한다.node.alpha.kubernetes.io/notReady=Exists:NoExecute
와node.alpha.kubernetes.io/unreachable=Exists:NoExecute
는 준비되지 않았거나(notReady), 도달할 수 없는(unreachable)노드에서 파드를 얼마나 오래 실행할 수 있는지를 정의하는 용도의 톨러레이션이다.테인트 효과 이해
NoSchedule
PreferNoSchedule
NoExecute
16.1.2 노드에 사용자 정의 테인트 추가하기
16.1.3 파드에 톨러레이션 추가
node-type=dev:NoSchedule
과 같은 테인트를 추가해야 한다.16.1.4 테인트와 톨러레이션의 활용 방안
스케줄링에 테인트와 톨러레이션 사용하기
노드 실패 후 파드를 재스케줄링하기까지의 시간 설정
16.2 노드 어피니티를 사용해 파드를 특정 노드로 유인하기
노드 어피니티와 노드 셀렉터 비교
디폴트 노드의 레이블 검사
디폴트 노드의 레이블들 중 중요한 요소
16.2.1 하드 노드 어피니티 규칙 지정
노드 셀렉터를 이용한 방식
노드 어피니티 규칙을 이용한 방식
긴 nodeAffinity 속성 이름에 관하여
nodeSelectorTerm 이해
16.2.2 파드의 스케줄링 시점에 노드 우선순위 지정
preferredDuringSchedulingIgnoredDuringExecution
필드를 통해 스케줄러가 선호할 노드를 지정하는 것도 가능하다.노드 레이블링
선호하는 노드 어피니티 규칙 지정
노드 선호도 작동 방법
노드가 두 개인 클러스터에 파드 배포하기
16.3 파드 어피니티와 안티-어피니티를 이용해 파드 함께 배치하기
16.3.1 파드 간 어피니티를 사용해 같은 노드에 파드 배포하기
대상 파드 생성
파드 정의에 파드 어피니티 지정
파드 어피니티를 갖는 파드 배포
스케줄러가 파드 어피니티 규칙을 사용하는 방법
16.3.2 동일한 랙, 가용 영역 또는 리전에 파드 배포
동일한 가용 영역에 파드 함께 배포하기
동일한 리전에 파드 함께 배포하기
topologyKey 작동 방식
다른 네임스페이스의 파드 참조방법
16.3.3 필수 요구 사항 대신 파드 어피니티 선호도 표시하기
preferredDuringSchedulingIgnoredDuringExecution
속성을 이용하여 노드 어피티니 설정한것과 동일한 처리를 할 수 있다.16.3.4 파드 안티-어피니티를 사용해 파드들이 서로 떨어지게 스케줄링하기
파드 안티-어피니티를 언제 사용하는가?
같은 디플로이먼트의 파드를 분산시키기 위해 안티-어피니티 사용
선호하는 파드 안티-어피니티 사용하기
preferredDuringSchedulingIgnoredDuringExecution
속성을 사용해서 동일하게 처리할 수 있다.