쿠버네티스 CronJob의 CPU 리소스 설정 가이드

1. 개요

쿠버네티스에서 CronJob을 사용하여 주기적으로 실행되는 작업을 관리할 때, 적절한 리소스 설정이 필요합니다. 특히, CPU 사용량이 예측할 수 없이 변동되는 경우 requests.cpulimits.cpu를 설정하여 안정적인 동작을 보장할 수 있습니다.

이 문서는 CronJob에서 CPU 리소스를 설정하는 방법을 설명합니다.

2. CronJob 정의 및 리소스 설정

아래는 requests.cpulimits.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.cpulimits.cpu가 모두 설정된 상태.
  • Guaranteed이 출력되려면 requestslimits 값이 동일해야 함.

5. 결론

  • CPU 사용량이 일정하지 않을 경우: requests.cpu를 설정하여 최소 보장 자원을 확보.
  • 과도한 CPU 사용 방지: limits.cpu를 설정하여 최대 사용량을 제한.
  • 리소스 미설정 시: 파드가 노드의 가용한 모든 CPU를 사용할 수 있어 예측 불가능한 동작이 발생할 수 있음.

이 설정을 적용하면 CronJob이 안정적으로 실행되며, CPU 리소스 오버헤드를 방지할 수 있습니다.

관련 글

답글 남기기

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