기술 지식 쌓아가기 📚/Backend 🍔
[Optimization] 무중단 배포: 서비스 중단 없이 안전하게 배포하는 방법
코양이🤍
2024. 11. 9. 19:25
⭐ 무중단 배포의 개념
무중단 배포란 애플리케이션 배포 시 서비스 중단 없이, 즉 사용자가 끊김 없이 애플리케이션을 사용할 수 있도록 하는 배포 방식입니다. 일반적으로 무중단 배포를 통해 새로운 버전을 배포하거나 유지보수를 진행해도 사용자 경험에 영향을 주지 않는 것을 목표로 합니다.
⭐ 무중단 배포가 필요한 이유
- 사용자 경험 개선: 서비스 중단이 잦으면 사용자는 불편을 느끼고, 이는 서비스에 대한 신뢰도에 영향을 줄 수 있습니다.
- 비즈니스 연속성 유지: 특정 시간에 중단될 수 없는 서비스를 제공하는 경우(예: 금융, e-커머스), 무중단 배포는 필수적입니다.
- 경쟁력 확보: 빠른 업데이트와 유지보수를 통해 경쟁 서비스를 뛰어넘는 기능을 신속하게 제공할 수 있습니다.
⭐ 무중단 배포를 구현하는 방식
- Blue-Green Deployment
- 두 개의 환경(Blue와 Green)을 만들어 배포합니다. 새로운 버전은 한쪽(Green)에 배포하고, 테스트 후 문제가 없으면 트래픽을 Green으로 전환해 무중단을 구현합니다.
- Canary Release
- 새로운 버전을 소수의 사용자 그룹에게 먼저 배포한 후, 안정성이 확인되면 점진적으로 전 사용자에게 배포하는 방식입니다.
- Rolling Deployment
- 서버 그룹에서 하나씩 서버를 업데이트하는 방식으로, 트래픽을 특정 서버에 분배하면서 점진적으로 배포합니다.
- A/B Testing
- 서로 다른 버전을 사용자 그룹에 동시에 배포하여 A/B 테스트를 수행한 후, 결과를 바탕으로 최적화된 버전을 선택할 수 있습니다.
⭐ 무중단 배포의 구현 도구와 프레임워크
- Kubernetes: 롤링 업데이트, Canary Release와 같은 무중단 배포 기능을 지원하는 오케스트레이션 도구입니다.
- Spinnaker: Blue-Green, Canary 배포 등 다양한 무중단 배포 방식을 지원하는 배포 관리 도구입니다.
- Istio: 마이크로서비스 간의 통신을 관리하고 트래픽을 제어하여 무중단 배포를 돕는 서비스 메쉬 솔루션입니다.
✅ 쿠버네티스에서 무중단 배포를 구현하는 방법
1. 롤링 업데이트 (Rolling Update)
쿠버네티스의 기본 배포 방식인 롤링 업데이트는 애플리케이션의 인스턴스를 하나씩 교체하면서 배포하는 방법입니다. 이를 통해 기존 버전의 인스턴스 일부는 계속해서 트래픽을 처리하면서 새로운 버전의 인스턴스를 점진적으로 배포할 수 있습니다.
롤링 업데이트의 작동 방식
- 배포 전략 설정: 쿠버네티스의 Deployment 리소스에서 RollingUpdate 전략을 설정합니다. maxUnavailable와 maxSurge 파라미터로 배포 중 유지할 인스턴스 수와 새로 추가할 인스턴스 수를 조절할 수 있습니다.
- maxUnavailable: 기존 인스턴스 중 배포 중 비활성화할 수 있는 최대 수를 지정합니다. 예를 들어 maxUnavailable: 1로 설정하면 한 번에 한 개의 기존 인스턴스만 중단됩니다.
- maxSurge: 새로운 버전의 인스턴스를 추가로 생성할 수 있는 최대 수를 지정합니다. 예를 들어 maxSurge: 1로 설정하면 한 번에 하나의 새로운 인스턴스가 추가됩니다.
- 점진적 교체: 기존 인스턴스를 하나씩 교체하면서 새 버전으로 점진적으로 배포됩니다. 문제가 발생하면 쿠버네티스는 자동으로 롤백을 수행하여 이전 버전으로 복구합니다.
롤링 업데이트의 장점
- 서비스 중단이 없어 사용자 경험에 영향을 주지 않습니다.
- 자동 롤백 기능이 있어 안정성을 높일 수 있습니다.
롤링 업데이트 설정 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
spec:
containers:
- name: my-container
image: my-app-image:v2
2. 카나리 릴리즈 (Canary Release)
카나리 릴리즈는 새로운 버전을 일부 사용자에게만 먼저 배포하여 안정성을 확인한 후 점진적으로 전체 사용자에게 배포하는 방식입니다. 롤링 업데이트와 유사하지만, 트래픽을 일부 인스턴스에만 먼저 할당하여 더 세밀하게 성능을 모니터링할 수 있다는 점에서 차이가 있습니다.
카나리 릴리즈의 작동 방식
- 새 버전의 배포: 전체 인스턴스 중 일부만 새로운 버전으로 업데이트하고, 나머지는 기존 버전을 유지합니다. 이를 위해 ReplicaSet이나 Deployment를 활용하여 특정 수의 파드를 새 버전으로 실행합니다.
- 트래픽 조절: 서비스 매니저나 이스티오(Istio) 같은 서비스 메쉬 도구를 사용하여 트래픽의 일부만 새로운 버전으로 전달합니다. 예를 들어, 새 버전이 10%의 트래픽을 받고 나머지 90%는 기존 버전으로 전달할 수 있습니다.
- 모니터링과 피드백: 새 버전에 대한 오류나 성능 문제를 모니터링합니다. 문제가 없다면 점진적으로 더 많은 트래픽을 새로운 버전으로 이동하고, 모든 트래픽이 새 버전으로 이동할 때 기존 버전을 종료합니다.
카나리 릴리즈 설정 예시 (이스티오를 사용하는 경우)
이스티오의 VirtualService와 DestinationRule을 설정하여 트래픽을 조절할 수 있습니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-app
spec:
hosts:
- my-app
http:
- route:
- destination:
host: my-app
subset: v1
weight: 90
- destination:
host: my-app
subset: v2
weight: 10
카나리 릴리즈의 장점
- 소규모 트래픽에서 새 버전의 안정성을 확인할 수 있어 문제 발생 시 빠르게 대응할 수 있습니다.
- 특정 사용자 그룹만 새로운 버전을 사용하게 하여 위험을 최소화합니다.
이 두 가지 방법은 각각의 장단점이 있으므로, 서비스의 특성에 맞게 선택할 수 있습니다. 빠르게 반복 배포가 필요한 경우 롤링 업데이트가 효율적이며, 안정성을 더 세밀하게 확인하고 싶은 경우 카나리 릴리즈가 적합합니다.
⭐ 무중단 배포 시 고려해야 할 사항
- 트래픽 분산: 배포 중에도 트래픽을 안정적으로 분산하기 위한 로드 밸런싱 설정이 필요합니다.
- 모니터링: 배포 후 성능과 오류를 실시간으로 확인하여 문제가 발생할 경우 신속히 대응할 수 있어야 합니다.
- 로그 관리: 배포 중 로그를 수집하고 분석하여, 오류를 추적하거나 롤백이 필요한 상황을 파악하는 데 도움이 됩니다.