[따배쿠] 10. Controller

( 참고 : 따배쿠 https://www.youtube.com/watch?v=6n5obRKsCRQ&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c )


Contents

  1. ReplicationController
  2. ReplicaSet
  3. Deployment
  4. DaemonSet
  5. StatefulSet
  6. Job
  7. CronJob


Controller란?

goal : Pod의 개수를 보장


Controller의 종류

figure2


1. ReplicationController

goal : 요구하는 pod의 개수를 보장하며, pod 집합의 실행을 안정적으로 유지

  • 부족 시 ) template 이용해 pod 추가
  • 초과 시 ) 최근에 생성된 pod 삭제


기본 구성

  • 1) selector
  • 2) replicas
  • 3) template


figure2


동작 원리

figure2


YAML 파일

figure2

  • 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 지원

figure2

figure2

figure2


3. Deployment

Deployment = ReplicaSet의 “부모” 역할

  • ReplicaSet을 control함으로써 pod 수를 조절한다
  • 목적 : Rolling Update & Rolling Back

figure2


figure2

  • 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>


figure2


실습

(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) 로그 수입기, 모니터링 에이전트 등의 프로그램

figure2


ReplicaSet vs DaemonSet

  • DaemonSet에는 replicas인자가 없음

    ( 어차피 1개 보장하므로 )

figure2


kubectl create -f daemonset-exam.yaml

  • figure2


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 등 순차적으로 이름이 붙는다.

figure2


ReplicaSet vs StatefulSet

  • serviceName & pod를 연결

figure2


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의 성공적인 완료”를 보장
    • 성공 : 종료
    • 실패 : 다시 시작


figure2


kubectl run testpod --image=centos:7 --command sleep 5

  • testpod가 실행될 것

  • 컨테이너 내부에서, 5초간 sleep이 이루어진 뒤, 종료될 것

    종료된 뒤, 재시작될 것!

figure2


Job definition

figure2


argument (field) 소개

  • completions : 실행해야 할 job의 수가 몇 개 인지 ( 순차적으로 실행 )
  • parallelism : 병렬성 ( 동시 running되는 pod의 수 )
  • activeDeadlineSeconds : 지정 시간 내에 Job를 완료
    • 해당 시간 안에 못 끝내면, 강제로 완료시킴
  • restartPolicy :
    • restartPolicy : OnFailure : container 비정상 종료 시, container를 restart
    • restartPolicy : 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에 적혀있는 주기대로 실행하라!

figure2


argument (field) 소개

  • concurrencyPolicy :
    • concurrencyPolicy : Allow : 한 번에 여러 개의 job이 running해도 OK
    • concurrencyPolicy : Forbid : 한 번에 여러 개의 job이 running하면 안됨! ( 한 번에 하나씩만! )
  • successfulJobsHistoryLimit : 성공한 작업에 대한 history를 최근 n개까지만 남기기