affinity와 anti-affinity에 대한 개념은
이전 포스팅 affinity, anti-affinity
에서 확인할 수 있다.
이번 게시물에서는 해당 개념에 대한 실습을 진행할 것이다.
현재 노드 구성과 레이블이 이렇게 되어있는 상태이다.
# worker 노드
kubectl label node multi-node-worker env=dev region=shared
# worker2 노드
kubectl label node multi-node-worker2 env=stage region=internal
# worker3 노드
kubectl label node multi-node-worker3 env=prod region=shared
파일명: deploy-affinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-affinity
spec:
replicas: 2
selector:
matchLabels:
app: nginx-affinity
template:
metadata:
labels:
app: nginx-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- dev
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
따라서, env=dev 라벨이 있는 multi-node-worker 노드에 Pod이 모두 스케줄될 것으로 예상된다.

실제로 디플로이먼트를 배포했을 때, 두 파드 모두 1번 워커노드에 간 것을 확인할 수 있다.
파일명: deploy-antiaffinity.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-antiaffinity
spec:
replicas: 2
selector:
matchLabels:
app: nginx-antiaffinity
template:
metadata:
labels:
app: nginx-antiaffinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: NotIn
values:
- dev
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

실제로 not in 인자를 주니 워커노드 2번과 3번으로 배치된 것을 확인할 수 있다.
실습명 적용 조건 배치 대상 노드 연산자 의미 affinity env=dev multi-node-worker In dev 라벨 노드로만 anti-affinity env!=dev multi-node-worker2, multi-node-worker3 NotIn dev 라벨 노드 제외