7.6.3 [실습] 간단한 배치 작업 및 주기적 실행 작업 생성

이론으로 잡(Job)과 크론잡(CronJob)의 개념과 주요 기능들을 살펴보았으니, 이제 직접 이들을 만들어보고 그 동작을 경험해 볼 차례입니다. 이번 실습에서는 매우 간단한 두 가지 작업을 쿠버네티스에서 실행해 볼 것입니다. 첫 번째는 “Hello World” 메시지를 한 번 출력하고 종료하는 잡을 생성하는 것이고, 두 번째는 매분마다 현재 시간을 출력하는 크론잡을 만들어 주기적으로 잡이 실행되는 것을 확인하는 것입니다.

이 실습을 통해 독자 여러분은 잡과 크론잡의 YAML 파일을 어떻게 작성하는지, 그리고 kubectl 명령어를 사용하여 어떻게 이들을 관리하고 상태를 확인할 수 있는지 구체적으로 익힐 수 있을 것입니다. 본 실습 역시 이전 실습들과 마찬가지로, 쿠버네티스 클러스터와 kubectl CLI가 준비되어 있어야 합니다. Minikube, kind, Docker Desktop의 쿠버네티스 기능 또는 클라우드 제공업체의 관리형 서비스를 사용하시면 됩니다.

자, 그럼 쿠버네티스의 일꾼들, 잡과 크론잡을 직접 고용하여 일을 시켜볼까요?

7.6.3.1 “Hello World” 출력 잡 생성

가장 먼저, 일회성 작업을 실행하는 잡(Job)을 만들어 보겠습니다. 이 잡은 간단하게 “Hello from the Kubernetes Job!”이라는 메시지를 표준 출력으로 내보내고 성공적으로 종료되는 파드를 하나 생성할 것입니다. 우리는 busybox라는 경량 컨테이너 이미지를 사용하여 이 작업을 수행할 것입니다.

아래 내용을 hello-job.yaml 이라는 이름의 파일로 저장해 주세요.

클립보드에 복사

이 YAML 파일의 주요 부분을 살펴보겠습니다.

  • apiVersion: batch/v1과 kind: Job: 이 명세가 batch/v1 API 그룹에 속한 Job 오브젝트를 정의한다는 것을 명시합니다.
  • metadata.name: hello-world-job: 잡의 이름을 hello-world-job으로 지정합니다.
  • spec.template.spec.containers[0].command: busybox 컨테이너 내에서 실행될 명령어를 정의합니다. /bin/sh -c를 사용하여 셸 스크립트 형태로 명령을 전달하며, “Hello from the Kubernetes Job!” 메시지를 표준 출력으로 내보낸 후, sleep 5를 통해 5초간 대기했다가 정상적으로 종료(종료 코드 0)하도록 합니다. (sleep을 추가한 이유는 파드가 너무 빨리 종료되어 상태 변화를 관찰하기 어려울 수 있기 때문입니다.)
  • spec.template.spec.restartPolicy: Never: 파드 내 컨테이너가 실패하더라도 파드 자체를 재시작하지 않고, 잡 컨트롤러가 새로운 파드를 생성하여 재시도하도록 설정합니다.

이제 터미널에서 이 YAML 파일이 저장된 디렉토리로 이동한 후, 다음 명령어를 실행하여 잡을 생성합니다.

클립보드에 복사

“job.batch/hello-world-job created” 라는 메시지가 출력될 것입니다. 잡이 잘 생성되었고 실행 중인지 확인해 보겠습니다.

클립보드에 복사

hello-world-job이라는 이름의 잡이 보이고, COMPLETIONS, DURATION, AGE 등의 상태 정보가 표시될 것입니다. 처음에는 COMPLETIONS가 0/1로 표시되다가, 작업이 완료되면 1/1로 변경될 것입니다. DURATION은 작업이 실행된 시간을 나타냅니다.

잡에 의해 생성된 파드의 상태도 확인해 볼 수 있습니다.

클립보드에 복사

hello-world-job-xxxxx (뒷부분은 랜덤 문자열) 형태의 이름을 가진 파드가 보일 것입니다. 처음에는 Pending 또는 ContainerCreating 상태였다가, 잠시 후 Running 상태가 되고, 5초가 지나면 Completed 상태로 변경되는 것을 확인할 수 있습니다.

작업이 완료된 파드의 로그를 확인하여 “Hello from the Kubernetes Job!” 메시지가 제대로 출력되었는지 보겠습니다. (위 kubectl get pods 명령으로 확인한 실제 파드 이름을 사용하세요.)

클립보드에 복사

“Hello from the Kubernetes Job!” 라는 메시지가 출력되는 것을 확인할 수 있습니다. 이로써 우리는 간단한 일회성 작업을 잡을 통해 성공적으로 실행했습니다! 잡이 완료된 후에는 더 이상 새로운 파드를 만들지 않으며, COMPLETIONS가 1/1로 표시된 것을 통해 작업이 성공적으로 마무리되었음을 알 수 있습니다.

