5.4.1 간단한 Nginx 웹서버 배포
드디어 이론과 준비 단계를 지나, 우리가 정성껏 구축한 로컬 쿠버네티스 클러스터 위에 실제 애플리케이션을 올려보는 가슴 뛰는 순간입니다. 이번 실습에서는 클라우드 네이티브 세계에서 가장 기본적이고 널리 사용되는 작업 중 하나인 컨테이너화된 웹서버를 쿠버네티스에 배포하는 과정을 경험해 보겠습니다. 우리의 첫 번째 손님으로 초대할 애플리케이션은 바로 Nginx(엔진엑스) 입니다. Nginx는 가볍고 빠르며 안정성이 뛰어나 웹서버, 리버스 프록시, 로드 밸런서 등 다양한 용도로 전 세계 수많은 서비스에서 활용되고 있는 매우 인기 있는 오픈소스 소프트웨어입니다.
다행히도 Nginx는 이미 공식적으로 컨테이너 이미지 형태로 잘 패키징되어 Docker Hub과 같은 공개 컨테이너 레지스트리에 제공되고 있으므로, 우리가 직접 컨테이너 이미지를 빌드할 필요 없이 바로 가져다 사용할 수 있습니다. 이제 쿠버네티스에게 “이 Nginx 컨테이너 이미지를 사용하여 웹서버를 실행시켜줘!”라고 요청하는 방법을 배워보겠습니다.
5.4.1.1 kubectl create deployment 명령어 사용
쿠버네티스에서 애플리케이션을 배포하는 가장 일반적이고 권장되는 방법 중 하나는 디플로이먼트(Deployment)라는 리소스 객체를 사용하는 것입니다. 디플로이먼트는 여러분이 원하는 애플리케이션의 상태(Desired State), 예를 들어 ‘Nginx 컨테이너를 3개의 복제본(Replica)으로 실행하고 싶다’와 같이, 를 선언적으로 정의하면 쿠버네티스가 현재 상태를 이 원하는 상태와 일치하도록 지속적으로 관리해주는 강력한 기능을 제공합니다. 롤링 업데이트나 롤백과 같은 애플리케이션 배포 전략도 디플로이먼트를 통해 손쉽게 구현할 수 있습니다.
일반적으로 디플로이먼트는 YAML 형식의 매니페스트 파일을 작성하여 kubectl apply -f <파일명.yaml> 명령으로 생성하지만, 간단한 테스트나 학습 목적을 위해서는 kubectl 명령줄 도구가 제공하는 간편 생성 명령어를 사용할 수도 있습니다. 우리는 이번 첫 배포 실습에서 바로 이 간편 명령어를 활용하여 Nginx 디플로이먼트를 생성해 보겠습니다.
터미널을 열고, 이전 섹션에서 kubectl이 로컬 쿠버네티스 클러스터(Rancher Desktop 또는 직접 설치한 K3s)를 올바르게 가리키고 있는지 확인한 상태에서 다음 명령어를 입력해 보세요.
자, 이 한 줄의 명령어가 어떤 마법을 부리는 걸까요? 함께 자세히 살펴보겠습니다.
- kubectl: 쿠버네티스 클러스터와 상호작용하기 위한 우리의 만능 도구입니다.
- create deployment: “새로운 디플로이먼트 리소스를 생성하라”는 명령어입니다. create는 새로운 리소스를 만드는 일반적인 동사이며, deployment는 생성할 리소스의 종류를 지정합니다.
- nginx-deployment: 우리가 생성할 디플로이먼트의 이름을 지정하는 부분입니다. 이 이름은 나중에 이 디플로이먼트를 조회하거나 관리할 때 사용되므로, 의미 있는 이름을 부여하는 것이 좋습니다. 여기서는 “nginx-deployment”라고 명명했습니다.
- -image=nginx: 이 부분이 매우 중요합니다. 바로 어떤 컨테이너 이미지를 사용하여 이 디플로이먼트를 실행할 것인지 지정하는 옵션입니다. 여기에 nginx라고만 적으면, 쿠버네티스는 기본적으로 공개 컨테이너 레지스트리인 Docker Hub에서 최신 버전(latest tag)의 공식 Nginx 이미지를 찾아서 가져옵니다. 만약 특정 버전의 이미지를 사용하고 싶다면 nginx:1.25와 같이 이미지 이름 뒤에 태그를 명시할 수도 있고, Docker Hub가 아닌 다른 레지스트리(예: gcr.io/my-project/my-nginx:v1)에 있는 이미지를 사용하려면 전체 이미지 경로를 적어주면 됩니다.
이 명령어를 실행하면, kubectl은 쿠버네티스 API 서버에 “nginx-deployment”라는 이름으로, nginx 컨테이너 이미지를 사용하는 디플로이먼트를 생성해달라는 요청을 보냅니다. 요청이 성공적으로 전달되면, 터미널에는 다음과 같은 메시지가 출력될 것입니다.
“deployment.apps/nginx-deployment가 생성되었습니다.”라는 이 간단한 메시지는 이제 쿠버네티스 클러스터 내부에서 Nginx 웹서버를 실행하기 위한 작업이 시작되었음을 알리는 신호탄입니다! 쿠버네티스는 이 디플로이먼트 정의에 따라 Nginx 컨테이너를 실행할 파드(Pod)를 생성하고, 이 파드가 정상적으로 동작하도록 관리하는 임무를 시작합니다. 기본적으로 디플로이먼트는 하나의 복제본, 즉 하나의 파드를 생성하도록 설정됩니다.
5.4.1.2 배포 상태 확인
명령 한 줄로 Nginx 디플로이먼트를 생성했지만, 정말로 우리의 요청대로 Nginx 웹서버가 쿠버네티스 클러스터 내부에 잘 배포되고 실행되고 있는지 확인하는 과정이 필요합니다. 마치 택배를 보낸 후 배송 추적을 하는 것처럼, 우리도 쿠버네티스에게 현재 상황을 물어봐야 합니다. 이를 위해 kubectl get 명령어를 사용하여 관련 리소스들의 상태를 조회해 보겠습니다.
- 디플로이먼트 상태 확인 (kubectl get deployment 또는 kubectl get deployments 또는 kubectl get deploy):먼저 우리가 방금 생성한 nginx-deployment라는 이름의 디플로이먼트가 어떤 상태인지 확인해 봅시다. 터미널에 다음 명령어를 입력합니다.또는 특정 이름을 지정하지 않고 현재 네임스페이스(기본적으로 default 네임스페이스)에 있는 모든 디플로이먼트 목록을 보려면 다음과 같이 실행할 수도 있습니다.클립보드에 복사성공적으로 실행되었다면, 다음과 유사한 표 형태의 출력을 볼 수 있습니다. (READY, UP-TO-DATE, AVAILABLE, AGE 값은 환경과 시간에 따라 조금씩 다를 수 있습니다.클립보드에 복사이 출력에서 각 열이 의미하는 바는 다음과 같습니다.클립보드에 복사
- NAME: 디플로이먼트의 이름입니다. 우리가 지정한 nginx-deployment가 보이죠.
- READY: 현재 사용 가능한(Ready) 복제본의 수 / 원하는(Desired) 복제본의 수를 나타냅니다. 1/1은 우리가 하나의 Nginx 인스턴스를 원했고, 현재 그 하나가 성공적으로 준비되었음을 의미합니다. 만약 0/1이라면 아직 준비 중이거나 문제가 발생했을 수 있습니다.
- UP-TO-DATE: 최신 버전의 템플릿(파드 명세)으로 업데이트된 복제본의 수를 보여줍니다.
- AVAILABLE: 사용자 요청을 처리할 수 있는 상태의 복제본 수를 나타냅니다.
- AGE: 디플로이먼트가 생성된 후 경과된 시간입니다.
여기서 READY 항목이 1/1 (또는 여러분이 설정한 복제본 수와 일치하는 값)이고, AVAILABLE 항목이 0보다 큰 값으로 표시된다면, 디플로이먼트 자체는 성공적으로 목표 상태에 도달했다고 판단할 수 있습니다.
- 파드 상태 확인 (kubectl get pods 또는 kubectl get po):디플로이먼트는 실제로 애플리케이션 컨테이너를 실행하는 더 작은 단위인 파드(Pod)를 관리합니다. 따라서 디플로이먼트가 정상이라고 해도, 그 아래에서 실제로 Nginx 컨테이너를 담고 있는 파드가 건강하게 실행 중인지 확인하는 것이 중요합니다. 터미널에 다음 명령어를 입력하여 현재 네임스페이스의 모든 파드 목록과 상태를 조회해 봅시다.Nginx 디플로이먼트가 생성한 파드를 확인하면, 다음과 유사한 출력을 볼 수 있습니다. 파드의 이름은 디플로이먼트 이름(nginx-deployment) 뒤에 임의의 문자열(해시값)이 붙는 형태로 자동 생성됩니다.클립보드에 복사클립보드에 복사
이 출력에서 각 열의 의미는 다음과 같습니다.
- NAME: 파드의 고유한 이름입니다.
- READY: 파드 내의 컨테이너 중 준비된(Ready) 컨테이너의 수 / 파드 내 전체 컨테이너의 수를 나타냅니다. Nginx 파드는 단일 컨테이너로 구성되므로 1/1이 정상입니다.
- STATUS: 파드의 현재 상태를 보여줍니다. Running 이 바로 우리가 기대하는 상태입니다! 이는 파드 내의 Nginx 컨테이너가 성공적으로 시작되어 실행 중임을 의미합니다. 만약 Pending(생성 대기 중), ContainerCreating(컨테이너 생성 중), ImagePullBackOff(이미지 가져오기 실패), CrashLoopBackOff(컨테이너 비정상 종료 반복) 등 다른 상태가 보인다면 문제가 발생했을 가능성이 있으므로, kubectl describe pod <파드이름> 이나 kubectl logs <파드이름> 명령어를 사용하여 자세한 원인을 파악해야 합니다. (이러한 디버깅 방법은 이후 장에서 더 자세히 다룹니다.)
- RESTARTS: 파드 내의 컨테이너가 재시작된 횟수입니다. 정상적인 상황에서는 0이어야 합니다. 이 숫자가 계속 증가한다면 컨테이너에 문제가 있음을 나타냅니다.
- AGE: 파드가 생성된 후 경과된 시간입니다.
kubectl get pods 결과에서 Nginx 파드의 STATUS가 Running이고 READY가 1/1로 표시된다면, 마침내 우리의 첫 번째 Nginx 웹서버가 쿠버네티스 클러스터 내부에서 성공적으로 실행되고 있음을 확실하게 확인한 것입니다.
이제 우리는 kubectl create deployment라는 간단한 명령어를 통해 쿠버네티스에게 애플리케이션 배포를 요청하고, kubectl get deployment와 kubectl get pods 명령어를 통해 그 결과를 확인하는 기본적인 흐름을 경험했습니다. 이는 쿠버네티스에서 애플리케이션을 다루는 가장 근본적인 상호작용 방식이며, 앞으로 여러분이 더 복잡한 애플리케이션을 배포하고 관리하는 모든 과정의 기초가 될 것입니다.
하지만 아직 한 가지 중요한 단계가 남아있습니다. 현재 Nginx 웹서버는 쿠버네티스 클러스터 내부에서만 실행되고 있을 뿐, 외부의 우리 웹 브라우저에서는 아직 접속할 방법이 없습니다. 다음 절에서는 이 Nginx 웹서버를 외부 세계와 연결하는 방법을 알아보겠습니다.