Kubernetes CronJob에서 nodeSelector와 nodeAffinity를 함께 사용하는 방법

Kubernetes의 CronJob을 특정 노드에 배포할 때, nodeSelectornodeAffinity를 조합하여 더욱 세밀한 노드 선택을 할 수 있습니다.
이번 글에서는 기존 nodeSelector를 유지하면서 nodeAffinity를 추가하여 특정 조건을 만족하는 노드에서만 Pod가 실행되도록 설정하는 방법을 소개합니다.


기존 설정 (nodeSelector만 사용)

아래와 같은 CronJob 설정이 있다고 가정합니다.
이 설정은 group=batch 라벨이 있는 노드에서만 실행됩니다.

apiVersion: batch/v1
kind: CronJob
metadata:
name: samplejob
namespace: batch
labels:
env: tst
app: samplejob
spec:
concurrencyPolicy: Forbid
startingDeadlineSeconds: 300
schedule: "*/5 * * * *"
timeZone: "Asia/Seoul"
successfulJobsHistoryLimit: 1
jobTemplate:
metadata:
labels:
env: tst
app: samplejob
spec:
backoffLimit: 0
template:
metadata:
labels:
env: tst
app: samplejob
spec:
serviceAccount: batch-cronjob
nodeSelector:
group: batch # 특정 노드 그룹 지정
restartPolicy: OnFailure
containers:
- name: my-container
image: my-image

이렇게 하면 group=batch 라벨이 붙은 노드에서만 Pod가 실행됩니다.
그러나 추가적으로 exe=test1 라벨이 있는 노드에서만 실행되도록 세밀한 조건을 적용하고 싶다면 nodeAffinity를 활용해야 합니다.


nodeSelectornodeAffinity를 함께 사용하는 설정

아래처럼 nodeAffinity를 추가하면, 기존 nodeSelector: { group: batch }를 유지하면서
추가적으로 exe=test1 라벨이 있는 노드에서만 실행되도록 제한할 수 있습니다.

apiVersion: batch/v1
kind: CronJob
metadata:
name: samplejob
namespace: batch
labels:
env: tst
app: samplejob
spec:
concurrencyPolicy: Forbid
startingDeadlineSeconds: 300
schedule: "*/5 * * * *"
timeZone: "Asia/Seoul"
successfulJobsHistoryLimit: 1
jobTemplate:
metadata:
labels:
env: tst
app: samplejob
spec:
backoffLimit: 0
template:
metadata:
labels:
env: tst
app: samplejob
spec:
serviceAccount: batch-cronjob
nodeSelector:
group: batch # 기존 nodeSelector 유지
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: exe
operator: In
values:
- test1 # exe=test1 라벨이 있는 노드에서만 실행
restartPolicy: OnFailure
containers:
- name: my-container
image: my-image

🔍 설정 변경 사항 설명

✅ 기존 nodeSelector 유지

  • group=batch 라벨이 있는 노드를 기본적으로 선택하도록 설정 유지

✅ nodeAffinity 추가

  • requiredDuringSchedulingIgnoredDuringExecution을 사용하여
    exe=test1 라벨이 있는 노드에서만 실행되도록 강제 설정
  • operator: In을 사용하여 exe 라벨 값이 test1인 경우에만 해당 노드에서 실행

✅ 유연한 노드 선택 가능

  • nodeAffinity를 사용하면 여러 개의 노드 조건을 설정할 수 있어 관리가 용이함
  • 특정 조건을 충족하지 않는 노드는 선택되지 않음

🚀 정리

방법설명
nodeSelector특정 라벨이 있는 노드만 선택 (단순한 필터링)
nodeAffinity특정 라벨 조건을 추가로 적용하여 더욱 세밀한 노드 선택 가능

이 설정을 사용하면 group=batch 라벨이 있는 노드 중에서 exe=test1 라벨이 있는 노드에서만 CronJob이 실행됩니다.
이렇게 하면 특정 작업을 수행하는 CronJob이 원하는 노드에서만 실행되도록 제한할 수 있습니다. 🎯

nodeName을 직접 지정하는 방식도 있지만, 특정 노드에 강제되므로 클러스터의 유연성을 해칠 수 있습니다.
따라서 nodeSelector + nodeAffinity 조합이 더 좋은 방법입니다.

이제 Kubernetes CronJob을 더욱 세밀하게 컨트롤할 수 있습니다! 🚀

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다