앞에서 소개한 4개의 기본 오브젝트로 애플리케이션을 설정하고 배포하는 것이 가능한데 이를 조금 더 편리하게 관리하기 위해서 쿠버네티스는 컨트롤러라는 개념을 사용한다.
컨트롤러는 Replication Controller(aka RC), Replication Sec, DaemonSet, Job, StatefulSEt, Deployment들이 있다.
Replication Controller(이하 RC)는 Pod를 관리해주는 역할을 하는데 지정된 숫자로 Pod를 기동 시키고 관리하는 역할을 한다.
RC는 크게 3가지 파트로 구성되는데 Replica의 수, Pod Selector, Pod Template 3가지로 구성된다.
ReplicaSet은 Replication Controller의 새버전으로 생각하면 된다.
큰 차이는 없고 RC는 Equality 기반 Selector를 이용하는데 반해 Replica Set은 Set기반의 Selector를 이용한다.
Deployment는 Replication Controller와 Replica Set의 좀 더 상위 추상화 개념이다
실제 운영에서는 ReplicaSet이나 RC를 바로 사용하는 것보다 좀 더 추상화된 Deplyment를 사용하게 된다.
쿠버네티스에서 Deployment 없이 어떻게 배포를 하는지에 대해 이해를 하면 Deployment를 이해할 수 있다.
위와 같은 Pod와 RC가 있다 하자.
애플리케이션이 업데이트되서 새로운 버전으로 컨테이너를 굽고 이 컨테이너를 배포하는 시나리오에 대해 알아보자
여러가지 배포 전략이 있겠지만 많이 사용하는 블루/그린 배포와 롤링 업데이트 방식 두가지 방법에 대해서 설명한다.
만약 배포가 잘못되었을 경우 기존 RC의 replica 수를 원래대로 올리고 새버전의 replica 수를 0으로 만들어서 예전 버전의 Pod로 롤백이 가능하다.
이 과정은 kubectl rolling-update라는 명령으로 RC 단위 컨트롤이 가능하지만 그래도 여전히 작업이 필요하고 배포 과정을 모니터링 해야 한다.
그리고 가장 큰 문제는 kubectl rolling-update 명령은 클라이언트에서 실행 하는 명령으로 명령어 실행 중에 클라이언트의 연결이 끊어 지면 배포 작업이 비정상적으로 끊어질 수 있는 문제가 있다.
마지막으로 롤백 과정 역시 수동 컨트롤이 필요할 수 있다.
이러한 과정을 자동화하고 추상화한 개념이 Deployment라고 보면 된다.
Deployment는 Pod 배포를 위해서 RC를 생성하고 관리하는 역할을 하며 특히 롤백을 위한 기존 버전의 RC 관리 등 여러가지 기능을 포괄적으로 포함하고 있다.
RC, RS, Deployment는 웹서버와 같은 일반적인 워크로드에 대해 Pod를 관리하기 위한 컨트롤러이다.
실제 운영환경에서는 웹서버와 같은 일반적인 워크로드 이외에 데이타베이스, 배치작업, 데본서버와 같이 다양한 형태의 워크로드 모델이 존재하는데 이를 지원하기 위해 쿠버네티스는 다양한 컨트롤러를 제공함으로써 Pod의 운영을 다양한 시나리오에 맞게 지원하고 있다.
DaemonSet(이하 DS)은 Pod가 각각의 노드에서 하나씩만 돌게 하는 형태로 Pod를 관리하는 컨트롤러
워크로드 모델 중에서 배치나 한번 실행되고 끝나는 형태의 작업이 있을 수 있다.
이런 경우 웹서버 처럼 계속 Pod가 떠 있을 필요 없이 작업을 할 때만 Pod를 띄우면 된다.
이러한 형태의 워크로드 모델을 지원하는 컨트롤러를 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)"]
restartPolicy: Never
backoffLimit: 4
Job 컨트롤러에 의해서 실행되는 배치성 작업들에 대해 고려할 점 중 하나는 이런 배치성 작업을 메뉴얼로 실행하는 것이 아니라, 주기적으로 자동화해서 실행할 필요가 있는데, 이렇게 주기적으로 정해진 스케쥴에 따라 Job 컨트롤러에 의해 작업을 실행해주는 컨트롤러로 CronJob 컨트롤러가 있다.
cron jobs 컨트롤러는 Unix cron 명령어처럼, 시간에 따른 실행 조건을 정의해놓을 수 있고, 이에 따라 Job 컨트롤러를 실행하여 정의된 Pod를 실행할 수 있게 한다.
아래는 cron jobs 컨트롤러의 예제이다.
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
다른 점은 CronJob 스펙 설정 부분에 "schedule"이라는 항목이 있고 반복 조건을 unix cron과 같이 설정하면 된다.
schedule 작성법