Cloud_Park 2020. 1. 7. 17:40

 

  • 컨트롤러

 

고급 컨트롤러 RC,RS,Deployment는 웹 서버와 같은 일반적인 워크로드에 대해 Pod를 관리하기 위한 컨트롤이다. 실제 운영환경에서는 웹서버와 같은 일반적인 워크로드이외에  데이터베이스, 배치작업, 데몬서버와 같이 다양한 형태의 워크로드 모델이 존재하는데 이를 지원하기 위해서 쿠버네티스는 다양한 컨트롤러를 제공합으로써 pod운영을 다양한 시나리오에 맞게 지원하고 있다.

 

DaemonSet

DS는  pod가 각각의 노드에서 하나씩 돌게하는 형태로 pod를 관리하는 컨트롤이다.

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

이러한 형태의 워크로드는 서버의 모니터링이나 로그 수집용도로 많이 사용되는데, DS의 다른 특징중 하나는, 특정 Node들에게만 Pod가 하나씩만 배포되도록 설정 가능하다.

앞에서 언급한 로그나 모니터링 시나리오에서 특정 장비에 대한 모니터링을 하고자 할 때  이런 시나리오가 유효하다. 예를들어 특정 장비(노드)에만  ssd를 사용하거나 gpu를 사용할 경우에는 그 장비가 설치된 노드만을 모니터링하면 된다.

DS는 특정 노드에만 pod를 배포할 수 있도록 pod의 "node selector" 라벨을 이용하여 특정 노드만 선택가능하게 한다.

 

Job

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

예를 들어 원타임으로 파일 변환작업을 하거나, 또는 주기적으로 ETL 배치작업을 하는 경우에는 웹서버처럼 계속 Pod가 떠 있을 필요없이 작업을 할때만 Pod를 올린다.

이러한 형태의 워크로드 모델을 지원한느 컨트롤러를 Job

job에 의해서 관리되는 Pod는 Job이 종료되면 pod를  같이 종료한다.

정의할때 컨테이너 스펙부분에 Image뿐만아니라 job을 수행하기 위한 커맨드를 같이 입력한다.

 

apiVersion: batch/v1   //버전

kind: Job               //종류

metadata:            //메타데이터 설정

 name: pi

spec:

 template:           //템플릿 설정

  spec:

   containers:

   - name: pi

    image: perl       //이미지 설정

    command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]   //커멘트라인

    restartPoicy: Never

 backoffLimit: 4

 

**띄어쓰기를 확인해주세요**

job컨트롤러에 의해서 실행된 pod는 이command의 실행결과에 따라서 job이 실패한건지 성공인건지 판단한다. 

job이 끝나기 전에 만약 비정상적으로 종료되었다면 어떻게될까?

 

위 그림을 보면 쿠버네티스 클러스터에서  특정 노드가 장애가 났다고 가정하자, RC/RS에 의해  관리되고 있는 Pod는 자동으로 다른 노드에서 다시 자동으로 생성되서 시작될 것이고, 컨트롤러에 의해 관리되고 있지않은 Pod는 다시

다른 노드에서 기동되지 않고 사라질 것이다.

 

job에 의해서 관리되는 Pod는 어떻게 될것인가?

장애시  다시 시작하거나 , 다시 시작하지 않게 한다. 

다시 시작개념은 작업의 상태가 보장되는 것이 아닌  다시 처음부터 작업이 재 시작되는 것이기 떄문에 resume이 아닌 restart의 개념임을 알아야하고, 다시 시작 처음부터 작업을 시작하더라도 데이터가 겹치거나 문제가 없는 형태여야한다.

배치 작업의 경우 작업을 한번만 실행할 수 도 있지만 , 같은 작업을 연속해서 여러번 수행하는 경우가 있다. (데이터가 클경우 범위를 나워서 작업하는 경우)를 위해 job컨트롤러는 같은 pod를 순차적으로, 여러번 실행할 수 있도록 설정이 가능하다.

job설정에서 completion 횟수를 주면, 같은 작업을 completion 횟수만큼 순차적으로 반복한다.

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

아래그림은 completion이 5, parallelism이 2 일때 , 하나의 노드에서 모든 pod가 실행된다고 가정햇을때 , 실행 순서를 보여주는 그림이다.

 

 

Cron Jobs

job 컨트롤러에 의해서 실행되는 배치성 작업들에 대해서 고려할 점중 하나는 이런 배치성 작업을 메뉴얼로 실행하는 것이 아니라, 주기적으로 자동화해서  실행할 필요가 있는데, 이렇게 주기적으로 정해진 스케줄에 따라 job컨트롤러에 의해

작업을 실행시켜주는 컨트롤러로 cron job 컨트롤러가 있다.

unix cron 명령어 처럼  시간에 따른 실행조건을 정의해 좋을 수 있고 , 이에 따라 job 컨트롤러를 실행하여, 정의된 pod를 실행할 수 있게 합니다.

 

apiVersion: batch/v1beta1

kind: CronJob

metadata:

 name: hello

spec:

 schedule:

 jobTemplate:

  spec:

   template:

    spec:

     containers:

      - name: hello

       image: busybox

       args:

       - /bin/sh

       - -c

       - date;echo Hello 1234

      restartPolicy: OnFailure

 

다른 점은 CronJob 스펙 설정 부분에 "schedule"라는 항목이 있고 반복문 조건을 unix cron처럼 설정가능하다.

 

 

 

 

 

StatefulSet

RC/RS나 다른 컨트롤러로는  데이터베이스와 같이 상태를 가지는 애플리케이션을 관리하기 어렵다.

데이터페비스등과 같이 상태를 가지고 있는 pod를 지원하기위해서 statefulSet이 나왔다.   

 

 

 

 

위 내용은 https://bcho.tistory.com/1257?category=731548에서 참고하였습니다 .