Computing

Pod 배포 - 워크로드 리소스 (2) (Daemonset, Job, Cronjob) 본문

Cloud/Kubernetes

Pod 배포 - 워크로드 리소스 (2) (Daemonset, Job, Cronjob)

jhson989 2022. 12. 7. 23:33

이전 글

Pod 배포 - 워크로드 리소스 (1) (Replicaset, Deployment)

 

이전 글에서 Pod를 자동으로 실행시키기 위한 워크로드 리소스들 중 Replicaset과 Deployment에 대하여 정리하였다. 워크로드 리소스는 개발자를 대신하여 파드 집합을 관리하는 쿠버네티스 객체로 사용자가 Pod가 어떻게 실행되어야 하는 지 명시해 둔 것이다. 쿠버네티스는 이 리소스를 기반으로 Pod를 실행&제거한다. 이번 포스터에서는 Daemonset(데몬셋), Job(잡), Cronjob(크론잡) 워크로드 리소스에 대해서 정리하고자 한다.

 

Fig 1. Kubernetes 로고[1]

 

간단히 정리하자면

- 데몬셋: 모든 노드에서 파드가 정확히 하나씩 실행되도록 명시한 워크로드 리소스

- 잡: 파드(들)가 한번만 문제 없이 실행되도록 명시한 워크로드 리소스

- 크론잡: 일정 시간마다 반복적으로 파드(들)가 문제 없이 실행되도록 명시한 워크로드 리소스

 

 

 

Daemonset 데몬셋

데몬셋 모든 노드에 파드를 실행하도록 배치하는 워크로드 리소스[2]이다. (설정에 따라서 조건에 맞는 일부 노드에서만 실행 가능하기도 하다) 노드가 쿠버네티스 클러스터에 추가되면 데몬셋에 의해 해당 노드에도 파드 복제본을 실행시킨다. 노드가 클러스터에서 제거되면 해당 파드는 가비지로 수집되어 제거된다. 

 

데몬셋은 모든 노드에 파드를 무조건 실행시키도록 하는 리소스이기에 노드 운영 및 노드 데이터 수집의 목적으로 주로 사용된다.  대표적으로 모든 노드에서 실행되는 클러스터 스토리지 데몬, 모든 노드에서 실행되는 로그 수집 데몬, 모든 노드에서 실행되는 노드 모니터링 데몬이 있다. 세 경우 모두 모든 노드에서 실행되어야 하는 애플리케이션이다.

 

Fig 2. Deployment와 Daemonset 비교

 

Fig 2.는 디플로이먼트와 데몬셋을 비교한 그림이다. 레플리카셋과 디플로이먼트에서는 파드가 효율적으로 실행될 수 있는 노드 어디서나 랜덤하게 실행되도록 스케쥴링된다. 디플로이먼트를 이용해서 배포되는 파드들은 어떤 노드에서나 실행되어도 되는 stateless 로직을 담고 있다. 그에 따라 노드에 상관없이 특정 개수의 파드들이 효율적으로 실행될 수 있는 노드들을 선택하기만 하면 된다. (다만 사용자의 필요에 따라 어피니티들을 설정해서 완전히 랜덤한 노드에 스케쥴링되지 않게 할 수도 있다)

 

그에 비해 데몬셋은 모든 노드마다 정확히 하나의 파드가 수행되는 게 중요하다. (무조건 노드 수만큼 생성시켜야 하기에 몇개의 파드를 생성시킬 지 정보도 필요없다.) 예를 들면 Ceph, Lustre 같은 분산 스토리지 시스템은 최대한 많은 노드들에 분산되어 운영되는 게 중요하다. 따라서 데몬셋을 통해 모든 노드들에 분산 스토리지 시스템의 데몬이 실행되도록 구성하면 좋다. 혹은 노드 성능 모니터링 애플리케이션도 데몬셋을 사용해야 좋은 워크로드 중 하나일 것이다.

 

