본문 바로가기
INFRA/Operation

쿠버네티스 이론 STEP9 Controller&Rolling Update

by BTC_뚜벅이 2022. 9. 14.

ABTCEFG♪  안녕하세요, 여러분!
 
BTC_뚜벅이입니다.

지난 주 RBAC에 이어 이번 주는 Controller와 Rolling update에 대해 간략하게 알아보고 

Rolling Update와 RollBack에 대해 간단한 실습도 해볼게요.

 

1. Controller


집에 냉장고를 생각해볼까요? 
현재 냉장온도는 3도, 우리는 이 온도를 4도로 올리고 싶어서 냉장고 온도를 1도 높였습니다.
여기서 현재 상태는 3도, 바라는 상태는 4도라고 할 수 있습니다.
이에 따라 현재 상태와 바라는 상태가 동일해지도록 냉장고는 작업을 수행합니다.
이 개념을 쿠버네티스에 적용한 개념이 컨트롤러입니다.
쿠버네티스의 컨트롤러의 동작 원리는 컨트롤 루프를 지속적으로 돌면서 특정 리소스를 관찰합니다.
특정 리소스를 계속적으로 바라보며 현재 상태와 바라는 상태를 동일하게 맞춰주는 작업을 수행하게 되는데요.
이러한 역할을 수행하는 컨트롤러들이 다양하게 존재하며 저마다 정해진 작업이 다릅니다.
컨트롤러의 종류로 Replicaset, Deployment, DaemonSet, StatefulSet, Job&CronJob이 있습니다.
오늘 우리가 살펴볼 컨트롤러는 Deployment입니다.
실습을 하기에 앞서 RollingUpdate에 대한 개념도 간략하게 짚고 넘어갈게요.

 

2. RollingUpdate


롤링 업데이트는 무중단 배포입니다.
pod instance를 점진적으로 새로운 것으로 업데이트하여 디플로이먼트 업데이트가 서비스 중단 없이 이루어질 수 있도록 해줍니다.
이 때 새로운 pod는 가용한 자원을 보유한 노드로 스케줄이 됩니다.
쿠버네티스로 업데이트는 버전으로 관리되고 어떠한 디플로이먼트 업데이트라도 이전의 버전으로 원복이 가능합니다.
이 때 서비스는 업데이트가 이루어지는동안 가용한 파드에게만 트래픽을 받도록 로드밸런서의 역할도 합니다.

 

3. 실습


3-1. RollingUpdate 

# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1
spec: 
  replicas: 10
  selector:
    matchLabels:
      run: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 30%
      maxSurge: 30%
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.22.0


yaml 파일에서 RollingUpdate의 설정값을 직접 조절할 수 있습니다.

spec.strategy.rollingUpdate.maxUnavailable은 10개의 Replica에서 30%인 3개의 Pod가 일시중단 될 수 있음을 허용합니다.
spec.strategy.rollingUpdate.maxSurge는 10개의 Replica에서 30%인 3개의 새로운 Pod가 초과할 수 있도록 허용하여 최대 13개까지 생성 될 수 있습니다.
위 2가지는 RollingUpdate인 경우에만 사용할 수 있습니다.

kubectl apply --record -f deploy.yaml # history 남길 수 있음
kubectl get deploy
kubectl get rs
kubectl get pod
kubectl set image deploy deploy1 nginx=nginx:1.23.0 --record
kubectl get pod --watch
kubectl rollout status deploy deploy1
kubectl get pod -o yaml |grep "image: nginx"

deploy.yaml 파일을 apply 후 조회

 

RollingUpdate 과정

 

nginx:1.22.0에서 nginx:1.23.0으로 업데이트 된 것을 확인

 

3-2. RollBack

kubectl set image deploy deploy1 nginx=nginx:1.23.2 --record
kubectl get pod --watch
kubectl rollout history deploy deploy1
kubectl rollout undo deploy deploy1 # kubectl rollout undo deploy deploy1 --to-revision=2와 같은 의미
kubectl rollout history deploy deploy1

 

존재하지 않는 이미지 버전으로 에러발생

 

deployment - deploy1의 rollout history 확인, 여기서 undo를 하면 2번이 실행됨

 

rollout undo를 실행하여 nginx:1.23.0이 최신 history로 올라온 것 확인

 

 

댓글