본문 바로가기

IT Infra/Kubernetes

kubernetes 오브젝트 정리(2)

컨트롤러(Controller)-DaemonSet


Daemonset(DS)은 Pod가 각각의 노드에서 하나씩만 돌게 하는 형태로 Pod를 관리하는 컨트롤러이다.

아래 그림을 보면 조금 더 이해가 갈 수 있을 것이다.

Repilcation Controller(RC),ReplicaSet(RS) 이 두가지에 의해서 관리되는 Pod는 여러 노드들의 상황에 따라서 일반적으로 비균등 배포가 되지만, DS에 의해 관리되는 Pod는 모든 노드에 균등하게 하나씩만 배포 된다.

DS의 또 다른 특징은 특정 노드에만 Pod를 하나씩 배포 할 수 있도록 설정이 가능하다.

 

설정은 Pod의 “selector”와 라벨을 이용해서 특정 노드만을 선택할 수 있게 하면 된다.

컨트롤러(Controller)-Job


워크로드 모델 중에서 batch처럼 한번 실행되고 끝나는 형태의 작업이 있을 수 있다.

예를 들어 주기적으로 배치작업을 하는 경우에는 웹서버 처럼 계속 Pod가 실행될 필요없이 작업을 할 때만 Pod를 띄우는게 더 효율적이다.

이러한 형태를 지원하는 컨트롤러를 Job이라고 한다.

Job에 의해서 실행되는 Pod는 Job이 종료되면 Pod를 같이 종료한다.

Job을 YAML로 정의할 때는 보통 아래와 같이 컨테이너 스팩 부분에 image뿐만 아니라, 컨테이너에서 Job을 수행하기 위한 command를 같이 입력한다.

apiVersion: batch/v1
kind: Job
metadata:
	name: pi
spec:
	template:
		spec:
			containers:
				-name: pi
				 image: perl
				 command: ["perl", "-Mbignum=bpi","-wle","print bpi(2000)"
			restartPolicy: Never
backoffLimit: 4 

 

Job 컨트롤러에 의해서 실행된 Pod는 이 command의 실행결과에 따라서 Job이 실패한지 성공한지 판단한다. Job이 종료가 되었음에도 불구하고 결과가 실패라면, Job을 재 실행할지 또는 그냥 끝낼지를 설정에 따라서 결정 가능하다.

 

그럼 만약에 Job이 끝나기 전에 비정상적으로 종료가 된다면..?

아래 그림과 같이 특정 노드에 장애가 났다고 가정을 하면, RC와 RS에 의해서 관리되고있는 Pod는 자동으로 다른 노드에서 생성되어 시작될 것이고, 컨트롤러에 의해서 관리되지 않는 Pod는 다른 노드에 생성되어지지 않고 사라질 것이다.

Job에 의해서 관리되는 Pod는 두가지 방법으로 설정해서 관리할 수 있는데, 장애가 발생할 때 다시시작하게 하거나 다시시작하지 않게 설정할 수 있다.

다시시작의 개념은 작업의 상태가 보장되는 것이 아니라 완전히 처음부터 작업이 재시작되는 것이기 때문에 restart의 개념임을 잘 알아야한다.

batch작업의 경우 작업을 한번만 실행할 수도 있지만, 같은 작업을 연속해서 여러번 수행하는 경우도 있다.(데이터가 클 경우 범위를 나눠서 작업하는 경우) 이런 경우를 위해서 Job 컨트롤러는 같은 Pod를 순차적으로 여러번 실행할 수 있도록 설정이 가능하다. Job 컨트롤러 설정에서 completion에 횟수를 주면 같은 작업을 completion 횟수만큼 순차적으로 반복하게 된다. 아래의 그림을 보면 조금 더 쉽게 이해할 수 있다.

또 여러 작업을 처리해야 하지만 순차성이 필요없고 병렬로 처리를 하고 싶다면, Job설정에서 parallelism에 동시 실행할 수 있는 Pod의 수를 주면 , 지정된 수 만큼 Pod를 실행하여 completion 횟수를 병렬로 처리한다.

아래 그림은 completion이 5, parallelism이 2일 때, 하나의 노드에서 모든 Pod가 실행된다고 가정했을 때, 아래 그림과 같이 실행된다.

컨트롤러(Controller)-Cron Jobs


Cron Jobs는 주기적으로 정해진 스케쥴에 따라 Job 컨트롤러에 의해 작업을 실행해주는 컨트롤러이다.

Cron Jobs 컨트롤러는 Unix 명령어처럼, 시간에 따른 실행조건을 정의해놓을 수 있고, 이에 따라 Job 컨트롤러를 실행하여, 정의된 Pod를 실행할 수 있게 한다.

아래는 Cron Jobs 컨트롤러의 YAML인데, Job 컨트롤러와 설정이 크게 다르지 않다.

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

다른 점이 있다면 Cron Jobs 스펙 설정 부분에 “schedule”이라는 항목이 있고 반복 조건을 unix cron과 같이 설정하는 점이 있다.

 

 

참조: 조대협님 블로그(https://bcho.tistory.com/)

'IT Infra > Kubernetes' 카테고리의 다른 글

쿠버네티스 구성요소  (0) 2022.02.22
kubeconfig에 대해서  (0) 2022.02.07
HPA(HorizontalPodAutoscaler)  (0) 2022.01.06
kubernetes 오브젝트 정리(1)  (0) 2022.01.03