마스터 노드에는 테인트가 하나 있다. 테인트에는 key, value, effect가 있고 =: 형태로 표시된다. 현재 예시의 경우, node-role.kubernetes.io/mater 가 key, value가 null, effect는 NoScheudle을 갖는다. 노드가 이 테인트를 허용하지 않는 한 마스터 노드에 스케줄링되지 못하게 막는다.
시스템 파드는 톨러레이션과 노드의 테인트가 일치하기 때문에 마스터 노드에 스케줄링된다.
톨러레이션이 없는 일반 파드는 테인트가 없는 노드에 스케줄링된다.
kube-proxy 파드도 마스터 노드에서 실행되며, 이 파드는 마스터 노드에서 실행되게 하려고 적절한 톨러레이션을 포함하고 있다.
파드의 톨러레이션에는 표시되지만 노드의 테인트에는 표시되지 않는 등호는 무시하라. kubectl은 테인트/톨러레이션 값이 null일 때 테인트와 톨러레이션을 다르게 표시한다. (현재는 null일 때 동일하게 표시한다.)
테인트의 세 가지 가능한 효과
NoSchedule: 파드가 테인트를 허용하지 않는 경우 파드가 노드에 스케쥴링되지 않는다.
PreferNoSchedule: NoSchedule의 소프트한 버전이다. 즉, 스케쥴러가 파드를 노드에 스케쥴링하지 않으려 하지만 다른 곳에 스케쥴링할 수 없으면 해당 노드에 스케쥴링된다.
NoExecute: 스케쥴링에만 영향을 주는 NoSchedule이나 PreferNoSchedule과 달리, NoExecute는 노드에서 이미 실행 중인 파드에도 영향을 준다. NoExecute 테인트를 노드에 추가하면 해당 노드에서 이미 실행중이지만 NoExecute 테인트를 허용하지 않는 파드는 노드에서 제거된다.
테인트와 톨러레이션을 사용해 특정 노드에서 파드 실행 제한
테인트
와 테인트에 대한파드 톨러레이션
은 어떤 파드가 특정 노드를 사용할 수 있는지를 제한할 수 있는 기능이다.테인트와 노드 어피니티 규칙의 차이점 이해
테인트와 톨러레이션 소개
시스템 파드는 톨러레이션과 노드의 테인트가 일치하기 때문에 마스터 노드에 스케줄링된다.
톨러레이션이 없는 일반 파드는 테인트가 없는 노드에 스케줄링된다.
kube-proxy
파드도 마스터 노드에서 실행되며, 이 파드는 마스터 노드에서 실행되게 하려고 적절한 톨러레이션을 포함하고 있다.노드에 사용자 정의 테인트 추가하기
위 명령어는 키는
node-type
, 값은production
, 효과는NoSchedule
을 갖는 테인트를 추가파드 4개를 생성했지만, 톨러레이션을 설정하지 않았기 때문에
gke-cluster-1-default-pool-00c2d871-0ihe
노드에는 스케줄링이 안되는 걸 확인할 수 있음파드에 톨러레이션 추가
테인트와 톨러레이션의 활용 방안 이해
노드는 하나 이상의 테인트를 가질 수 있고, 파드는 하나 이상의 톨러레이션을 가질 수 있다.
테인트는 키와 효과만 갖고 있고, 값은 꼭 필요로 하지 않는다.
톨러레이션은 Equal 연산자를 지정(디폴트가 Equal)해 특정 값을 허용하거나, Exists 연산자를 사용해 특정 테인트 키에 여러 값을 허용할 수 있다.
테인트는 새 파드의 스케줄링을 방지하고(NoSchedule), 선호하지 않는 노드를 정의하고(PreferNoSchedule), 노드에서 기존 파드를 제거(NoExecute)하는 데에도 사용할 수 있다.
kmg88801@cloudshell:~/chapter16 (awesome-caster-376906)$ kubectl get po kubia-bd7db89-g94d4 -o yaml
아래 pod 분석을 보면, 노드가 준비되지 않은 상태에서 파드는 재스케줄링되기 전에 300초 동안 기다리는 정책을 볼 수 있다.
도달할 수 없는 노드에도 동일하게 적용된다.
아래 두개 톨러레이션은 이 파드가
notReady
또는unreachable
상태를 300초 동안 허용한다는 것을 의미한다.쿠버네티스 컨트롤 플레인은 노드가 더 이상 준비되지 않았거나 더 이상 도달할 수 없다는 것을 감지하면, 파드를 삭제하고 다른 노드로 다시 스케줄링하기까지 300초 동안 기다린다.
노드 어피니티를 사용해 파드를 특정 노드로 유인하기
테인트는 파드를 특정 노드에서 떨어뜨려 놓는 데 사용한다.
노드 셀렉터와 유사하게 각 파드는 고유한 노드 어피니티 규칙을 정의할 수 있다.
선호도를 지정하는 방식으로 쿠버네티스에게 어떤 노드가 특정한 파드를 선호한다는 것을 알려주면, 쿠버네티스는 해당 노드 중 하나에 파드를 스케줄링하려고 시도하게 된다.
노드 어피니티는 노드 셀렉터와 같은 방식으로 레이블 기반으로 노드를 선택한다.
노드에는 많은 레이블이 있지만 노드 어피니티와 파드 어피니에 있어서는 아래 세 개 레이블이 가장 중요하다.
파드 노드 어피니티 규칙 지정
아래와 같이 파드를 생성하게 되면 노드 셀렉터를 사용해 파드는 gpu=true라는 레이블이 있는 노드에만 스케줄링된다.
노드 셀렉터를 노드 어피니티 규칙으로 바꾼 yaml 예제는 아래와 같다.
파드의 스케줄링 시점에 노드 우선순위 지정
preferredDuringSchedulingIgnoredDuringExecution : 새로 도입된 노드 어피니티 기능의 가장 큰 장점은 특정 파드를 스케줄링할 때 스케줄러가 선호할 노드를 지정하는 필드
노드 레이블링
Selector-SpreadPriority
기능이 있다.파드 어피니티와 안티-어피니티를 이용해 파드 함께 배치하기
흥미로운 점은, 파드 어피니티 규칙을 정의하지 않은 백엔드 파드를 삭제하더라도, 스케줄러가 백엔드 파드를
gke-cluster-1-default-pool-00c2d871-mrz4
에만 스케줄링한다.백엔드 파드가 실수로 삭제돼서 다른 노드로 다시 스케줄링된다면, 프론트엔드 파드의 어피니티 규칙이 깨지기 때문에 같은 노드에 스케줄링되는 것이다.
동일한 가용 영역에 파드 함께 배포하기
topologyKey
속성을failure-domain.beta.kubernetes.io/zone
으로 변경하면 된다.같은 리전에 파드를 함께 배포하기
topologyKey
속성을failure-domain.beta.kubernetes.io/region
으로 변경하면 된다.topologyKey 작동 방법 이해
podAffinity
정의할때topologyKey
를 rack으로 설정podAffinity
구성 확인하고 레이블 셀렉터와 일치하는 파드를 찾은 다음 파드가 실행 중인 노드를 찾는다.podAffinity
에 지정된topologyKey
필드와 일치하는 키를 갖는 노드 레이블을 찾는다.