필요에 따라서 특정 노드만 지정해서 데몬셋을 실행할 수 있다. 데몬셋 yaml file에서 [nodeSelector] 속성에 조건 레이블을 명시하면(ex, disk:ssd), 그 레이블에 해당하는 노드에서만 실행된다. 예를 들어 ssd를 disk로 사용하는 노드들에서만 실행시켜야 하는 워크로드일 경우, disk:ssd 값을 node-selector에 추가하면 ssd를 disk로 사용하는 노드에서만 데몬셋에 의해 파드들이 실행된다.

 

 

 

Job 잡

잡 워크로드 리소스는 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 배포한다[3]. 성공적으로 종료된 파드 개수를 기록하며 성공적으로 종료된 파드의 개수가 지정된 수가 될때까지 파드를 계속 배포한다. 잡에 의해 배포된 파드가 에러에 의해 종료될 경우 새로운 파드를 생성하여 실행시킨다. 

 

쉽게 말하자면 파드를 정해진 수만큼 실행시키는 워크로드 리소스이다. 단순히 파드만을 실행시키는 것과 다른 점은 잡을 통해 배포된 파드는 성공이 보장된다는 것이다. pod.yaml을 만들어 pod를 직접 실행시킨 경우, 파드의 실행은 보장되지만 파드가 성공적으로 종료되었는 지는 보장하지 않는다. 그에 비해 잡을 통해 파드를 실행시키면 원하는 횟수만큼 파드가 실행될 뿐만 아니라, 그 파드가 성공적으로 종료되었다는 것을 보장할 수 있다. (잡을 통해 배포된 파드는 실패 시 잡에 의해 다시 실행되기 때문)

 

디플로이먼트나 데몬셋과 같은 리소스들은 리소스가 종료될 때까지 파드를 계속해서 배포한다. 파드가 성공적으로 혹은 에러에 의해 종료되더다도 리소스가 살아있는 한 계속 배포한다. 그에 비해 잡은 반복적으로 실행되는 파드들이 아닌, 정해진 횟수만큼 수행되어야 할 파드 실행에 사용되는 워크로드 리소스이다. 테스트 프로그램이나 백업 프로그램 등 개발자가 임의로 실행시키고 싶을 때 사용한다.

 

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      completions: 5
      parallelism: 2
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]

 

위 코드는 Job 생성을 위한 yaml 파일 예시로 파이의 2000자리까지 계산해서 출력하는 파드를 5번(completions) 실행한다. 이때 파드들이 최대 몇개까지 동시에 실행될 수 있는 지, 그 병렬성을 parallelism 속성을 통해 설정할 수 있다. 위 잡은 최대 2대의 파드들을 동시에 실행시킨다. 5개의 파드가 성공적으로 종료되면 위 잡은 종료된다.

 

 

 

Cronjob 크론잡

크론잡은 정해진 시간에 반복적으로 파드를 배포하는 워크로드 리소스[4]이다. 리눅스 크론탭과 같은 역할을 수행하는 리소스로 정해진 시간이 되면 정해진 잡(=파드 배포)을 한다. 크론잡은 백업, 리포트 생성 등의 정기적 작업을 수행하기 위해 사용된다. 각 작업은 무기한 반복되도록 구성해야 한다(예: 1일/1주/1달마다 1회).

 

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

 

위 코드는 크론잡을 생성하는 yaml 파일 예시이다. 위 크론잡은 현재 시간과 hello 메세지를 1분마다 출력한다. 크론잡에서 파드 배포 기준이 되는 시간은 kube-controller-manager의 시간대를 기준으로 한다. schedule 속성을 통해 반복되는 시간을 표현하는데 다음 Fig 3.과 같다. 위 [* * * * *]는 매분 매시 매일 매월 매요일 반복한다는 의미이다. 

 

Fig 3. Cronjob 문법 [4]

 

예시 1: [0 0 * * 0]는 매주 일요일 자정에 실행

예시 2: [0 0 13 * 5]는 매월 금요일 0시 0분 혹은 매월 13일 0시 0분에 실행

 

 

 

Reference

[1] https://kubernetes.io/ko/

[2] https://kubernetes.io/ko/docs/concepts/workloads/controllers/daemonset/

[3] https://kubernetes.io/ko/docs/concepts/workloads/controllers/job/

[4] https://kubernetes.io/ko/docs/concepts/workloads/controllers/cron-jobs/