Kubernetes · 3 min read · Dec 07, 2025
Kubernetes의 롤링 업데이트 및 롤백

Deployment를 사용하는 이점 중 하나는 롤링 업데이트를 수행하고 롤링 업데이트 전략을 생성할 수 있는 능력입니다. 롤링 업데이트는 포드의 구성을 점진적으로 업데이트할 수 있게 해줍니다.
업데이트 전략(k8s rollingupdate, k8s update strategy)은 롤링 업데이트를 구성하는 가장 중요한 옵션입니다. Deployment 정의에서 spec.strategy.type은 두 가지 가능한 값을 가집니다:
- RollingUpdate: 새로운 포드가 점진적으로 추가되고 오래된 포드가 점진적으로 종료됩니다.
- Recreate: 새로운 포드가 추가되기 전에 모든 오래된 포드가 한 번에 종료됩니다.
RollingUpdate를 사용하여 배포를 업데이트할 때 두 가지 추가 옵션이 있습니다.
- maxSurge: 업데이트 중에 원하는 포드 수를 초과하여 생성할 수 있는 포드 수입니다.
- maxUnavailable: 업데이트 과정에서 사용할 수 없는 포드 수입니다.
배포 롤링 업데이트를 사용하여 배포에서 사용하는 이미지를 업그레이드할 수 있습니다. 배포의 상태(kubectl rollout status)는 저장되어 있어 이전 버전으로 롤백할 수 있습니다.
잘못된 이미지로 인해 애플리케이션이 실패하거나 배포가 불안정한 경우, 배포를 롤백하고 싶을 수 있습니다(k8s rollback). 기본적으로 모든 배포의 롤아웃 기록은 시스템에 보관되어 나중에 불안정한 배포의 경우 롤백하는 데 사용할 수 있습니다. 이 기록을 사용하여 언제든지 롤백할 수 있습니다.
롤링 업데이트 및 롤백에 대해 더 알고 싶다면 Kubernetes의 공식 문서를 여기에서 방문하세요.
이 기사에서는 기본 롤링 업데이트 전략으로 배포를 업데이트하고 배포를 롤백합니다. 배포를 롤백하기 위해, 우리는 배포의 업데이트 중 하나에서 잘못된 이미지를 사용할 것입니다.
전제 조건
- 최소 1개의 작업자 노드가 있는 Kubernetes 클러스터입니다.
Kubernetes 클러스터를 만드는 방법을 배우고 싶다면 여기에서 클릭하세요. 이 가이드는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드를 가진 Kubernetes 클러스터를 만드는 데 도움을 줄 것입니다.
우리가 할 일은 무엇인가요?
- 롤링 업데이트 및 롤백
롤링 업데이트 및 롤백
Nginx의 배포 정의 파일을 생성하고 배포의 포드 템플릿을 사용합니다. 여기서 우리는 Nginx 버전을 “nginx:1.14.2”로 지정했습니다.
vim my-deployment.ymlapiVersion: apps/v1
kind: Deployment
metadata:
name: rolling-update-demo
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
기존 포드를 확인하고 배포를 생성해 보겠습니다.
kubectl get podskubectl create -f my-deployment.yml방금 생성한 배포의 세부 정보를 가져옵니다. 이 배포는 4개의 포드를 생성하고 replicaset에 의해 제어됩니다.
kubectl get deploymentskubectl get podskubectl get replicaset
위 스크린샷에서 우리는 1개의 배포가 있고 그 아래에 1개의 replicaset과 4개의 포드가 replicaset에 의해 제어되고 있음을 볼 수 있습니다.
이제 Nginx 버전을 “nginx:1.14.2”에서 “nginx:1.61.1”로 변경해 보겠습니다.
vim my-deployment.yml
변경 사항을 배포에 적용하고 포드, replicaset 및 배포의 세부 정보를 가져옵니다.
kubectl apply -f my-deployment.ymlkubectl get podskubectl get deploymentskubectl get replicaset
위 스크린샷에서 새로운 replicaset이 생성되었고 그 아래에 4개의 포드가 있음을 볼 수 있습니다. 그러나 여전히 0개의 포드를 가진 이전 replicaset이 보입니다.
이제 Nginx 버전을 다시 변경하되 이번에는 잘못된 Nginx 버전을 입력하면, Nginx 이미지가 잘못된 버전에 대해 존재하지 않기 때문에 배포가 실패합니다.
vim my-deployment.yml
변경 사항을 배포에 적용해 보겠습니다.
kubectl apply -f my-deployment.ymlkubectl get podskubectl get deployments이제 replicaset 세부 정보를 가져와 보겠습니다.
kubectl get replicaset
위 스크린샷에서 새로운 포드가 “ErrImagePull” 오류로 실패하고 있음을 볼 수 있습니다. 포드가 실패하는 이유는 Nginx 이미지가 버전 “ngin:1.1.1”에 대해 존재하지 않기 때문입니다.
이제 이전에 작동하던 이미지로 돌아가고 싶다면, 롤아웃 상태가 좋지 않은 경우 이전 리비전으로 롤백할 수 있습니다.
롤백하려면, 다음 명령어를 사용하여 배포의 롤아웃 기록을 먼저 가져올 수 있습니다.
kubectl rollout history deployments rolling-update-demo이제 다음 명령어를 사용하여 “–revision=2”로 리비전 2의 배포 세부 정보를 확인할 수 있습니다.
kubectl rollout history deployments rolling-update-demo --revision=2
위 스크린샷에서 리비전 2가 Nginx 이미지 버전 “nginx:1.16.1”을 가지고 있으며, 이는 우리가 Nginx 버전 “ngin:1.1.1”로 배포를 업데이트하기 전에 작동하던 버전입니다.
이제 현재 실패한 배포 이전의 마지막 리비전으로 배포를 롤백해 보겠습니다.
kubectl get deploymentskubectl rollout undo deployment rolling-update-demokubectl get podskubectl get replicaset
위 스크린샷에서 우리는 최신 배포를 되돌렸고 이제 마지막 업데이트 이전에 작동하던 배포 리비전을 가지고 있음을 볼 수 있습니다.
배포에 대한 더 많은 정보를 알고 싶다면 다음 명령어를 사용하여 설명할 수 있습니다.
kubectl get deploymentskubectl describe deployment rolling-update-demo
결론
이 기사에서는 배포를 생성하고 업데이트하는 단계를 살펴보았습니다. 우리는 배포가 어떤 이유로 실패할 경우 롤백할 수 있는 방법을 보았습니다. 여기서 실패한 배포에 대한 오류는 “ErrImagePull”이었습니다. 우리는 배포가 최신 업데이트를 유지하고 싶지 않을 경우 롤백할 수 있는 리비전을 유지하는 방법을 보았습니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.