나는 아래 게시물에서 특정 node에는 특정 values값만 가지는 pod를 배포하는것에 대해서 공부하였다.
근데 결과적으로 말하면 Taint는 특정 node에 특정 values값을 가지는 pod만 배포한다는것이지, 해당 pod가 항상 특정 node에 배포되는것을 보장하지는 못한다.
이런 문제점을 해결하기 위해 바로 nodeAffinity 존재한다. nodeAffinity는 특정 pod를 특정 node에만 배포하는것을 보장한다.
nodeAffinity란?
사전적인 단어풀이를 하면 node에 대한 친밀도이다. 즉, node에 대해 친밀도를 지정하여 특정 pod를 특정 node에만 배포될 수 있게 한다.
만드는 방법은 어렵지 않다. 아래는 Deployment를 예시로 하였으나 pod 생성 yaml도 동일하게 spec 하위에 기재하면 된다.
nodeAffinity 포맷은 어떻게될까?
기본적인 포맷은 아래와 같으며, 옵션 1, 2와 같이 사용자가 입력에 따라 다르게 동작하는 부분이 있다.
...중략...
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: <<< 옵션 1
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In <<< 옵션 2
values:
- ssd
...중략...
옵션 1에 대해서 조금 더 상세하게 보면, 아래 2가지 옵션이 존재한다.
- requiredDuringSchedulingIgnoredDuringExecution : Schedule에 필요한 필수 조건
- preferredDuringSchedulingIgnoredDuringExecution : Schedule에 필요한 선택 조건
- preferred 옵션에는 하위에 weight 옵션이 있다. 이는 1 ~ 100까지 설정 가능하며 우선순위를 뜻한다.
- 여러개의 nodeAffinity 옵션이 있을 때 weight가 높은것을 우선순위로하여 해당 node에 배포된다.
옵션 2은 key, values에 대한 관계를 나타내는 것으로 조금 더 많은 옵션이 존재한다.
옵션 2 값 | 설명 |
In | values[] 필드에 설정한 값 중에서 labels에 일치한 값이 하나 이상 존재하는지 확인한다. |
NotIn | In과 반대로 values[] 값이 모두 맞지 않는지 확인한다. |
Exists | key 필드에 설정한 값이 labels에 있는지만 확인한다. 이때 values[]는 필요없다. |
DoseNotExist | Exists와 반대로 node labels에 key 필드에 설정한 값이 없는지만 확인한다. |
Gt | values[] 필드에 설정한 값보다 더 큰 숫자형 데이터인지 확인한다. 이때 values[]는 숫자형 1개 데이터만 받는다. |
Lt | values[] 필드에 설정한 값보다 더 작은 숫자형 데이터인지 확인한다. 이때 values[]는 숫자형 1개 데이터만 받는다. |
node Taint + Toleration + Affinity를 사용하면 특정 pod를 특정 node에만 배포할 수 있도록 할 수 있다.
이런 기능을 통해 서비스 또는 팀단위의 프로젝트를 node 별로 관리할 수 있는 이점이 있다!!!
'기술 이모저모 > [K8s] Kubernetes' 카테고리의 다른 글
[k8s] Kubernetes Container Resources request, limit 방법 (0) | 2022.10.10 |
---|---|
[k8s] KodeKloud Practice test - Resouce Limis (0) | 2022.10.10 |
[k8s] Kubernetes Node Taint & Tolerations의 개념정리 (0) | 2022.10.09 |
[k8s] 명령형 접근방법과 선언형 접근방법의 차이 (0) | 2022.10.02 |
[k8s] Kubernetes Namespace란? 개념정리 (0) | 2022.10.02 |