K8S Controller인 RC, RS, Deployment 등은 웹 서버와 같은 일반적인 워크로드에 대해 Pod를 관리하기 위한 컨트롤러이다. Pod들을 서버, 데이터베이스, 배치 작업, 데몬 서버와 같이 다양한 형태의 존재하는데 이를 지원하기위한 컨트롤러이다.
파드들의 개수들을 조절하기 위해서 사용하는 컨트롤러이다. rc로 축약되서 사용되며 kubectl 명령에서 숏컷으로 사용된다.
rc.yaml
apiVersion: v1
kind: ReplicationController # rc 선언
metadata:
name: rc-nginx
spec:
replicas: 3 # pod의 개수 3개
selector:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
# nginx-pod를 3개로 유지하는 yaml 파일
kubectl create -f rc.yaml
이렇게 pod 3개가 생성된다. 생성된 pod는 컨트롤러를 삭제하지 않는 이상 계속 유지된다.
$ kubectl delete pod --all
pod 전체 삭제 명령어를 입력하자마자 새로 3개의 pod가 생성되는 것을 볼 수 있다.
RS는 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이며 RC와 매우 유사하다. 지정된 수의 파드 레플리카가 항상 실행되도록 보장한다. 하지만 사용자 지정 오케스트레이션이 필요하거나 업데이트가 전혀 필요하지 않은 경우라면 RS를 사용하기보다는 Deployment를 사용하는 것이 권장된다.
rs.yaml
apiVersion: apps/v1
kind: ReplicaSet # rs 선언
metadata:
name: rs-nginx
spec:
replicas: 3 # pod 3개 유지
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
$ kubectl create -f rs.yaml
이 역시 pod가 3개가 유지되는 것을 볼 수 있다.
Deployment는 파드와 RS(ReplicaSet)에 대한 선언적 업데이트를 제공한다.
Deployment에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디폴리이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
Job으로 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도한다. 파드가 성공적으로 완료되면, 성공적으로 완료된 job을 추적한다. 지정된 수의 성공 완료에 도달하면, 작업이 완료된다. job을 삭제하면 해당 job이 생성한 파드가 정리되고 job을 일시 중지하면 작업이 다시 재개될 때까지 활성 파드가 생성된다.
job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
completions: 5 # 실행할 작업의 개수
parallelism: 2 # 동시에 실행할 pod 개수
activeDeadlineSeconds: 25
template:
spec:
containers:
- name: centos-container
image: centos:8
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 5; echo 'Bye'"
restartPolicy: Never
backoffLimit: 3
# 코드 설명
# args에 있는 작업이 완료되면 Pod는 Completed가 되면서 작업을 종료하게 된다.
# 그렇기 때문에 해당 코드는 pod를 2개씩 생성하며 생성뒤 5초가 지나면 작업이 종료되고
# 다시 2개가 실행되고 종료된 후 마지막 1개가 실행되는 yaml 코드이다.
작업이 종료된 5개의 pod들
크론잡은 리눅스 명령어인 cron과 매우 유사한 컨트롤러이다.
크론잡은 백업 실행 또는 이메일 전송과 같은 정기적이고 반복적인 작업을 만드는데 유용하다. 또한 크론잡은 클러스터가 유휴 상태일 때 job을 스케줄링하는 것과 같이 특정 시간 동안의 개별 작업을 스케줄할 수 있다.
cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *" # 매분마다 실행
startingDeadlineSeconds: 500 # 500초가 지나도 실행이안되면 삭제
concurrencyPolicy: Forbid # 동시실행 금지
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 10; echo Bye
restartPolicy: Never
$ kubectl create -f cronjob.yaml
해당 명령어는 1분마다 실행되며 sleep 10 명령어가 종료된 후 종료된다.