[따배쿠] 10. Controller
( 참고 : 따배쿠 https://www.youtube.com/watch?v=6n5obRKsCRQ&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c )
Contents
- ReplicationController
- ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job
- CronJob
Controller란?
goal : Pod의 개수를 보장
Controller의 종류
1. ReplicationController
goal : 요구하는 pod의 개수를 보장하며, pod 집합의 실행을 안정적으로 유지
- 부족 시 ) template 이용해 pod 추가
- 초과 시 ) 최근에 생성된 pod 삭제
기본 구성
- 1) selector
- 2) replicas
- 3) template
동작 원리
YAML 파일
- controller는 label에 매치하는 pod를 3개 실행함
cat rc-nginx.yaml
- ReplicationController의 yaml 파일 확인
- replicas : 3 -> 3개를 보장!
replicas 수정하기
-
방법 1)
kubectl edit rc rc-nginx
-
방법 2)
kubectl scale rc rc-nginx --replicas=4
kubectl get replicationcontrollers
( = kubectl get rc
)
- 동작 중인 ReplicationController확인하기
kubectl describe rc rc-nginx
- 특정 rc를 보다 자세히 확인
참고 :
-
pod를 죽이면, 다시 만들어지지만
-
controller를 죽이면, pod도 같이 죽는다!
2. ReplicaSet
Replication Controller와 성격은 동일 ( pod의 개수 보장 )
차이점 : 보다 풍부한 selector 지원
3. Deployment
Deployment = ReplicaSet의 “부모” 역할
- ReplicaSet을 control함으로써 pod 수를 조절한다
- 목적 : Rolling Update & Rolling Back
kind
만 빼고, ReplicaSet과 그 형식이 전부 동일하다
kubectl create -f deploy-nginx.yaml
- deployment 컨트롤러를 실행한다
kubectl get deployments
- 작동 중인 deployments 확인하기
Rolling Update
-
서비스 운영 중에, application을 “점진적”으로 update하기
-
for “service 중단 없기” 위해!
( 고객은 update됨을 인지 못함 )
Rolling update
kubectl set image deployment <deploy_name> <container_name> <container_name>=<new_version_image>
Rolling back
kubectl rollout history deployment <deploy_name>
kubectl rollout undo deployment <deploy_name>
실습
(1) setting
kubectl create -f deployment-exam1.yaml --record
- (내용) name=app-deploy, replicas=3, images=nginx:1.14,
--record
: 업데이트 과정을 history로 기록하기 위해
kubectl get deployment, rs, pod, svc
(2) application Rolling Update
( 1.15, 1.16, 1.17 버전으로 차례로 업데이트 하기 )
kubectl set image deploy app-deploy web-nginx:1.15 --record
kubectl set image deploy app-deploy web-nginx:1.16 --record
kubectl set image deploy app-deploy web-nginx:1.17 --record
(3) controlling Rolling Update
kubectl rollout pause deploy app-deploy
- update 일시정지
kubectl rollout resume deploy app-deploy
- update 재시작
kubectl rollout status deploy app-deploy
- update 과정 확인하기!
(4) application Rolling Back
kubectl rollout history deployment app-deploy
- update history 확인하기
kubectl rollout undo deployment app-deploy --to-revision=3
- 특정 history (3번 revision)으로 돌아가기
kubectl rollout undo deployment app-deploy
- 가장 최근 (바로 직전) history로 돌아가기
기타 : apply vs create
- create : yaml 파일 안에 모든 것을 기술해야!
- apply : yaml 파일 안에 부분적인 spec만 주어져도 OK!
4. DaemonSet
- 전체 노드에서, Pod가 1개씩 실행되도록 보장
- ex) 로그 수입기, 모니터링 에이전트 등의 프로그램
ReplicaSet vs DaemonSet
-
DaemonSet에는
replicas
인자가 없음( 어차피 1개 보장하므로 )
kubectl create -f daemonset-exam.yaml
kubectl get daemonset
- daemonset 확인
kubectl get pods
- pod가 node별로 하나씩 잘 돌아가고 있음을 확인함
kubectl edit ds daemonset-nginx
- 편집모드로 들어가서, version 업데이트 함으로써 rolling update!
kubectl rollout undo daemonset daemonset-nginx
- 다시 직전 version으로 되돌리기
kubectl delete daemonsets.apps
( kubectl delete ds
)
5. StatefulSet
-
Pod의 상태를 유지해주는 controller
- pod의 상태 = “pod의 이름”, “pod의 볼륨”
-
pod의 이름이 random한 hash값이 아니라,
0,1,2 등 순차적으로 이름이 붙는다.
ReplicaSet vs StatefulSet
- serviceName & pod를 연결
kubectl create -f statefulset-exam.yaml
- statefulset 컨트롤러 생성 및 실행
kubectl delete pod sf-nginx-1
-
1번 pod 삭제 이후, 1번이 다시 생성됨
( replicas 3 유지하기 위해 다시 생성! )
kubectl scale statefulset sf-nginx --replicas=4
- 4번 생성됨
kubectl scale statefulset sf-nginx --replicas=2
- 3,4번 제거됨 ( 역순 )
마찬가지로, rolling update & rolling back 가능
kubectl edit statefulsets.apps sf-nginx
- 이 안에 edit 들어가서 수정함으로써 update
kubectl rollout undo statefulset sf-nginx
- 직전 버전으로 roll back 시키기
kubectl delete rc rc-nginx
- 제거하고 끝내기!
6. Job
- kubernetes는 pod를 running 중인 상태로 유지한다
- batch 처리하는 pod는, 작업이 완료되면 종료됨
- batch 처리에 적합한 controller로, “pod의 성공적인 완료”를 보장
- 성공 : 종료
- 실패 : 다시 시작
kubectl run testpod --image=centos:7 --command sleep 5
-
testpod가 실행될 것
-
컨테이너 내부에서, 5초간 sleep이 이루어진 뒤, 종료될 것
종료된 뒤, 재시작될 것!
Job definition
argument (field) 소개
completions
: 실행해야 할 job의 수가 몇 개 인지 ( 순차적으로 실행 )parallelism
: 병렬성 ( 동시 running되는 pod의 수 )activeDeadlineSeconds
: 지정 시간 내에 Job를 완료- 해당 시간 안에 못 끝내면, 강제로 완료시킴
restartPolicy
:restartPolicy : OnFailure
: container 비정상 종료 시, container를 restartrestartPolicy : Never
: container 비정상 종료 시, pod를 restart
kubectl create -f job-exam.yaml
-
job을 실행하기
-
50초 뒤에 종료될 것!
( 50초가 지나기 전에, 인위적으로 삭제를해보자. 그러면, 비정상적인 종료가 이루어진 것이므로, 다시 재생성될 것이다 )
-
정상적으로 끝나면 “종료”가 되는 것이지, “pod가 삭제되는 것은 아니다”
kubectl get job
- running 중인 job 확인하기
kubectl delete job.apps, centos-job
7. CronJob
- 사용자가 원하는 시간에 Job 실행 예약을 지원함
- linux의 cronjob의 스케줄링 기능을 Job Controller에 추가한 API
- 주기적으로 반복해서 실행해야 할 때!
- ex) data backup, send email
Cronjob Schedule : “0 3 1 * *”
해석 : 매월 1일 새벽3시에 정각에 해당 작업을 반복해줘~
- minutes ( 0 ~ 59 )
- hours ( 0 ~ 23 )
- day of the month ( 1 ~ 31 )
- month ( 1 ~ 12 )
- day of the week ( 0 ~ 6 )
또 다른 ex)
- 0 9 1 * * : 매월 1일 아침 9시에 ~
- 0 3 * * 0,6 : 주말에 새벽 3시에 ~
- */5 * * * * : 5분마다 한번 씩 실행
Job vs CronJob
- job template의 내용을, schedule에 적혀있는 주기대로 실행하라!
argument (field) 소개
concurrencyPolicy
:concurrencyPolicy : Allow
: 한 번에 여러 개의 job이 running해도 OKconcurrencyPolicy : Forbid
: 한 번에 여러 개의 job이 running하면 안됨! ( 한 번에 하나씩만! )
successfulJobsHistoryLimit
: 성공한 작업에 대한 history를 최근 n개까지만 남기기