만약 작업이 실패하도록 (예: command에서 exit 1을 반환하도록) 수정하고 backoffLimit을 설정한 후 잡을 실행하면, 잡이 설정된 횟수만큼 파드를 재시도하다가 결국 실패 상태가 되는 것도 관찰해 볼 수 있습니다.

7.6.3.2 매분마다 현재 시간을 출력하는 크론잡 생성

이제 예약된 시간에 주기적으로 작업을 실행하는 크론잡(CronJob)을 만들어 보겠습니다. 이 크론잡은 매분마다 새로운 잡을 생성하고, 이 잡은 현재 시간을 표준 출력으로 내보내고 종료되는 파드를 실행할 것입니다.

아래 내용을 time-cronjob.yaml 이라는 이름의 파일로 저장해 주세요.

클립보드에 복사

이 YAML 파일의 주요 부분을 살펴보겠습니다.

  • apiVersion: batch/v1과 kind: CronJob: 이 명세가 batch/v1 API 그룹에 속한 CronJob 오브젝트를 정의한다는 것을 명시합니다.
  • metadata.name: time-teller-cronjob: 크론잡의 이름을 time-teller-cronjob으로 지정합니다.
  • spec.schedule: “*/1 * * * *”: 이 크론잡이 매 1분마다 실행되도록 스케줄을 정의합니다. (실제 운영에서는 이렇게 짧은 주기로 실행하는 경우는 드물지만, 실습에서는 동작을 빠르게 확인하기 위해 사용합니다.)
  • spec.jobTemplate: 이 부분이 크론잡이 스케줄에 맞춰 생성할 잡(Job)의 명세를 담고 있습니다. 구조는 일반적인 잡의 spec 필드와 동일합니다.
    • spec.jobTemplate.spec.template.spec.containers[0].command: busybox 컨테이너 내에서 현재 시간을 출력하는 date 명령을 실행하고, 1초간 대기 후 종료합니다.
    • spec.jobTemplate.spec.template.spec.restartPolicy: OnFailure: 파드 내 컨테이너 실패 시 재시작하도록 설정합니다.

이제 터미널에서 다음 명령어를 실행하여 크론잡을 생성합니다.

클립보드에 복사

“cronjob.batch/time-teller-cronjob created” 라는 메시지가 출력될 것입니다. 크론잡이 잘 생성되었는지 확인해 보겠습니다.

클립보드에 복사

time-teller-cronjob이라는 이름의 크론잡이 보이고, SCHEDULE, SUSPEND, ACTIVE, LAST SCHEDULE, AGE 등의 상태 정보가 표시될 것입니다. SCHEDULE은 우리가 설정한 “*/1 * * * *”이 표시되고, ACTIVE는 현재 이 크론잡에 의해 실행 중인 잡의 수를 나타냅니다. LAST SCHEDULE은 마지막으로 잡이 스케줄링된 시간을 보여줍니다.

이제 1분 정도 기다린 후, 이 크론잡에 의해 생성된 잡(Job)들이 있는지 확인해 보겠습니다. (크론잡 컨트롤러가 스케줄을 감지하고 잡을 생성하는 데 약간의 시간이 걸릴 수 있습니다.)

클립보드에 복사

매분 정각(또는 그 근처)에 time-teller-cronjob-xxxxxxxxxx (앞부분은 크론잡 이름, 뒷부분은 스케줄링된 시간을 기반으로 한 해시값) 형태의 이름을 가진 새로운 잡이 생성되고, 잠시 후 COMPLETIONS가 1/1로 변경되며 완료되는 것을 관찰할 수 있을 것입니다. 몇 분 동안 지켜보면 여러 개의 완료된 잡들이 목록에 나타날 것입니다.

각 잡에 의해 생성된 파드의 로그도 확인하여 현재 시간이 제대로 출력되었는지 볼 수 있습니다. 먼저, 특정 잡의 이름을 확인한 후 (예: time-teller-cronjob-1678886400), 해당 잡에 의해 생성된 파드의 이름을 찾고 로그를 확인합니다.

클립보드에 복사

“Current time is [실제 시간]” 이라는 메시지가 출력되는 것을 확인할 수 있습니다. 각기 다른 시간에 실행된 잡들의 로그를 확인하면 서로 다른 시간이 출력될 것입니다.

또한, successfulJobsHistoryLimit의 기본값이 3이므로, 시간이 지나면 가장 오래된 성공한 잡부터 순차적으로 삭제되는 것도 kubectl get jobs 명령을 통해 관찰할 수 있습니다.

이 실습을 통해 우리는 잡을 사용하여 간단한 일회성 작업을 실행하고, 크론잡을 사용하여 주기적으로 잡을 생성하여 예약된 작업을 수행하는 방법을 직접 경험했습니다. 잡과 크론잡은 쿠버네티스에서 다양한 자동화 작업을 구현하는 데 매우 유용한 도구이며, 클라우드 네이티브 환경의 운영 효율성을 크게 높여줄 수 있습니다.