본문 바로가기
DevOps/Kubernetes

[Kubernetes] Rolling Update : 점진적 업데이트, 버전 관리

by Yoon_estar 2025. 2. 6.
728x90

Rolling Update : 점진적 업데이트

Kubernetes Deployment는 기본적으로 Rolling Update 전략을 사용하여 실행 중인 애플리케이션을 서비스 중단 없이 업데이트합니다.

 

Rolling Update 특징

  • 기존 Pod를 하나씩 대체하며 새로운 Pod를 배포합니다.
  • 애플리케이션의 가용성을 유지하며 트래픽을 처리할 수 있습니다.
  • 업데이트 중 에러가 발생하면 업데이트를 중단하고 이전 상태로 복구할 수 있습니다.

Rolling Update 적용

  • yaml 파일을 직접 수정하여 변경하는 방법
  • 기존 yaml 파일 정보 확인
# vi nginx-update.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-yaml-test
  labels:
    app: nginx
  annotations:
    kubernetes.io/change-cause: v.1.15
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15
        ports:
        - containerPort: 80
  • 1.15 버전에서 1.14 버전으로 버전 변경하기 + 적용하기
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-yaml-test
  labels:
    app: nginx
  annotations:
    kubernetes.io/change-cause: v.1.14
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80
# k apply -f nginx-update.yaml
deployment.apps/nginx-yaml-test configured
  • 파드 정상적으로 실행되는 것 확인
# k get po
nginx-yaml-test-56496f7bdd-7gj9z    1/1     Running   0          57s
nginx-yaml-test-56496f7bdd-mlclz    1/1     Running   0          57s
nginx-yaml-test-56496f7bdd-qbjnh    1/1     Running   0          57s
  • 파드 정보 확인(describe)
# k describe po nginx-yaml-test-847cd7fd69-nhxfj
```

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  60s   default-scheduler  Successfully assigned default/nginx-yaml-test-847cd7fd69-nhxfj to kubenode214
  Normal  Pulled     59s   kubelet            Container image "nginx:1.15" already present on machine
  Normal  Created    59s   kubelet            Created container nginx
  Normal  Started    59s   kubelet            Started container nginx

 

Rolling Update 적용

  • 기존 Deployment 생성: 아래 YAML 파일로 초기 Deployment를 생성했습니다.
# vi deployt-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  # Pod 개수
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14  # 초기 이미지
        ports:
        - containerPort: 80
# kubectl apply -f deploy-nginx.yaml
# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-847cd7fd69-9mnn6   1/1     Running   0          31s
nginx-deployment-847cd7fd69-mc5fp   1/1     Running   0          31s
nginx-deployment-847cd7fd69-pr4fn   1/1     Running   0          31s
  • 이미지 업데이트: 다음 명령으로 NGINX 버전을 1.15로 업데이트했습니다.
# kubectl set image deployment nginx-deployment nginx=nginx:1.15
  • Rolling Update 확인 : 업데이트 진행 중 새로운 Pod가 생성되고 기존 Pod가 하나씩 삭제되는 과정을 관찰했습니다.
# kubectl get pods --watch
NAME                                READY   STATUS    RESTARTS   AGE
deploy-nginx-554856776f-4nsm9       1/1     Running   0          24m
deploy-nginx-554856776f-d4k4w       1/1     Running   0          26m
deploy-nginx-554856776f-frbh4       1/1     Running   0          27m
deploy-nginx-554856776f-pv29v       1/1     Running   0          24m
nginx-deployment-847cd7fd69-9mnn6   1/1     Running   0          6m58s
nginx-deployment-847cd7fd69-mc5fp   1/1     Running   0          6m58s
nginx-deployment-847cd7fd69-pr4fn   1/1     Running   0          6m58s
webserver                           1/1     Running   0          4h2m

 

Rollback : 업데이트 복구

Rolling Update 중 문제가 발생하거나 이전 버전으로 복구가 필요할 경우 Kubernetes의 Rollback 기능을 사용할 수 있습니다.

  • 업데이트 내역 확인 : Deployment의 변경 이력을 확인합니다.
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         v.1.15
2         v.1.15
  • Rollback 실행 : 이전 버전으로 복구합니다.
# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
  • Rollback 확인 : 이전 버전으로 복구되었는지 확인합니다.
# kubectl get pods

 

Rollback 옵션 : 특정 Revision으로 롤백하기

  • 명령어 문법
    • deployment_name : 롤백하려는 Deployment 이름
    • revision_number : 롤백하고자하는 특정 Revision 번호
# kubectl rollout undo deployment <deployment_name> --to-revision=<revision_number>

 

  • Deployment 변경 이력 확인
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
2         v.1.15
3         v.1.15

 

  • 특정 Revision으로 롤백
# kubectl rollout undo deployment nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back

 

  • 롤백 결과 확인(롤백 후 Deployment와 관련된 Pod 상태를 확인)
# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
deploy-nginx-554856776f-4nsm9       1/1     Running             0          75m
deploy-nginx-554856776f-d4k4w       1/1     Running             0          77m
deploy-nginx-554856776f-frbh4       1/1     Running             0          78m
deploy-nginx-554856776f-pv29v       1/1     Running             0          75m
nginx-deployment-847cd7fd69-pr4fn   1/1     Running             0          58m
nginx-deployment-854bc88786-nfkq2   0/1     ContainerCreating   0          17s
nginx-deployment-854bc88786-r64pj   1/1     Running             0          36s
nginx-deployment-854bc88786-s524d   1/1     Running             0          37s
webserver                           1/1     Running             0          4h53m

 

  • Deployment의 현재 설정이 롤백된 Revision의 내용과 일치하는지 확인
# kubectl describe deployment nginx-deployment

```
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  58m    deployment-controller  Scaled up replica set nginx-deployment-847cd7fd69 to 3
  Normal  ScalingReplicaSet  7m43s  deployment-controller  Scaled up replica set nginx-deployment-854bc88786 to 1
  Normal  ScalingReplicaSet  7m26s  deployment-controller  Scaled down replica set nginx-deployment-854bc88786 to 0 from 1
  Normal  ScalingReplicaSet  77s    deployment-controller  Scaled up replica set nginx-deployment-854bc88786 to 1 from 0
  Normal  ScalingReplicaSet  76s    deployment-controller  Scaled down replica set nginx-deployment-847cd7fd69 to 2 from 3
  Normal  ScalingReplicaSet  76s    deployment-controller  Scaled up replica set nginx-deployment-854bc88786 to 2 from 1
  Normal  ScalingReplicaSet  57s    deployment-controller  Scaled down replica set nginx-deployment-847cd7fd69 to 1 from 2
  Normal  ScalingReplicaSet  57s    deployment-controller  Scaled up replica set nginx-deployment-854bc88786 to 3 from 2
  Normal  ScalingReplicaSet  38s    deployment-controller  Scaled down replica set nginx-deployment-847cd7fd69 to 0 from 1

 

  • 변경된 이력 확인
# kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
3         v.1.15
4         v.1.15