앱 배포하기

앱 배포하기 (Deploy an App)

출처: 문서

본문

목표 (Objectives)

  • 애플리케이션 Deployment에 대해 배운다.
  • kubectl로 쿠버네티스에 첫 앱을 배포한다.

시작하기 전에

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

쿠버네티스 Deployment

Deployment는 애플리케이션의 인스턴스를 만들고 업데이트하는 책임이 있다.

이 튜토리얼은 AMD64 아키텍처가 필요한 컨테이너를 사용해요. 다른 CPU 아키텍처의 컴퓨터에서 minikube를 사용한다면, AMD64를 에뮬레이션할 수 있는 드라이버로 minikube를 시도할 수 있습니다. 예를 들어 Docker Desktop 드라이버가 이를 할 수 있습니다.

실행 중인 쿠버네티스 클러스터가 있으면 그 위에 컨테이너화된 애플리케이션을 배포할 수 있어요. 이를 위해 쿠버네티스 Deployment를 만듭니다. Deployment는 쿠버네티스에게 애플리케이션 인스턴스를 만들고 업데이트하는 방법을 지시합니다. Deployment를 만들면 쿠버네티스 컨트롤 플레인이 그 Deployment에 포함된 애플리케이션 인스턴스를 클러스터의 개별 노드에서 실행하도록 스케줄합니다.

애플리케이션 인스턴스가 생성되면 쿠버네티스 Deployment 컨트롤러가 그 인스턴스를 지속적으로 모니터링합니다. 인스턴스를 호스팅하는 노드가 다운되거나 삭제되면 Deployment 컨트롤러는 그 인스턴스를 클러스터의 다른 노드의 인스턴스로 교체합니다. 이것은 머신 실패나 유지보수를 해결하는 자가 치유 메커니즘을 제공합니다.

오케스트레이션 이전 세계에서는 설치 스크립트가 자주 애플리케이션을 시작하는 데 사용됐지만, 머신 실패로부터의 복구는 허용하지 않았습니다. 쿠버네티스 Deployment는 애플리케이션 인스턴스를 만들고 노드에 걸쳐 계속 실행하게 함으로써, 애플리케이션 관리에 근본적으로 다른 접근 방식을 제공합니다.

쿠버네티스에 첫 앱 배포하기

애플리케이션은 쿠버네티스에 배포되기 위해 지원되는 컨테이너 형식 중 하나로 패키징되어야 한다.

쿠버네티스 명령줄 인터페이스인 kubectl로 Deployment를 만들고 관리할 수 있어요. kubectl은 쿠버네티스 API를 사용해 클러스터와 상호작용합니다. 이 모듈에서는 쿠버네티스 클러스터에서 애플리케이션을 실행하는 Deployment를 만드는 데 필요한 가장 흔한 kubectl 명령을 배울 거예요.

Deployment를 만들 때 애플리케이션의 컨테이너 이미지와 실행하려는 레플리카 수를 지정해야 해요. Deployment를 업데이트해 그 정보를 나중에 변경할 수 있습니다. 부트캠프의 Module 5Module 6에서 Deployment를 스케일링·업데이트하는 방법을 다룹니다.

첫 Deployment에는 모든 요청을 되돌려 보내기 위해 NGINX를 사용하는 Docker 컨테이너에 패키징된 hello-node 애플리케이션을 사용할 거예요. (아직 hello-node 애플리케이션을 만들어 컨테이너로 배포해보지 않았다면 Hello Minikube 튜토리얼의 지침을 먼저 따라 할 수 있습니다.)

kubectl도 설치되어 있어야 합니다. 설치가 필요하면 install tools를 방문하세요.

이제 Deployment가 무엇인지 알았으니 첫 앱을 배포해봅시다!

kubectl 기초

kubectl 명령의 일반적인 형식은 kubectl action resource예요.

