1. 개요
쿠버네티스에서 CronJob을 사용하여 주기적으로 실행되는 작업을 관리할 때, 적절한 리소스 설정이 필요합니다. 특히, CPU 사용량이 예측할 수 없이 변동되는 경우 requests.cpu
와 limits.cpu
를 설정하여 안정적인 동작을 보장할 수 있습니다.
이 문서는 CronJob에서 CPU 리소스를 설정하는 방법을 설명합니다.
2. CronJob 정의 및 리소스 설정
아래는 requests.cpu
와 limits.cpu
를 설정한 CronJob 예제입니다. 해당 예제에서는 메모리 제한 없이 CPU에 대한 설정만 추가하였습니다.
CronJob YAML 예제
apiVersion: batch/v1
kind: CronJob
metadata:
name: example-batch-job
namespace: example-batch
labels:
env: tst
app: example-batch-job
spec:
concurrencyPolicy: Forbid
startingDeadlineSeconds: 300
schedule: "*/1 * * * *"
timeZone: "Asia/Seoul"
successfulJobsHistoryLimit: 1
jobTemplate:
metadata:
labels:
env: tst
app: example-batch-job
spec:
backoffLimit: 0
template:
metadata:
labels:
env: tst
app: example-batch-job
spec:
serviceAccount: example-batch-cronjob
nodeSelector:
group: batch
containers:
- command:
- /bin/sh
- -c
- |
strdate=$(date -d "-1 days" '+%Y%m%d');
java -jar -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE -Djob.name=exampleJob $WORK_DIR/$JAR_NAME handOper strdate="$strdate"
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: NODE_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
envFrom:
- configMapRef:
name: config-example-batch
- secretRef:
name: secret-example-batch
image: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/example-batch/example-batch:tst-001
imagePullPolicy: Always
name: example-batch-job
volumeMounts:
- mountPath: /app_log
name: mnt-volume
- mountPath: /app/config/config.conf
name: config-volume
subPath: config.conf
resources:
requests:
cpu: "500m" # 최소 0.5코어 요청
limits:
cpu: "1" # 최대 1코어 제한
restartPolicy: Never
volumes:
- hostPath:
path: /app_log
type: Directory
name: mnt-volume
- configMap:
defaultMode: 420
name: config-example-batch
name: config-volume
3. 리소스 설정 설명
- requests.cpu: 파드가 스케줄될 때 최소한 보장받는 CPU 자원 (0.5코어).
- limits.cpu: 파드가 사용할 수 있는 최대 CPU 자원 (1코어).
- 리소스 제한을 설정하지 않으면: 파드는 사용 가능한 모든 CPU를 가져갈 수 있으며, 가용 리소스에 따라 실행될 때마다 다른 CPU 개수를 사용할 수 있음.
4. 모니터링 및 검증
리소스 설정이 올바르게 적용되었는지 확인하려면 다음 명령어를 사용하여 모니터링할 수 있습니다.
4.1. 실행 중인 노드의 CPU 사용량 확인
kubectl top nodes
4.2. 파드의 CPU 사용량 확인
kubectl top pods --namespace=example-batch
4.3. 파드의 QoS 확인
kubectl get pod <POD_NAME> -o jsonpath='{.status.qosClass}'
Burstable
이 출력되면requests.cpu
와limits.cpu
가 모두 설정된 상태.Guaranteed
이 출력되려면requests
와limits
값이 동일해야 함.
5. 결론
- CPU 사용량이 일정하지 않을 경우:
requests.cpu
를 설정하여 최소 보장 자원을 확보. - 과도한 CPU 사용 방지:
limits.cpu
를 설정하여 최대 사용량을 제한. - 리소스 미설정 시: 파드가 노드의 가용한 모든 CPU를 사용할 수 있어 예측 불가능한 동작이 발생할 수 있음.
이 설정을 적용하면 CronJob이 안정적으로 실행되며, CPU 리소스 오버헤드를 방지할 수 있습니다.