작업 실행

이 페이지에서는 Google Kubernetes Engine에서 Job을 실행하는 방법을 설명합니다.

개요

GKE에서 Job은 유한한 작업을 나타내는 컨트롤러 객체입니다. Job은 진행 중인 원하는 상태(예: 실행 중인 전체 포드 수)를 관리하는 것이 아니라 완료까지 실행되는 작업을 관리한다는 점에서 다른 컨트롤러 객체와 다릅니다.

Job은 대규모 계산과 일괄 처리 도구에 유용합니다. Job은 포드의 동시 실행을 지원하는 데 사용할 수 있습니다. Job을 사용하여 이메일 전송, 프레임 렌더링, 파일 트랜스코딩, 데이터베이스 키 스캔 등 독립적이지만 관련된 작업 항목을 동시에 실행할 수 있습니다. 하지만 Job은 백그라운드 프로세스의 지속적 스트림과 같이 긴밀하게 통신하는 동시 프로세스를 위해 만들어지지 않았습니다.

GKE에는 다음 2가지 유형의 Job이 있습니다.

  • 비동시 Job: 하나의 포드(포드가 종료에 실패하는 경우 다시 만들어지는 포드)만을 만들고 포드가 성공적으로 종료될 때 완료되는 Job
  • 완료 횟수가 있는 동시 Job: 일정 수의 포드가 성공적으로 종료될 때 완료되는 Job. 원하는 완료 횟수는 completions 필드를 사용하여 지정합니다.

Job은 Kubernetes Job 객체로 표현됩니다. Job이 만들어지면 Job 컨트롤러가 하나 이상의 포드를 만들고 포드가 성공적으로 종료되도록 합니다. 포드가 종료될 때 Job은 작업을 성공적으로 완료한 포드가 몇 개인지 추적합니다. 원하는 성공적 완료 횟수에 도달하면 Job이 완료됩니다.

다른 컨트롤러와 마찬가지로 Job 컨트롤러는 포드 중 하나가 실패하거나 삭제되는 경우, 새 포드를 만듭니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

Job 만들기

kubectl apply를 매니페스트 파일과 함께 사용하여 Job을 만들 수 있습니다.

다음 예는 Job 매니페스트를 보여줍니다.

apiVersion: batch/v1
kind: Job
metadata:
  # Unique key of the Job instance
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl"]
        args: ["-Mbignum=bpi", "-wle", "print bpi(2000)"]
      # Do not restart containers after they exit
      restartPolicy: Never
  

이름이 config.yaml인 파일에 매니페스트를 복사하고 Job을 만듭니다.

kubectl apply -f config.yaml

이 Job은 파이를 2,000자리까지 계산한 다음 인쇄합니다.

Job 객체의 유일한 요건은 포드 template 필드가 필수라는 것입니다.

Job 완료 횟수

Job은 특정 포드 개수가 성공적으로 종료될 때 완료됩니다. 기본적으로 단일 포드가 있는 비동시 Job은 포드가 성공적으로 종료되는 즉시 완료됩니다.

동시 Job이 있으면 선택사항인 completions 필드를 사용하여 완료 횟수를 설정할 수 있습니다. 이 필드는 얼마나 많은 포드가 성공적으로 종료된 후에 Job이 완료되는지 지정합니다. completions 필드는 0이 아닌 양의 값을 허용합니다.

completions를 생략하거나 0 값을 지정하면 포드 하나의 성공이 모든 포드의 성공을 나타내게 됩니다.

앞선 예의 config.yamlconfig-2.yaml이라는 파일에 복사합니다. config-2.yaml에서 nameexample-job-2로 변경하고 completions: 8을 Job의 spec 필드에 추가합니다. 이것은 성공적인 완료가 8회 있어야 한다는 의미입니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job-2
spec:
  completions: 8
  template:
    metadata:
      name: example-job-2
    spec:
      ...

Job을 만듭니다.

kubectl apply -f config-2.yaml

completions의 기본값은 1입니다. completions가 설정되면 달리 설정하지 않는 한 parallelism 필드의 기본값은 1이 됩니다. 두 필드가 모두 설정되지 않는 경우, 기본값은 1입니다.

동시 로드 관리

기본적으로 Job 포드는 동시에 실행되지 않습니다. 선택사항인 parallelism 필드는 주어진 임의의 시간에 Job이 동시에 실행되어야 하는 원하는 최대 포드 수를 지정합니다.

안정적 상태로 실행되는 포드의 실제 수는 나머지 작업이 parallelism 값보다 작을 경우, parallelism 값보다 작을 수 있습니다. completions도 설정한 경우, 동시에 실행되는 포드의 실제 수는 남은 완료 횟수를 초과하지 않습니다. Job은 과도한 포드 생성 실패에 응답하여 포드 생성을 제한할 수 있습니다.

앞선 예의 config.yamlconfig-3.yaml이라는 파일에 복사합니다. config-3.yaml에서 nameexample-job-3으로 변경하고 parallelism: 5를 Job의 spec 필드에 추가합니다. 이는 실행 중인 동시 포드가 5개 있어야 한다는 것을 지정합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job-3
spec:
  parallelism: 5
  template:
    metadata:
      name: example-job-3
    spec:
      ...

Job을 만듭니다.

kubectl apply -f config-3.yaml