이것은 지정된 리소스(예: node 또는 deployment)에 지정된 action(예: create, describe, delete)을 수행합니다. 하위 명령 뒤에 --help를 사용해 가능한 파라미터에 대한 추가 정보를 얻을 수 있어요(예: kubectl get nodes --help).

kubectl version 명령을 실행해 kubectl이 클러스터와 통신하도록 구성되어 있는지 확인해요.

kubectl이 설치되어 있고 클라이언트와 서버 버전을 모두 볼 수 있는지 확인해요.

클러스터의 노드를 보려면 kubectl get nodes 명령을 실행해요.

사용 가능한 노드가 보입니다. 나중에 쿠버네티스는 노드의 사용 가능한 리소스에 기반해 애플리케이션을 어디에 배포할지 선택합니다.

앱 배포

kubectl create deployment 명령으로 쿠버네티스에 첫 앱을 배포해봅시다. deployment 이름과 앱 이미지 위치를 제공해야 합니다(호스팅된 이미지는 전체 리포지토리 URL 포함).

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

좋습니다! deployment를 만들어 첫 애플리케이션을 방금 배포했습니다. 이것은 몇 가지를 수행했습니다:

  • 애플리케이션 인스턴스가 실행될 수 있는 적합한 노드를 찾았다(사용 가능한 노드가 1개뿐).
  • 그 노드에서 애플리케이션이 실행되도록 스케줄했다.
  • 필요할 때 인스턴스를 새 노드에 다시 스케줄하도록 클러스터를 구성했다.

deployment를 나열하려면 kubectl get deployments 명령을 사용해요:

kubectl get deployments

앱의 단일 인스턴스를 실행하는 deployment가 1개 있는 것을 볼 수 있습니다. 인스턴스는 노드의 컨테이너 안에서 실행 중입니다.

앱 보기

쿠버네티스 안에서 실행 중인 Pods는 사설·격리된 네트워크에서 실행돼요. 기본적으로 같은 쿠버네티스 클러스터 안의 다른 파드와 서비스에는 보이지만, 그 네트워크 밖에서는 보이지 않습니다. kubectl을 사용할 때 우리는 API 엔드포인트를 통해 애플리케이션과 통신하고 있습니다.

애플리케이션을 쿠버네티스 클러스터 밖으로 노출하는 다른 옵션은 나중에 Module 4에서 다룰 거예요. 또한 기본 튜토리얼이므로 여기서 Pods가 무엇인지 자세히 설명하지 않으며, 이후 주제에서 다룰 것입니다.

kubectl proxy 명령은 클러스터 전체의 사설 네트워크로 통신을 전달하는 프록시를 만들 수 있어요. 프록시는 control-C를 눌러 종료할 수 있고 실행 중에는 출력을 표시하지 않습니다.

프록시를 실행하려면 두 번째 터미널 창을 열어야 합니다.

kubectl proxy

이제 호스트(터미널)와 쿠버네티스 클러스터 사이에 연결이 생겼습니다. 프록시는 이 터미널에서 API에 직접 접근할 수 있게 합니다.

프록시 엔드포인트를 통해 호스팅되는 모든 API를 볼 수 있어요. 예를 들어 curl 명령으로 API를 통해 버전을 직접 질의할 수 있습니다:

curl http://localhost:8001/version

포트 8001에 접근할 수 없다면, 위에서 시작한 kubectl proxy가 두 번째 터미널에서 실행 중인지 확인하세요.

API 서버는 파드 이름에 기반해 각 파드에 대한 엔드포인트를 자동으로 만들며, 프록시를 통해 접근할 수 있습니다.

먼저 파드 이름을 얻어 환경 변수 POD_NAME에 저장해야 합니다.

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

프록시된 API를 통해 파드에 접근할 수 있어요:

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

새 Deployment가 프록시 없이 접근 가능하려면 Service가 필요한데, 이는 Module 4에서 설명할 거예요.

더 알아보기 (Learn more)