728x90
반응형
kubernetes의 label을 배우게 되었을 때 되게 좋은 기능이다라고 생각했다. 공부를 하다보니 affinity와 nodeselector등의 개념이 헷갈렸다. 이를 자세히 서술하고자 한다.
NodeSelector
앞 전에 node label을 하면서 nodeselector부분은 안 하고 넘어갔다.
- 레이블 노드 : 먼저 노드 선택에 사용할 키-값 쌍으로 노드에 레이블을 지정해야 한다. <node-name>노드 이름과 <key>=<value>노드에 할당할 레이블 키-값 쌍으로 바꾼다 .
- kubectl label nodes <node-name> <key>=<value>
- nodeSelector 정의하기 : Pod manifest에서 섹션 spec 아래에 nodeSelector필드를 정의할 수 있다.노드에 지정하고자 하는 라벨의 key-value값을 지정한다.
- apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx nodeSelector: <key>: <value>
- pod manifest 적용하기 :위의 command를 사용하여 포드 매니페스트를 적용한다 .
- kubectl apply -f <pod-manifest.yaml>
nodeSelector Pod 사양을 정의하면 Kubernetes 스케줄러는 Pod를 예약할 때 레이블이 일치하는 노드만 고려하게 된다. 일치하는 노드가 없으면 nodeSelector적합한 노드를 사용할 수 있을 때까지 포드는 예약되지 않은 상태로 유지된다.
Node Affinity
실제 단어의 개념을 살펴보면 다음과 같다.
Affinity: a close similarity between two things
Node Affinity 기능은 특정 Pod 들이 특정 노드에 위치시키는 것을 보장하기 위한 기능이다.
1)연산자
연산자를 통해서 매칭할 수 있다. 이는 두 가지가 존재한다.
Or 연산자
- matchExpressions:
- key: size
operator: In
values:
- Large
- Medium
Not 연산자
...
- matchExpressions:
- key: size
operator: NotIn
values:
- Small
2) Node Affinity 타입
apiVersion: v1
kind: Pod
metadata:
name: core-k8s
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In
values:
- Large
- requiredDuringSchedulingIgnoredDuringExecution : 규칙이 만족되지 않으면 스케줄러가 Pod를 스케줄링할 수 없다.
- Required +DuringScheduling : 새로 생성되는 Pod에 대해 적용한다. 만족하지 않는 Node에 스케줄링 하지 않는다.
- Ignored +DuringExecution : 실행 중인 Pod에 대해 이 affinity는 무시한다.
- preferredDuringSchedulingIgnoredDuringExecution : 조건을 만족하는 노드를 찾는다. 만약 이에 해당되는 노드가 없더라도, 스케줄러는 파드를 스케줄링한다.
- Preferred + DuringScheduling : 새로 생성되는 Pod에 대해 적용하며 최대한 조건을 만족하도록 스케줄링한다.
- Ignored +DuringExecution : 실행 중인 Pod에 대해 무시한다. 최대한 매칭될 수 있는 Node에 배치시킬 수 있게 한다.
affinity와 nodeselector의 차이
1) nodeselector
- 목적 : NodeSelector는 Pod를 예약해야 하는 노드 레이블 집합을 지정할 수 있다. 라벨을 기반으로 노드를 필터링하는 간단한 방법이다.
- 기능 : NodeSelector를 사용하면 단일 키-값 쌍을 지정할 수 있다. nodeSelector가 설정된 포드는 지정된 라벨과 일치하는 노드에만 예약된다.
- 예 : nodeSelector를 사용하여 SSD 스토리지와 같은 특정 하드웨어 특성으로 레이블이 지정된 노드에서만 포드가 실행되도록 할 수 있다.
2) affinity
- 목적 : Affinity는 레이블 표현식을 사용하여 정의된 규칙을 기반으로 Pod 예약에 영향을 줄 수 있는 보다 유연하고 강력한 메커니즘이다.
- 기능 : 선호도를 사용하면 노드 레이블을 기반으로 포드 예약에 대한 복잡한 규칙을 정의할 수 있습니다.
- 예 : 선호도 규칙을 사용하여 Pod 그룹이 동일한 가용성 영역의 노드에 예약되도록 하거나 고가용성을 위해 여러 오류 도메인에 Pod를 분산시킬 수 있다.
NodeSelector는 노드 레이블을 기반으로 기본 필터링을 허용하는 것이 더 간단한 메커니즘이다. 또한 더 복잡한 요구 사항이 있을 때 대응하지 못한다. 반면, Affinity는 레이블 규칙을 기반으로 Pod 예약에 영향을 주기에 보다 고급스럽고 유연한 옵션을 제공한다.
👇🏻 참고 사이트
728x90
반응형