🔧 DevOps

Rollback

롤백

배포 실패 시 이전 버전으로 복원. CI/CD 필수 기능.

상세 설명

Rollback(롤백)은 배포된 애플리케이션에 문제가 발생했을 때 이전의 안정적인 버전으로 신속하게 되돌리는 작업입니다. 현대 CI/CD 파이프라인에서 롤백 기능은 서비스 연속성을 보장하는 핵심 안전 장치입니다.

롤백은 단순히 코드를 되돌리는 것 이상으로, 데이터베이스 마이그레이션, 환경 설정, 인프라 상태까지 고려해야 합니다. 자동 롤백 정책을 구현하면 장애 발생 시 MTTR(Mean Time To Recovery)을 수 분 내로 단축할 수 있습니다. Kubernetes는 기본적으로 이전 3개 버전의 ReplicaSet을 유지하여 즉각적인 롤백을 지원합니다.

코드 예제

Kubernetes 롤백 설정

# deployment.yaml - 롤백 가능한 배포 설정
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
  annotations:
    kubernetes.io/change-cause: "v2.1.0 - 결제 API 개선"
spec:
  replicas: 3
  revisionHistoryLimit: 5  # 롤백 가능한 버전 수
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: api-server
  template:
    metadata:
      labels:
        app: api-server
        version: "v2.1.0"
    spec:
      containers:
      - name: api
        image: myapp/api-server:v2.1.0
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20

자동 롤백 스크립트

#!/bin/bash
# auto-rollback.sh - 헬스체크 기반 자동 롤백

DEPLOYMENT="api-server"
NAMESPACE="production"
MAX_RETRIES=5
RETRY_COUNT=0

echo "배포 상태 모니터링 시작..."

while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
  # 배포 상태 확인
  STATUS=$(kubectl rollout status deployment/$DEPLOYMENT -n $NAMESPACE --timeout=60s 2>&1)

  if echo "$STATUS" | grep -q "successfully rolled out"; then
    echo "배포 성공!"
    exit 0
  fi

  RETRY_COUNT=$((RETRY_COUNT + 1))
  echo "헬스체크 실패 ($RETRY_COUNT/$MAX_RETRIES)"
  sleep 10
done

echo "배포 실패 감지 - 롤백 시작"

# 이전 버전으로 롤백
kubectl rollout undo deployment/$DEPLOYMENT -n $NAMESPACE

# 롤백 완료 대기
kubectl rollout status deployment/$DEPLOYMENT -n $NAMESPACE

# 알림 전송
curl -X POST $SLACK_WEBHOOK \
  -H 'Content-type: application/json' \
  -d "{\"text\":\"$DEPLOYMENT 자동 롤백 완료\"}"

실무 대화

온콜 엔지니어

"프로덕션에서 500 에러가 급증하고 있습니다. 방금 배포한 v2.1.0이 원인인 것 같아요."

DevOps 엔지니어

"배포 히스토리 확인했어요. kubectl rollout undo로 v2.0.9로 롤백할게요. 30초면 완료됩니다."

온콜 엔지니어

"롤백 후 에러율이 정상으로 돌아왔습니다. 근데 DB 마이그레이션은 괜찮나요?"

DevOps 엔지니어

"다행히 이번 릴리스는 backward compatible한 스키마 변경이라 문제없어요. 항상 롤백 가능한 마이그레이션만 허용하는 정책 덕분이죠."

개발팀장

"좋아요. 근본 원인 분석 후 핫픽스 진행하고, 다음엔 카나리 배포 비율을 낮춰서 먼저 검증하죠."

주의사항

  • DB 마이그레이션 호환성: 롤백 시 스키마 변경이 backward compatible한지 반드시 확인해야 합니다. 컬럼 삭제나 타입 변경은 롤백을 어렵게 만듭니다.
  • 상태 데이터 고려: 새 버전에서 생성된 데이터가 이전 버전과 호환되는지 검증하세요. 포맷이 변경된 경우 데이터 손실이 발생할 수 있습니다.
  • revisionHistoryLimit 설정: 너무 낮게 설정하면 롤백 옵션이 제한됩니다. 최소 5개 이상 유지를 권장합니다.
  • 외부 서비스 의존성: 롤백 시 외부 API 버전이나 메시지 포맷 호환성도 함께 고려해야 합니다.
  • Feature Flag 활용: 코드 롤백 대신 Feature Flag로 기능만 비활성화하는 것이 더 안전한 경우가 많습니다.

더 배우기