[K8S] 롤링업데이트

Hyun-Sung Kim·2025년 1월 5일

Kubernetes

목록 보기
11/24

Kubernetes에서 "롤링 업데이트"는 애플리케이션과 서비스를 중단 없이 점진적으로 업데이트하기 위한 방법입니다.
이는 기존 버전을 점진적으로 새 버전으로 교체함으로써 서비스의 가용성과 안정성을 유지하는 것이 주요 목적입니다.


배포 전략 별, 구성 요소

  • 롤링 업데이트
    - Kubernetes가 기본적으로 제공하는 기능만으로 구현이 가능
    - Deployment 리소스를 사용해 애플리케이션을 점진적으로 업데이트
  • Canary 배포
    - Kubernetes에서 자체적으로 지원되는 방식은 아님
  • Blue-Green 배포
    - Kubernetes에서 자체적으로 지원되는 방식은 아님

Rolling Update

  • 활용 사례 : Kubernetes가 제공하는 Rolling Update 방식을 그대로 적용하여 EKS의 제로 다운타임 배포 시나리오에 활용 가능

< 적용 방법론 >

  • 업데이트 단위 : Pod
  • Pod 인스턴스를 점진적으로 새로운 것으로 업데이트
  • 새로운 파드는 가용한 자원을 보유한 노드로 스케줄됨
  • 기본적으로, 업데이트가 이루어지는 동안 이용 불가한 파드의 최대 개수와 생성 가능한 새로운 파드의 최대 개수는 하나다.
  • 쿠버네티스에서, 업데이트는 버전으로 관리되고 어떠한 디플로이먼트 업데이트라도 이전의 (안정적인) 버전으로 원복이 가능
  • 서비스는 업데이트가 이루어지는 동안 오직 가용한 파드에게만 트래픽을 로드밸런스 함

<점검 point>
* Pod로 라우팅하는 NLB service의 TargetGroup이 재생성 되는 과정에서 연결 장애 유무

<절 차>

1) 현재 pod의 image 확인

kubectl get deploy
kubectl get pod
kubectl describe pods <pod명>

2) version2로 애플리케이션의 이미지 업데이트

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

3) update 확인

kubectl rollout status deployments/kubernetes-bootcamp
kubectl get pod
kubectl describe pods <pod명> => 이미지 field에서 이미지 버전 확인
kubectl describe services/kubernetes-bootcamp

4) Service 확인

kubectl get service

5) 노출된 Service의 IP와 port를 통해, curl로 접속

curl (svc ip):PORT => 매번 다른 pod로 loadbalancing됨

6) 업데이트 Rollback (옵션)

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

kubectl get deployments => deployment의 상태 확인
kubectl get pods

  • 마지막 workind 버전으로 deployment를 롤백하기 (옵션)

kubectl rollout undo deployments/kubernetes-bootcamp
kubectl get pods


deployment 재 시작

  • 네임스페이스만 지정하고 특정 배포는 지정하지 않으면 네임스페이스의 모든 배포가 다시 시작됩니다.

kubectl rollout restart deployment -n

  • 특정 배포를 지정하면 해당 배포 안의 pod들만 terminating 이후 다시 생성됩니다.

kubectl rollout restart deployment -n <deployment 이름>

  • 롤 아웃 진행 방식
    1) pod a, pod b
    2) pod a, pod a-1 생성, pod b
    3) pod a 삭제, pod a-1, pod b
    4) pod a-1, pod b, pod b-1 생성
    5) pod a-1, pod b 삭제, pod b-1 생성
    6) pod a-1, pod b-1

모든 Service 재 시작

  • 명령 구문

    kubectl get svc -n <네임스페이스 명> -o yaml | kubectl replace --force -f-

  • (적용 예)

Pod Scale out

  • 목표 : Deployment로 배포한 Pod의 갯수를 live하게 scale-out / scale-in 할 수 있다.
    * replicas 값을 '0'으로 설정하면, 운영 pod 개수를 0개로 떨어뜨리는 것이 가능하다.

kubectl get deployment -n live

kubectl scale deploy <deployment 이름> -n live --replicas=5 // pod 개수 scale out

kubectl rollout status deploy <deployment 이름> -n live // 디플로이먼트의 롤아웃 상태를 보기

kubectl get deployment -n live

profile
Cloud Engineer

0개의 댓글