본문 바로가기

K8S

쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 롤백 & 상태

728x90

■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 롤백 개요

  • 디플로이먼트가 지속적인 충돌로 안정적이지 않은 경우 롤백이 가능하다. 모든 디플로이먼트의 롤-아웃 기록은 시스템에 남아 있어 언제든지 롤백이 가능하다. 
  • 디플로이먼트 수정 버전은 디플로이먼트 파드 템플릿(.spec.template)이 변경되는 경우에만 새로운 수정 버전이 생성된다. 예를 들면 템플릿 레이블 또는 컨테이너 이미지와 같은 변경을 의미 한다.
  • 디플로이먼트의 버전관리는 기본적으로 10개 까지 가능하며 해당 항목은 `.spec.revisionHistoryLimit` 필드 설정을 통해 변경할 수 있으며, 0으로 설정하게 되면 디플로이먼트의 기록을 모두 초기화 하기 때문에 롤백을 할 수 없다.
  • 일시 중지된 디플로이먼트를 다시 재개할 때 까지 롤백할 수 없다.

 

■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 롤백 수행

  • 잘못된 업데이트 수행 실행을 통한 의도적 오류 발생
    - kubectl set image deployment/nginx-deployment nginx=nginx:1.161
  • 오류로 인한 롤-아웃 고착상태 확인
    - kubectl rollout status deployment/nginx-deployment
    - 롤-아웃이 진행되는 문구가 출력되지만 잘못된 nginx 버전으로 인해 정상적으로 이미지 다운로드가 되지 않아, 디플로이먼트가 고착 상태에 들어가게 된다 
  • 레플리카셋 상태 확인
    - `kubectl get rs`
    - 이전 레플리카와 새로운 레플리카셋이 생성된 것을 확인 할 수 있다. 
  • 파드 정보 확인 
    - `kubectl get pod`
    - 생성된 파드를 확인해보면 새로운 레플리카셋에 생성된 1개의 파드가 이미지 풀 루프 (Image full Loop) 상태에 고착 된 것을 확인 할 수 있다. 
    - 디플로이먼트 컨트롤러가 롤-아웃을 자동으로 중지하고 새로운 레플리카셋의 스케일 업을 중지한다. 
  • 디플로이먼트 상태 확인
    - `kubectl describe depolyment`
    - 결과값의 OldReplicaSets와 NewReplicaSets 항목을 통해 이전/신규 레플라카 정보와 아래 Event 항목을 통해 레플리카셋이 Up/Down 이벤트가 발생한 것을 확인 할 수 있다.
  • 디플로이먼트 롤-아웃 기록 확인
    - `kubectl rollout history deployment/nginx-deployment`
    - REVISION 정보와 CHANGE-CAUSE 결과값을 리턴한다. revision가 버전 정보를 나타내고, change-cause 변경 사유를 나타낸다. change-cause 정보는 kubernetes.io/change-cause에서 복사 한다. 
    - `kubectl rollout history deployment/nginx-deployment --revision=[버전 숫자]`를 통해 상세 정보를 확인 할 수 있다.
  • 롤백 수행
    - `kubectl rollout undo deployment/nginx-deployment` 바로 직전 버전으로 롤백 된다.
    - `kubectl rollout undo deployment/nginx-deployment --to-revision=[버전 숫자]` 특정 버전 정보로 롤백 된다.
  • 롤백 이후 상태 확인
    - `kubectl get deployment nginx-deployment` 배포된 레플리카셋 파드 수량을 확인 한다.
    - `kubectl describe deployment nginx-deployment` 디플로이먼트의 세부 정보를 확인한다.

 

■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 상태

  • 디플로이먼트 라이프 사이클동안 다양한 상태로 전환되며, 롤-아웃 하는 동안 진행중, 완료 및 진행 실패 일 수 있다.
항목 진행중 완료 진행 실패
정의 아래 작업을 실행하는 과정
# 신규 레플리카셋을 생성.
# 신규 레플리카셋을 스케일 업.
# 기존 레플리카셋을 스케일 다운.
# 신규 파드가 준비 및 이용할 수 있음(최소 준비 시간(초) 동안 준비됨).
완료 상태 
# 요청한 모든 업데이트가 완료 됨
# 디플로이먼트와 관련한 모든 레플리카를 사용할 수 있을 때.
# 디플로이먼트에 대해 이전 복제본이 실행되고 있지 않을 때.
실패 발생 원인
# 할당량 부족
# 준비성 프로브(readiness probe)의 실패
# 이미지 풀 에러
# 권한 부족
# 범위 제한
# 애플리케이션 런타임의 잘못된 구성
상태
정보
# `type: Progressing`
# `status: "True"`
# `reason: NewReplicaSetCreated | FoundNewReplicaSet | ReplicaSetUpdated`
# `type: Progressing`
# `status: "True"`
# `reason: NewReplicaSetAvailable`
# `type: Progressing`
# `status: "False"`
# `reason: ProgressDeadlineExceeded`
응답
코드
N/A 0 1
  • 디플로이먼트 진행 실패 세부 사항 
    • 진행중 또는 완료는 디플로이먼트가 정상적으로 동작하고 있는 과정이기 때문에 세부적으로 확인할 필요는 없으나, 진행 실패의 경우 원인 파악과 조치 방안이 필요하다. 
    • 실패 조건을 찾기 위해서 데드라인 파라미터를 지정하여 확인이 가능하다. `.spec.progressDeadlineSeconds` (진행 기한 시간(초))는 디플로이먼트의 진행이 정지되었음을 나타내는 디플로이먼트 컨트롤러가 대기하는 시간을 나타내며 설정된 시간 시간 이후 디플로이먼트 롤아웃에 대한 진행 상태의 부족에 대한 리포트를 수행하게 된다. `kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}'` 정의된 데드라인을 넘어서면 디플로이먼트의 상태값을 변경한다. 
      • `type: Progressing`
      • `status: "False"`
      • `reason: ProgressDeadlineExceeded`
      • 정의된 데드라인 시간 보다 일찍 실패할 경우 `reason:ReplicaSetCreateError` 상태값을 가지게 된다
      • 디플로이먼트의 세부적인 내용을 확인하기 위해서 아래 명령어를 사용한다
        • `kubectl describe deployment [이름]` 또는
        • `kubectl get deployment [이름] -o yaml`
    • 단, 디플로이먼트의 롤아웃이 완료되면 데드라인은 더 이상 고려되지 않는다
728x90