애플리케이션의 배포와 운영 관리에 있어 가장 중요한 것은 안정성과 가용성입니다. 특히 기존 애플리케이션을 새 버전으로 업데이트할 때는, 서비스의 중단 없이 안정적으로 배포하는 것이 중요합니다. 쿠버네티스는 이를 가능하게 하는 다양한 리소스와 업데이트 전략을 제공하며, 그 중 롤링 업데이트(Rolling Update) 는 가장 널리 사용되는 방법입니다. 이번 글에서는 쿠버네티스의 롤아웃과 롤링 업데이트의 개념, 그리고 이를 구현하는 리소스에 대해 알아보겠습니다.
롤아웃의 개념
쿠버네티스에서 롤아웃은 애플리케이션의 새로운 버전을 배포하는 과정을 의미합니다. 기존 애플리케이션의 인스턴스를 새 버전으로 점진적으로 교체하는 방식으로 이루어지며, 이를 통해 애플리케이션의 가용성을 유지하면서 새 기능을 도입하거나 버그를 수정할 수 있습니다.
롤아웃은 주로 파드(Pod)의 정의가 변경되었을 때 발생합니다. 즉, 이미지 버전이나 환경 변수와 같은 파드의 스펙이 변경될 때 롤아웃이 일어납니다. 하지만 단순히 레플리카 수를 조정하거나 스케일링하는 경우에는 롤아웃이 발생하지 않습니다.
롤아웃은 특정 객체를 명확히 가리키지는 않지만, 애플리케이션 릴리스 관리를 위한 중요한 도구입니다. 쿠버네티스는 롤아웃이 실패할 경우 이전 상태로 되돌릴 수 있는 롤백(Rollback) 기능도 제공합니다.
롤링 업데이트란?
롤링 업데이트는 쿠버네티스의 기본 배포 전략으로, 기존 애플리케이션을 점진적으로 새로운 버전으로 교체하는 방식입니다. 구체적으로는 기존 레플리카셋의 파드 수를 점차 줄여가면서 동시에 새 레플리카셋의 파드 수를 늘려갑니다. 이를 통해 무중단 서비스를 유지할 수 있으며, 업데이트 중 문제가 발생하더라도 서비스 가용성을 보장할 수 있습니다.
롤링 업데이트는 업데이트 시간이 길어질 수 있지만, 서비스 중단 없이 안전하게 새로운 애플리케이션을 배포할 수 있다는 장점이 있습니다.
쿠버네티스의 디플로이먼트는 애플리케이션의 배포와 스케일링을 관리하는 가장 대표적인 리소스입니다. 디플로이먼트는 다음과 같은 두 가지 업데이트 전략을 제공합니다.
1. 롤링 업데이트 (Rolling Update)
롤링 업데이트는 기존 파드를 순차적으로 새로운 버전으로 교체하여 무중단 서비스를 유지합니다. 이 과정에서 maxUnavailable와 maxSurge라는 두 가지 주요 파라미터를 사용해 업데이트 속도를 조절할 수 있습니다.
maxUnavailable: 기존 레플리카셋의 파드를 중지할 수 있는 최대 수를 지정합니다. 예를 들어, maxUnavailable: 1이면, 하나의 파드를 중지한 후 새 파드를 생성하고 이를 반복합니다.
maxSurge: 새 레플리카셋의 파드를 생성할 수 있는 최대 수를 지정합니다. maxSurge: 1이면, 하나의 새 파드를 생성한 후 구 파드를 하나씩 중지합니다.
minReadySeconds와 progressDeadlineSeconds와 같은 파라미터를 추가로 설정하여 신규 파드의 안정성을 확인하거나 배포 시간 초과를 관리할 수 있습니다.
2. 리크리에이트 (Recreate)
리크리에이트는 기존 파드를 모두 종료한 후 새로운 파드를 생성하는 방식입니다. 이 방식은 롤링 업데이트와 달리 일시적인 다운타임이 발생할 수 있습니다. 일반적으로 데이터 손실이나 일관성 문제가 발생할 수 있는 경우에는 사용하지 않는 것이 좋습니다.
디플로이먼트 외에도, 데몬셋과 스테이트풀셋도 업데이트 전략을 제공합니다. 이 리소스들은 디플로이먼트와 다른 특성을 가지기 때문에, 별도의 롤링 업데이트 방식이 적용됩니다.
데몬셋(DaemonSet)
데몬셋은 클러스터의 각 노드에서 하나씩 파드를 배포합니다. 데몬셋은 다음과 같은 두 가지 업데이트 전략을 제공합니다
스테이트풀셋(StatefulSet)
스테이트풀셋은 상태가 중요한 애플리케이션(예: 데이터베이스, 캐시 서버 등)을 관리하는 데 사용됩니다. 스테이트풀셋은 파드의 순서, 영구 볼륨(Persistent Volume) 등 상태를 유지하면서 업데이트해야 하므로 롤링 업데이트 전략을 따르지만, 각 파드의 데이터 일관성을 유지하기 위해 추가적인 고려가 필요합니다.
핫 리로드(Hot Reload)와 롤링 업데이트
때로는 애플리케이션의 설정값만 변경하고 싶을 때가 있습니다. 이 경우, 애플리케이션을 재배포하지 않고도 설정값을 변경할 수 있는 핫 리로드(Hot Reload) 방식을 사용할 수 있습니다. 핫 리로드는 롤아웃을 발생시키지 않아 매끄러운 업데이트가 가능하지만, 문제가 생겼을 때 롤백이 불가능하다는 단점이 있습니다. 따라서 중요한 애플리케이션의 설정 변경 시에는 롤링 업데이트를 사용하는 것이 안전합니다.
쿠버네티스의 롤아웃과 롤링 업데이트는 애플리케이션을 안정적이고 신속하게 배포할 수 있도록 돕는 중요한 전략입니다. 이를 통해 서비스 중단 없이 새로운 기능을 도입하거나, 기존 버그를 수정할 수 있습니다. 디플로이먼트, 데몬셋, 스테이트풀셋과 같은 리소스는 각기 다른 특성을 지니고 있으므로, 애플리케이션의 특성에 맞는 배포 전략을 선택하는 것이 중요합니다.
쿠버네티스에서 롤아웃(Rollout)이란 무엇인가요?
답변: 롤아웃은 쿠버네티스에서 애플리케이션의 새로운 버전을 배포하는 과정을 의미합니다. 기존 애플리케이션의 파드를 새 버전으로 점진적으로 교체하며, 이를 통해 서비스 중단 없이 새로운 기능을 도입하거나 버그 수정을 할 수 있습니다. 롤아웃은 파드 정의가 변경될 때 발생하며, 롤아웃 중 문제가 생기면 롤백하여 이전 상태로 되돌릴 수 있습니다.
데몬셋(DaemonSet)에서 사용하는 온딜리트(OnDelete) 업데이트 전략이란 무엇인가요?
답변: 데몬셋의 온딜리트(OnDelete) 업데이트 전략은 기존 파드를 유지한 채, 파드가 수동으로 삭제될 때만 새로운 파드를 생성하는 방식입니다. 즉, 수동으로 파드를 삭제하지 않으면 기존 파드가 그대로 유지됩니다. 이는 파드를 종료하지 않고 안정적인 운영이 필요한 경우에 유용합니다.
스테이트풀셋(StatefulSet)의 롤링 업데이트를 사용하는 이유는 무엇인가요?
답변: 스테이트풀셋은 상태를 유지하는 애플리케이션(예: 데이터베이스, 캐시 서버 등)을 관리하는 데 사용됩니다. 각 파드의 데이터 일관성과 안정성을 유지하면서 업데이트해야 하기 때문에, 롤링 업데이트를 사용하여 한 번에 하나씩 파드를 순차적으로 교체합니다. 이렇게 하면 애플리케이션의 데이터 손실이나 일관성 문제를 최소화할 수 있습니다.
롤아웃 중 문제가 발생했을 때 어떻게 대응할 수 있나요?
답변: 쿠버네티스에서는 롤아웃 중 문제가 발생하면 롤백(Rollback) 기능을 통해 이전 상태로 되돌릴 수 있습니다. kubectl rollout undo 명령어를 사용하여 이전 리비전(Revision)으로 롤백할 수 있으며, 특정 리비전으로도 되돌릴 수 있습니다. 이를 통해 애플리케이션의 안정성을 유지할 수 있습니다.