Kubernetes의 CronJob
을 특정 노드에 배포할 때, nodeSelector
와 nodeAffinity
를 조합하여 더욱 세밀한 노드 선택을 할 수 있습니다.
이번 글에서는 기존 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
를 활용해야 합니다.
nodeSelector
와 nodeAffinity
를 함께 사용하는 설정
아래처럼 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
을 더욱 세밀하게 컨트롤할 수 있습니다!