Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

kubernetes Job

kubernetes Job

Job


  • 일회성으로 실행되는 서비스
  • 특정 동작을 수행 뒤 종료
  • Pod는 Completed가 최종 상태


1. 일반적인 Job 생성
  • Apiversion → batch 설정
  • Deployment와 동일하게 template keyword 사용
  • selector,labels은 별도로 설정안해주어도 동작

    1
    2
    3
    
      $ kubectl apply -f default_job.yml
      $ kubectl get job
      $ kubectl describe job/hello
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      # default_job.yml
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: hello
      spec:
        template:
          spec:
            # Always, Never, OnFailure
            restartPolicy: Never
            containers:
            - name: hello
              image: ubuntu:focal
              command: ["sh", "-c", "echo test > test"]
    

2. 여러 Job + 병렬 처리
  • Airflow Task 병렬처리와 동일한 개념
  • completions : 총 생성할 수
  • parallellism : 동시에 실행할 수 있는 pod 수

    1
    2
    3
    
      $ kubectl apply -f job-parallelism.yml
      $ kubectl get job
      $ kubectl describe job/hello
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      # job-parallelism.yml
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: hello
      spec:
        completions: 10
        parallelism: 3
        template:
          spec:
            restartPolicy: Never
            containers:
            - name: hello
              image: ubuntu:focal
              command: ["sh", "-c", "sleep 20; echo test > test]
    


3. 특정 시간만 동작

  • activeDeadlineSeconds = N초 동안만 동작
  • N초가 지난다면 종료
  • 아래 예시는 3초로 제한을 두고 5초 이후에 동작하도록 만든 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      # pod deadline 주기
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: hello
      spec:
        activeDeadlineSeconds: 3
        template:
          spec:
            restartPolicy: Never
            containers:
            - name: hello
              image: ubuntu:focal
              command: ["sh", "-c", "sleep 5; echo test > test"]
    


CronJob


  • kind = CronJob
  • 주기적으로 특정 작업을 처리하기 위함
  • successfulJobsHistoryLimit = N개 까지만 실행
  • Airflow Cron 스케줄링과 동일
  • Job을 생성 후 작업 수행
  • Job → Pod 생성
  • 일반적으로 백업, 알림 전송 등의 목적으로 사용

  • 매 1분마다 동작하도록 만든 job

    1
    2
    3
    4
    
      $ kubectl apply -f cronjob.yml
      $ kubectl get cronjob
      $ kubectl get job
      $ kubectl describe cronjob/hello-every-minute
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      # cronjob.yml
      apiVersion: batch/v1
      kind: CronJob
      metadata:
        name: hello-every-minute
      spec:
        schedule: "*/1 * * * *"
        successfulJobsHistoryLimit: 5
        jobTemplate:
          spec:
            template:
              spec:
                restartPolicy: Never
                containers:
                - name: hello
                  image: ubuntu:focal
                  command: ["sh", "-c", "echo Hello $(date)!"]