애플리케이션 업데이트하기

애플리케이션 업데이트하기 (Update App)

출처: 문서

본문

목표 (Objectives)

kubectl로 롤링 업데이트를 수행한다.

시작하기 전에

이 튜토리얼의 셸 명령은 대부분의 Linux·macOS 시스템의 기본 셸(예: bash, zsh, sh)이 지원하는 POSIX 셸 구문을 사용해요. Windows 사용자는 명령을 그대로 실행하려면 Windows Subsystem for Linux (WSL)이나 Git Bash 같은 POSIX 호환 셸을 사용해야 합니다. export, $() 같은 구조를 사용하는 명령은 PowerShell이나 Windows Command Prompt와 호환되지 않습니다.

애플리케이션 업데이트하기

롤링 업데이트는 새 파드 인스턴스로 기존 파드를 점진적으로 업데이트해 Deployment 업데이트가 제로 다운타임으로 일어나게 한다.

사용자는 애플리케이션이 항상 사용 가능하기를 기대하고, 개발자는 하루에 여러 번 새 버전을 배포해야 합니다. 쿠버네티스에서는 이를 롤링 업데이트로 해요. 롤링 업데이트는 기존 파드를 새 파드로 점진적으로 교체해 Deployment 업데이트가 제로 다운타임으로 일어나게 합니다. 새 파드는 사용 가능한 리소스가 있는 노드에 스케줄되고, 쿠버네티스는 이전 파드를 제거하기 전에 새 파드가 시작될 때까지 기다립니다.

이전 모듈에서 우리는 여러 인스턴스를 실행하도록 애플리케이션을 스케일링했어요. 이는 애플리케이션 가용성에 영향을 주지 않고 업데이트를 수행하기 위한 요구 사항입니다. 기본적으로 업데이트 중 사용할 수 없게 될 수 있는 최대 파드 수와 생성할 수 있는 새 파드의 최대 수는 1입니다. 두 옵션 모두 숫자나 (파드의) 백분율로 구성할 수 있습니다. 쿠버네티스에서 업데이트는 버전이 매겨지며, 어떤 Deployment 업데이트든 이전의 (안정적인) 버전으로 되돌릴 수 있습니다.

롤링 업데이트 개요

Deployment가 공개적으로 노출되어 있다면 Service는 요청을 처리할 수 있는 파드에만 트래픽을 보냅니다. 이는 업데이트 중에도 사용자가 애플리케이션에 계속 접근할 수 있게 보장합니다.

롤링 업데이트 동안 이 동작은 요청을 서빙하는 파드에만 트래픽을 라우팅해 애플리케이션을 계속 사용할 수 있게 합니다. 롤링 업데이트는 다음 작업을 허용합니다:

  • 애플리케이션을 한 환경에서 다른 환경으로 승격하기 (컨테이너 이미지 업데이트를 통해)
  • 이전 버전으로 롤백하기
  • 제로 다운타임으로 애플리케이션의 지속적 통합·배포하기

다음의 대화형 튜토리얼에서 우리는 애플리케이션을 새 버전으로 업데이트하고, 롤백도 수행할 거예요.

앱 버전 업데이트

Deployment를 나열하려면 get deployments 하위 명령을 실행해요:

kubectl get deployments

실행 중인 파드를 나열하려면 get pods 하위 명령을 실행해요:

kubectl get pods

앱의 현재 이미지 버전을 보려면 describe pods 하위 명령을 실행하고 Image 필드를 찾아요:

kubectl describe pods

애플리케이션 이미지를 버전 2로 업데이트하려면 set image 하위 명령을, deployment 이름과 새 이미지 버전을 이어서 사용해요:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2

이 명령은 앱에 다른 이미지를 사용하도록 Deployment에 통보하고 롤링 업데이트를 시작했어요. get pods 하위 명령으로 새 파드의 상태를 확인하고, 이전 파드가 종료되는 것을 봐요:

kubectl get pods

업데이트 확인

먼저 이전 튜토리얼 단계에서 삭제했을 수 있으니 서비스가 실행 중인지 확인해요. describe services/kubernetes-bootcamp를 실행해보세요. 없다면 다음과 같이 다시 만들 수 있습니다:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

할당된 Node 포트 값을 가진 NODE_PORT라는 환경 변수를 만들어요:

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo "NODE_PORT=$NODE_PORT"

다음으로 노출된 IP와 포트에 curl을 실행해요:

curl http://"$(minikube ip):$NODE_PORT"

curl 명령을 실행할 때마다 다른 파드에 도달합니다. 이제 모든 파드가 최신 버전(v2)을 실행 중인 것을 확인할 수 있어요.

rollout status 하위 명령을 실행해 업데이트를 확인할 수도 있어요:

kubectl rollout status deployments/kubernetes-bootcamp

앱의 현재 이미지 버전을 보려면 describe pods 하위 명령을 실행해요:

kubectl describe pods

출력의 Image 필드에서 최신 이미지 버전(v2)을 실행 중인지 확인해요.

업데이트 롤백

또 다른 업데이트를 수행하고, v10으로 태그된 이미지를 배포해봅시다:

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

get deployments로 deployment 상태를 확인해요:

kubectl get deployments

출력에 원하는 수의 사용 가능한 파드가 나열되지 않는 것을 주목하세요. get pods 하위 명령을 실행해 모든 파드를 나열해요:

kubectl get pods

일부 파드의 상태가 ImagePullBackOff인 것을 주목하세요.

문제에 대한 더 많은 통찰을 얻으려면 describe pods 하위 명령을 실행해요:

kubectl describe pods

영향을 받는 파드의 출력 Events 섹션에서 v10 이미지 버전이 리포지토리에 없다는 것을 주목하세요.

배포를 마지막으로 동작한 버전으로 롤백하려면 rollout undo 하위 명령을 사용해요:

kubectl rollout undo deployments/kubernetes-bootcamp

rollout undo 명령은 배포를 이전에 알려진 상태(이미지의 v2)로 되돌립니다. 업데이트는 버전이 매겨지며, Deployment의 이전에 알려진 상태로 되돌릴 수 있습니다.

get pods 하위 명령을 사용해 파드를 다시 나열해요:

kubectl get pods

실행 중인 파드에 배포된 이미지를 확인하려면 describe pods 하위 명령을 사용해요:

kubectl describe pods

Deployment가 다시 앱의 안정 버전(v2)을 사용하고 있어요. 롤백이 성공했습니다.

로컬 클러스터를 정리하는 것을 잊지 마세요.

kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

더 알아보기 (Learn more)