작업 실행

이 페이지에서는 Google Kubernetes Engine(GKE)에서 작업을 실행하는 방법을 설명합니다.

개요

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

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

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

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

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

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

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

One of [--zone, --region] must be supplied: Please specify location 오류가 표시되면 이 섹션을 완료합니다.

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 영역 클러스터의 기본 Compute Engine 영역이나 리전 또는 Autopilot 클러스터의 리전을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project PROJECT_ID
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone COMPUTE_ZONE
  • Autopilot 또는 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region COMPUTE_REGION
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

작업 만들기

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

다음 예시는 작업 매니페스트를 보여줍니다.

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
  # of retries before marking as failed.
  backoffLimit: 4

config.yaml라는 파일에 매니페스트를 복사하고 작업을 만듭니다.

kubectl apply -f config.yaml

이 작업은 파이를 2,000자리까지 계산한 다음 출력합니다.

작업 객체의 유일한 요구사항은 pod template 필드를 필수항목으로 포함해야 한다는 것입니다.

작업 완료 횟수

작업은 특정 pod 개수가 성공적으로 종료될 때 완료됩니다. 기본적으로 pod가 1개인 비동시 작업은 pod가 성공적으로 종료되는 즉시 완료됩니다.

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

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

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

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

작업을 만듭니다.

kubectl apply -f config-2.yaml

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

동시 실행 관리

기본적으로 작업 pod는 동시에 실행되지 않습니다. 선택사항인 parallelism 필드는 지정된 시간에 작업에서 동시에 실행하길 원하는 최대 pod 수를 지정합니다.

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

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

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

작업을 만듭니다.

kubectl apply -f config-3.yaml

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

재시도 지정

기본적으로 작업이 실패하지 않는 한 중단되지 않고 실행되며 이때 작업은 backoffLimit를 따릅니다. backoffLimit 필드는 작업을 실패로 표시하기 전에 재시도 횟수를 지정합니다. 기본값은 6회입니다. 재시도 횟수는 전역적으로 적용하지 않고 pod별로 적용됩니다. 즉, 여러 pod가 실패하면(parallelism이 1보다 클 때) 단일 pod가 backoffLimit만큼 실패할 때까지 작업이 계속 실행됩니다. backoffLimit에 도달하면 작업이 실패로 표시되고 실행 중인 pod가 종료됩니다.

예를 들어 작업 예시에서는 재시도 횟수를 4로 설정합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: example-job
spec:
  template:
    metadata:
      name: example-job
    spec:
      containers:
      ...
  backoffLimit: 4

pod 교체

다음과 같은 시나리오에서 현재 pod가 실패한 것으로 간주되면 작업이 backoffLimit를 준수하는 pod를 다시 만듭니다.

  • Pod 컨테이너가 0이 아닌 오류 코드로 종료됩니다.
  • 노드가 재부팅되면 kubelet은 재부팅 후 pod를 Failed로 표시할 수 있습니다.

특정 시나리오에서 완료되지 않은 작업은 다음과 같이 backoffLimit를 고려하지 않고 pod를 교체합니다.

  • Pod를 수동으로 종료해도 pod 단계는 Failed로 설정되지 않습니다. 현재 pod의 종료 유예 기간이 완료되기 전에도 대체 pod를 만들 수 있습니다.
  • 노드가 드레이닝되면(수동으로 또는 자동 업그레이드 중) 드레이닝 유예 기간에 따라 pod가 종료되고 교체됩니다.
  • 노드가 삭제되면 pod는 가비지로 수집(삭제됨으로 표시됨)되어 교체됩니다.

기한 지정

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

기한은 작업이 일정 시간(초) 내에 작업을 성공적으로 완료해야 하고 그렇지 않으면 종료된다는 의미입니다. activeDeadlineSeconds 값은 작업의 startTime을 기준으로 하며 생성된 pod 수에 관계없이 작업의 기간에 적용됩니다.

기한을 지정하려면 매니페스트 파일에서 작업의 spec 필드에 activeDeadlineSeconds 값을 추가합니다. 예를 들어 다음 구성에는 작업이 성공적으로 완료되는 데 필요한 시간이 100초로 지정되어 있습니다.

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

작업이 기한 전에 성공적으로 완료되지 않으면 작업은 DeadlineExceeded 상태로 종료됩니다. 이로 인해 pod 생성이 중지되고 기존 pod가 삭제됩니다.

Pod 선택기 지정

작업의 pod 템플릿을 업데이트하되 작업의 현재 pod가 업데이트된 작업에서 실행되도록 하려면 수동으로 선택기를 지정하는 것이 좋습니다.

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

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

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

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

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

my-new-job에서 만든 pod는 이전 pod UID를 사용합니다.

작업 검사

kubectl

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

kubectl describe job my-job

완료된 작업에서 생성한 pod를 포함하여 클러스터의 모든 pod 리소스를 보려면 다음 명령어를 실행하세요.

kubectl get pods -a

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

Console

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

  1. Cloud Console에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 검사하려는 작업의 이름을 클릭합니다.

  3. 작업 세부정보 페이지에서 다음 중 아무거나 수행합니다.

    • 업데이트 기록 탭을 클릭하여 작업의 업데이트 기록을 확인합니다.
    • 이벤트 탭을 클릭하여 작업과 관련된 모든 이벤트를 확인합니다.
    • 로그 탭을 클릭하여 작업과 관련된 모든 컨테이너 로그를 확인합니다.
    • YAML 탭을 클릭하여 작업의 실시간 구성을 확인, 복사, 다운로드합니다.

작업 삭제

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

kubectl

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

kubectl delete job my-job

작업을 삭제하면 작업의 모든 pod도 삭제됩니다.

작업을 삭제하되 작업의 pod는 보관하려면 --cascade false 플래그를 지정하세요.

kubectl delete jobs my-job --cascade false

Console

작업을 삭제하려면 다음 단계를 수행하세요.

  1. Cloud Console에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 워크로드 목록에서 삭제하려는 작업을 하나 이상 선택합니다.

  3. 삭제를 클릭합니다.

  4. 확인 메시지가 나타나면 삭제를 클릭합니다.

다음 단계