
pod가 특정 노드에서만 작동하도록 한계를 설정해야 한다.pod는 가장 큰 노드로 배치되어야 한다.node SelectorapiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: data-processor
image: data-processor
nodeSelector:
size: Large
// labels
size 필드는 사실 key-value로 이루어진 labels 이다.scheduler가 labels을 식별해서 pod를 올릴 올바른 node를 찾아낸다.# 노드에 레이블 붙이기
$ kubectl label nodes <node-name> <label-key>=<label-value>
더 복잡한 요구사항으로 노드를 식별해야할때
예를 들어, 중간 또는 큰 크기의 노드나 작지 않은 등등..
Node Selector로는 이런 요구사항을 만족할 수 없다.
pod가 특정 노드에 호스트될 수 있도록 함
Node Affinity 는 특정 노드에 pod 배치를 제한하는 고급 기능을 제공
apiVersion:
kind:
metadata:
name: myapp-pod
spec:
containers:
- name: data-processor
image: data-processor
affinity:
nodeAffinit:
requiredDuringSchedulingIgnoreDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: size
operator: In || NotIn || Exists
values:
- Large
// 만약 중간 크기를 지칭하는 레이블을 가진 노드에도 배치를 원하면 단지 추가 하면 됨
- Medium
Operation 필드에서 NotIn을 명시하면 해당 레이블을 제외한다Exists 연산자는 value를 필요로 하지않고 key의 존재만 식별하여 노드를 선택한다.Available:
requiredDuringSchedulingIgnoredDuringExecution
preferredDuringSchedulingIgnoreDuringExecution
Planned:
requiredDuringSchedulingRequiredDuringExecution
Node Affinity로 labels를 식별해 pod를 해당하는 node에 생성 했다.labels 이 할당되어 있는 node의 labels를 삭제하면 pod는 남아있을까?pod가 존재하지 않다가 처음으로 만들어지는 상태를 뜻함Node Affinity의 규칙을 따라 올바른 노드에 pod를 배치labels있는 노드를 사용할 수없다면?require 타입은 지정된 Affinity 규칙과 함께 pod를 node에 놓도록 지시함pod를 못찾으면 스케쥴링도 안됨preferred 타입은 Node Affinity 규칙을 찾아 배치하려고 하지만 만약 없다면 무시하고 해당 pod를 모든 가능한 노드에 배치pod는 계속 해당 노드에 실행된다