쿠버네티스 노드 구성 및 관리 개요
경계선(cordon)과 드레인(drain)
- 문제가 생길 것으로 예상되거나 유지보수가 필요한 노드에 사용
경계선(cordon)
- 경계선이 설정된 노드에는 파드가 배포되지 않음
드레인(drain)
- 유지보수를 목적으로 노드 내의 파드들을 다른 노드로 옮김
- 파드들을 모두 옮긴 이후 경계선이 설정됨
노드이름(nodeName)
- 파드가 특정 노드이름을 가진 노드에 배포됨
노드 레이블(label)
- 노드이름을 사용하는 것보다 효과적인 노드 관리가 가능
- 레이블 삽입:
k label node nodeName key=value
- 레이블 삭제:
k label node nodeName key-
key
와 value
를 함께 적는 것이 명료
노드셀렉터(nodeSelector)
- 노드셀렉터를 통하여 노드 레이블을 지정하여 파드 배포 가능
노드 어피니티(affinity) 그리고 안티 어피니티
노드 어피니티 조건
requiredDuringSchedulingIgnoredDuringExecution
: 파드가 노드에 배포되도록 규칙을 만족해야 함requiredDuringSchedulingIgnoredDuringExecution
: 규칙을 만족하는 노드에 배포되도록 스케줄러가 시도하지만 보증하지는 않음- 아래 2가지 배포 규칙은 현재 지원되지 않음
requiredDuringSchedulingRequiredDuringExecution
의 경우 노드 어피니티 요구 사항을 충족하지 않는 노드에서 파드를 제거
현재 노드 상태
nodeAffinity.yaml
key
가 inmemory
이고 value
가 redis
인 노드- 조건이 하나이기 때문에 노드셀렉터와 똑같이 동작
nodeAffinity-preferred.yaml
weight
가 클수록 가중치가 높아짐key
가 gpupool
이고 values
가 nvidia
인 레이블은 필수key
가 acclerator
이고 values
가 tesla-a100
인 레이블을 선호
anti-nodeAffinity.yaml
operator
가 NotIn
일 경우에는 key
와 values
조합이 맞지 않는 경우를 선호함
테인트(Taints)와 톨러레이션(Tolerations)
- 테인트(Taints): 특정 노드에 접근 방지
- 톨러레이션(Tolerations): 테인트에 의한 접근 방지를 해제
마스터 노드에 걸려 있는 테인트와 톨러레이션
테인트와 톨러레이션 4가지 조건
- Effect
- NoSchedule: 가장 기본적인 설정. 노드에 테인트가 설정되어 있지 않은 경우 파드가 노드에 스케줄되지 않음. 이 경우 톨러레이션을 통한 배포만 가능함.
- PreferNoSchedule: NoSchedule과 유사하지만 스케줄러에서 더 이상 할당할 수 있는 노드가 없는 경우 테인트 설정을 무시하고 스케줄함
- NoExecute: NoSchedule에 현재 할당된 파드에도 바로 적용되도록 스케줄을 다시 조정하는 기능 추가. 즉 톨러레이션이 없는 파드는 모두 노드에서 제거함
- Key: 사용자가 지정하는 기준 대상 키
- Value: 사용자가 지정한 키에 대한 값
Operator: 키와 값에 대한 연산자 (Exists | Equal) 기본 값은 Equal |
테인트와 톨러레이션에 의한 파드 할당 조건
daeomonset-w-tolerations.yaml
- 위와 같이 톨러레이션을 적용하여 마스터 노드에도 배포 가능
DB를 보호하라!
- 인메모리 DB인 redis가 배포된 워커 노드 #3에 테인트를 설정하여 보호
DB에도 배포하기
- 톨러레이션을 설정하여 DB 워커 노드에도 배포할 수 있음
deployment-w-tolerations.yaml
- 그러나 이러한 코드만을 적용하면 DB 워커 노드 뿐만 아니라 다른 노드에도 배포됨
- DB 워커 노드에만 배포하기 위해서는 추가적인 조치가 필요
테인트와 톨러레이션에 대한 오해 풀기
- 톨러레이션은 테인트에 의한 보호를 해제하는 역할
- DB 워커 노드에만 배포하기 위해서는 톨러레이션과 더불어 어피니티를 적용해야 함