parallelism의 기본값은 필드가 생략되거나 달리 설정되지 않는 한 1입니다. 이 값이 0으로 설정되면 값이 증가할 때까지 Job이 일시 중지됩니다.

기한 지정

기본적으로 Job은 포드가 계속 실패하는 경우, 새 포드를 영구적으로 생성합니다. Job이 계속해서 생성을 시도하는 것을 막으려면 선택사항인 activeDeadlineSeconds 필드를 사용하여 기한 값을 지정하면 됩니다.

기한은 Job이 이 시간(초) 안에 태스크를 성공적으로 완료해야 하며 그렇지 않으면 종료되어야 함을 나타냅니다.

기한을 지정하려면 매니페스트 파일에 있는 Job의 spec 필드에 activeDeadlineSeconds 값을 추가합니다. 예를 들어 다음 구성은 성공적으로 완료하기 위한 Job 기한을 100초로 지정합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: example-job
    spec:
      ...

기한 전에 Job이 성공적으로 완료되지 않는 경우, Job은 DeadlineExceeded 상태로 종료됩니다. 이로 인해 포드 생성이 중지되고 기존 포드가 삭제됩니다.

포드 선택기 지정

Job의 포드 템플릿을 업데이트하되 Job의 현재 포드가 업데이트된 Job에서 실행되기를 원하는 경우, 수동으로 선택기를 지정하는 것이 유용합니다.

Job은 selector 필드를 사용하여 인스턴스화됩니다. selector는 Job의 포드를 위한 고유한 식별자를 생성합니다. 생성된 ID는 다른 Job과 겹치지 않습니다. 일반적으로 이 필드는 직접 설정하지 않습니다. 다른 Job과 겹치는 selector 값을 설정하면 다른 Job의 포드에 문제가 발생할 수 있습니다. 이 필드를 직접 설정하려면 Job의 spec 필드에서 manualSelector: True를 지정해야 합니다.

예를 들어 kubectl get job my-job --output=yaml을 실행하면 포드가 생성한 선택기가 포함된 Job의 사양을 볼 수 있습니다.

kind: Job
metadata:
  name: my-job
...
spec:
  completions: 1
  parallelism: 1
  selector:
    matchLabels:
      controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
...

새 Job을 만들 때 manualSelector 값을 True로 설정한 다음 selector 필드의 job-uid 값을 다음과 같이 설정할 수 있습니다.

kind: Job
metadata:
  name: my-new-job
  ...
spec:
  manualSelector: true
  selector:
    matchLabels:
      job-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
  ...

my-new-job에 의해 생성된 포드는 이전 포드 UID를 사용합니다.

Job 검사

kubectl

Job의 상태를 검사하려면 다음 명령어를 실행하세요.

kubectl describe job my-job

완료된 Job에 의해 생성된 포드를 포함하여 클러스터의 모든 포드 리소스를 보려면 다음 명령어를 실행합니다

kubectl get pods -a

-a 플래그는 지정된 유형의 모든 리소스(이 경우에는 포드)가 표시되어야 한다고 지정합니다.

Console

kubectl을 사용하여 Job을 만든 후 다음 단계를 수행하여 Job을 검사할 수 있습니다.

  1. GCP Console에서 Google Kubernetes Engine 작업 부하 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 메뉴에서 원하는 작업 부하를 선택합니다.

다음과 같은 방법으로 Job을 검사할 수 있습니다.

  • Job의 라이브 구성을 보려면 YAML을 클릭합니다.
  • Job과 관련된 모든 이벤트를 보려면 이벤트를 클릭합니다.
  • Job의 업데이트 기록을 보려면 업데이트 기록을 클릭합니다.

Job 확장

kubectl

Job을 확장하려면 다음 명령어를 실행하세요.

kubectl scale job my-job --replicas=[VALUE]

kubectl scale로 인해 동시 실행 중인 포드의 수가 변경됩니다. 특히 parallelism 값은 지정한 [VALUE]로 변경됩니다.

Console

Job을 확장하려면 다음 단계를 수행합니다.

  1. GCP Console에서 Google Kubernetes Engine 작업 부하 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 메뉴에서 원하는 작업 부하를 선택합니다.

  3. 확장을 클릭합니다.

  4. 복제본 필드에 원하는 복제본 수를 입력합니다.

  5. 확장을 클릭합니다.

Job 삭제

Job이 완료되면 해당 Job은 포드 생성을 중지합니다. 완료될 때 Job API 객체가 제거되지 않으므로 상태를 볼 수 있습니다. Job이 생성하는 포드는 삭제되지 않지만 종료됩니다. 포드를 보관하면 로그를 보고 상호 작용할 수 있습니다.

kubectl

Job을 삭제하려면 다음 명령어를 실행하세요.

kubectl delete job my-job

Job을 삭제하면 Job의 모든 포드도 삭제됩니다.

Job은 삭제하되 Job의 포드는 보관하려면 --cascade false 플래그를 지정하세요.

kubectl delete jobs my-job --cascade false

Console

Job을 삭제하려면 다음 단계를 수행합니다.

  1. GCP Console에서 Google Kubernetes Engine 작업 부하 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 메뉴에서 원하는 작업 부하를 선택합니다.

  3. 삭제를 클릭합니다.

  4. 확인 대화상자 메뉴에서 삭제를 클릭합니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서