롤링 업데이트는 Kubernetes에서 새로운 버전의 애플리케이션을 배포할 때 기존 파드를 점진적으로 교체하는 방법입니다. 이를 통해 다운타임 없이 애플리케이션을 업데이트할 수 있습니다. 이제 롤링 업데이트 시나리오를 만들어서 실습 강의 형식으로 설명드리겠습니다.
가상의 웹 애플리케이션을 운영하고 있다고 가정해보겠습니다. 현재는 v1 버전의 웹 애플리케이션을 배포하여 사용 중인데, 새로운 기능을 추가한 v2 버전을 배포하려고 합니다. 우리는 롤링 업데이트를 사용하여 다운타임 없이 v1에서 v2로 점진적으로 업데이트하려고 합니다.
이 실습에서는 Kubernetes의 Deployment 리소스를 사용하여 애플리케이션을 배포하고 롤링 업데이트를 수행합니다.
v1 애플리케이션 배포먼저, 기존 버전(v1)의 애플리케이션을 배포합니다.
# deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: nginx:1.14 # v1 버전 (nginx 1.14 이미지)
ports:
- containerPort: 80
배포 파일을 작성한 후, Kubernetes에 적용합니다:
kubectl apply -f deployment-v1.yaml
현재 배포된 v1 애플리케이션은 3개의 파드로 실행됩니다.
현재 실행 중인 파드와 Deployment 상태를 확인합니다:
kubectl get deployments
kubectl get pods
여기에서 my-app이라는 이름의 Deployment와 3개의 파드가 정상적으로 실행되고 있는 것을 확인할 수 있습니다.
이제 v1 버전에서 v2 버전(nginx 1.16)으로 애플리케이션을 롤링 업데이트할 차례입니다. 이를 위해 Deployment 파일을 수정하고, 다시 적용합니다.
v2 버전으로 업데이트# deployment-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: nginx:1.16 # v2 버전 (nginx 1.16 이미지)
ports:
- containerPort: 80
Deployment 파일에서 image를 nginx:1.16으로 변경한 후, 다시 Kubernetes에 적용합니다:
kubectl apply -f deployment-v2.yaml
업데이트가 진행 중인 동안, 파드의 상태를 확인하여 점진적으로 v1에서 v2로 변경되는 것을 확인할 수 있습니다:
kubectl rollout status deployment my-app
이 명령어를 사용하면 롤링 업데이트가 어떻게 진행되는지 실시간으로 확인할 수 있습니다.
또한, 파드 상태를 확인하여 점진적으로 새로운 파드가 생성되고, 오래된 파드가 삭제되는 것을 볼 수 있습니다:
kubectl get pods -w
여기서 -w 옵션을 사용하면 파드 상태가 실시간으로 업데이트되는 것을 모니터링할 수 있습니다.
만약 업데이트된 버전에서 문제가 발생한다면, 롤백을 통해 이전 버전으로 복구할 수 있습니다.
kubectl rollout undo deployment my-app
이 명령어를 사용하면 v2에서 다시 v1으로 롤백됩니다.
롤백이 성공적으로 이루어졌는지 확인합니다:
kubectl rollout status deployment my-app
이 실습을 통해 Kubernetes에서 Deployment를 사용한 롤링 업데이트의 개념과 실습을 학습할 수 있었습니다.