[MacOS 환경 #19] 쿠버네티스 affinity, anti-affinity

도람·2025년 11월 20일

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

1. affinity 예제 - dev 노드 선호 배치

파일명: 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
  • requiredDuringSchedulingIgnoredDuringExecution: 반드시 이 조건을 만족하는 노드에만 스케줄됨

따라서, env=dev 라벨이 있는 multi-node-worker 노드에 Pod이 모두 스케줄될 것으로 예상된다.


실제로 디플로이먼트를 배포했을 때, 두 파드 모두 1번 워커노드에 간 것을 확인할 수 있다.


2. anti-affinity 예제 — dev 노드 회피 배치

파일명: 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
  • NotIn 연산자 : env=dev 라벨이 없는 노드로만 스케줄됨
    즉, multi-node-worker2(stage) 또는 multi-node-worker3(prod) 중 한 곳으로 배치될 것으로 예상된다 .

실제로 not in 인자를 주니 워커노드 2번과 3번으로 배치된 것을 확인할 수 있다.


요약 표

실습명적용 조건배치 대상 노드연산자의미
affinityenv=devmulti-node-workerIndev 라벨 노드로만
anti-affinityenv!=devmulti-node-worker2, multi-node-worker3NotIndev 라벨 노드 제외
profile
정도를 걷는 엔지니어

0개의 댓글