[1.짧게 말해서]
노드셀렉터(nodeselector)란 쿠버네티스에서 특정 파드(Pod)를 원하는 노드에 스케쥴링하기 위해 사용하는 기능이다. 노드에 라벨링을 한 뒤, 파드 구성 시 노드셀렉터 기능을 통해 어떤 라벨을 가진 노드에 스케쥴링 할 지 정할 수 있다.
예를 들어, '나는 관리자용 애플리케이션은 다른 노드와 물리적으로 분리하고 싶어.' 라는 생각이 들 경우, 특정 노드에 'System=MGMT' 라는 라벨(label)을 부여하고 관리자용 애플리케이션 Pod 배포 시, Nodeselector에 'Nodeselector: System:MGMT' 와 같이 선택하면 해당 노드에만 파드가 배치되게 된다.
[2. 조금 더 자세하게]
1. 노드셀렉터 옵션
노드셀렉터는 별도의 옵션이 존재하지 않는다. nodeselector는 노드의 label을 기반으로 작동하며 pod spec에 'nodeselector' 필드를 추가하는 게 끝이다.
즉, 단순하게 label인 'key=value' 표현식만을 지원하며, 'In', 'NotIn', 'Exists', 'DoesNotExist', 'Gt', 'Lt' 등의 복잡한 표현식을 사용하기 위해서는 노드 어피니티(Node Affinity)를 사용해야 한다.
또한 테인트(Taints)와 톨러레이션(Tolerations)등의 기능을 사용하여 조금 더 세밀하게 pod 스케쥴링을 조절 가능하다.
2. 사용 방법
1)먼저 노드에 라벨링을 해야한다. 보통 생성시 노드에 lable을 넣을 수 있는 옵션이 있다. 만약에 그냥 생성했을 경우 다음과 같은 'kubectl' 명령어를 통해서 label을 부여할 수 있다.
kubectl label nodes <노드 이름> <레이블 키>=<레이블 값>
###example
kubectl label nodes my-node System=MGMT
2)다음은 pod 생성 시, pod spec에 nodeselector 필드를 추가해 준다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
nodeSelector:
System: MGMT
이렇게 작업 할 경우, my-pod는 MGMT 노드에만 스케쥴링 된다.
3. Node Affinity와의 차이점 및 장단점
Node selector와 Node affinity 둘 다 파드를 어떤 노드에 스케쥴링 할지 정하는 기능을 수행한다. 둘의 큰 차이점은 설정의 복잡성과 유연성에 있다.
노드 셀렉터는 단순한 'key=value'만을 지원하며 별도의 옵션을 지원하지 않는다. 하지만 노드 어피니티는 노드 셀렉터보다 더 세밀한 노드 선택 기능을 제공한다. 'In', 'NotIn', 'Exists', 'DoesNotExist', 'Gt', 'Lt' 등의 연산자를 사용하여 더 복잡한 노드 선택 조건을 정의할 수 있다. 또한, 노드 어피니티는 'required'와 'preferred' 두 가지 유형을 제공하여 더 큰 유연성을 제공한다.
무엇이 더 좋냐라고 한다면 대답이 불가능하다. 상황에 따라 너무 다르기 때문이다. 노드 어피니티가 기능이 더 많은데 더 좋은게 아닐까? 하고 생각할 수 있지만, 노드셀렉터는 초보자도 금방 사용할 수 있을 정도로 러닝커브가 짧고 직관적이다. 시스템을 운영해보면 알겠지만, 직관성이 가지는 장점은 굉장히 크다.
pod가 어떤 노드에 배치 되었는지 코드로 확인만 해도 해당 pod가 어떤 성격을 가지고 있는지 확인 가능할 뿐더러, 유지 관리도 훨씬 용이해진다.
다른 사람이 운영하던 시스템이더라도, 매우 직관적이라 수정과 보수가 용이하기 때문이다. 감히 말해보자면, 노드어피니티를 사용하지 않아도 될 정도로 기능이 직관적으로 구성 된 애플리케이션과 인프라가 잘 구축 된 시스템이 아닐까 싶다.
물론 노드어피니티가 가진 유연성은 노드셀렉터는 절대 따라갈 수 없다.
'Kubernetes > 실전압축지식' 카테고리의 다른 글
[실.압.지]Kubeconfig란 무엇인가? (0) | 2024.08.22 |
---|