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
'K8S' 카테고리의 다른 글
쿠버네티스(Kubernetes) 레플리카셋 (ReplicaSet) (0) | 2024.09.22 |
---|---|
쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 스케일링 (0) | 2024.09.22 |
쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 생성 및 업데이트 (2) | 2024.09.11 |
쿠버네티스(Kubernetes) 중단 (Disruption) (0) | 2024.08.30 |
쿠버네티스(Kubernetes) NameSpace CPU 자원 할당 (1) | 2024.08.25 |