가상화 도구인 Vagrant와 VirtualBox를 사용하여 로컬 환경에 쿠버네티스(Kubernetes, K8s) 클러스터를 구성해보자.
1. 가상화 도구 이해하기 - Vagrant, VirtualBox
쿠버네티스 클러스터를 자동화된 방식으로 구축하기 위해 아래 도구들이 로컬 머신에 미리 설치되어 있어야 한다.
- VirtualBox: 가상 머신(VM)을 생성하고 실행하는 하이퍼바이저
- Vagrant: 설정 파일을 통해 가상 머신 환경을 자동으로 생성하고 배포하는 도구
- Vagrantfile: 마스터 노드와 워커 노드의 사양, 네트워크 IP, 호스트네임 등이 정의된 파일
먼저 Vagrant와 VirtualBox 두 도구의 관계를 이해해야 한다.
- Vagrant : 가상 머신을 제어하는 관리 도구다. 가상 머신을 직접 생성하는 능력은 없지만, Vagrantfile이라는 설계도를 바탕으로 가상화 엔진에 명령을 내린다.
- VirtualBox : Vagrant의 명령을 받아 실제로 가상 머신(VM)을 생성하고 자원을 할당하는 하이퍼바이저다. 이를 '프로바이더(Provider)'라고 부른다.
Vagrant는 VirtualBox 외에도 AWS, Docker, VMware 등을 프로바이더로 사용할 수 있지만, 로컬 환경의 재현성과 오픈소스라는 장점 때문에 VirtualBox와의 조합이 가장 널리 쓰인다.

vagrant up을 실행하면 가상 머신(VM)이 호스트 PC의 RAM(메모리)에 적재되어 활성화된 상태가 된다.
PC를 끄거나 재부팅해야 한다면, 아래 명령어 중 하나를 먼저 실행하는 습관을 들이는 것이 좋다.
- vagrant halt : VM을 안전하게 종료한다. (디스크에 상태 저장 안 함, 다음 부팅 시 새로 시작).
- vagrant suspend : 현재 메모리 상태를 디스크에 스냅샷처럼 저장한다. 다시 up 했을 때 작업하던 창 그대로 가장 빠르게 복구된다.
2. 클러스터 구축을 위한 사전 준비
실습을 시작하기 위해 로컬 환경에 다음 요소들이 설치 및 준비되어 있어야 한다.
- VirtualBox & Vagrant 설치: 각 공식 홈페이지에서 운영체제에 맞는 버전을 다운받아 설치한다.
- 리소스 확보: 마스터 노드(RAM 3GB) 1대와 워커 노드 2대를 위해 최소 8GB 이상의 여유 메모리가 필요하다.
- Vagrantfile 정의: 노드별 IP(192.168.57.100~102), 호스트네임, 그리고 쿠버네티스 초기화 스크립트(bootstrap.sh) 경로가 설정된 파일이 작업 디렉토리에 존재해야 한다.
📌Vagrant 설정파일에 대한 내용은 별도의 포스팅으로 정리해 두었다.
3. 클러스터 프로비저닝 및 네트워크 설정
Vagrant를 사용하여 정의된 명세에 따라 클러스터를 생성한다.
# Vagrantfile이 있는 디렉터리에서 가상 머신 일괄 생성 및 실행
vagrant up
# 마스터 노드 접속 및 루트 권한 획득
vagrant ssh master
vagrant@k8s-master:~$ sudo su
# Calico CNI(컨테이너 네트워크 인터페이스) 설치
root@k8s-master:/home/vagrant#
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
vagrant up은 Vagrantfile을 읽어 VirtualBox 위에 지정된 운영체제(Ubuntu 20.04 등)를 올리고, 내부 스크립트를 실행하여 쿠버네티스 환경을 구성한다.
마스터 노드는 192.168.57.100, 워커 노드들은 192.168.57.101~102 대역의 사설 IP를 할당받아 상호 통신이 가능한 상태가 된다.
- vagrant up: Vagrantfile에 명시된 3대의 VM을 동시에 띄우고, 각 노드에 kubeadm, kubelet 등을 자동 설치한다.
- CNI (Container Network Interface): 파드(Pod) 간의 통신 경로를 구성하는 드라이버다. Calico를 설치하면 calico-node, calico-kube-controllers 등이 실행되며 파드에 고유 IP를 할당하고 라우팅을 관리한다. 각 노드에 라우팅 정보가 설정되어 서로 다른 노드에 있는 파드끼리 고유 IP로 통신이 가능해진다.
- kubectl apply -f: 선언적(Declarative) 방식을 사용하여 YAML 파일에 정의된 리소스의 '최종 상태'를 클러스터에 강제한다.
🟢클러스터 구조도

4. 파드(Pod)와 디플로이먼트(Deployment) 관리
쿠버네티스에서 컨테이너를 실행하는 방식은 크게 '단독 실행'과 '관리형 실행'으로 나뉜다.
# 1. 단독 파드 생성 (webser)
kubectl run webser --image=nginx:1.14 --port 80
# 2. 디플로이먼트 생성 (main-ui, 복제본 3개)
kubectl create deployment main-ui --image=httpd:latest --replicas=3
# 3. 디플로이먼트 스케일링 (파드 5개로 확장)
kubectl scale deploy web-ser --replicas=5
- Pod: 쿠버네티스의 가장 기본적인 실행 단위다. kubectl run으로 생성한 파드는 도커의 docker run과 비슷하지만, 장애 발생 시 자동으로 다시 살아나지 않는다.
- Deployment: 파드의 개수(Replicas)와 배포 버전(업데이트)을 관리하는 매니저 객체다. 도커 스웜의 service와 유사한 역할을 하며, 노드 장애 시 파드를 다른 노드로 옮겨 실행하는 Self-healing 기능을 제공하기에 지정된 수의 파드가 항상 실행되도록 보장한다.
- Scaling: 부하 증가 시 scale 명령어로 즉각적인 수평 확장(Scale-out)이 가능하다.
# 실시간 파드 배치 상태 확인
watch kubectl get po -o wide

🟢스케일링 동작 시퀀스

5. 쿠버네티스 3대 네트워크 계층과 서비스(Service)
실습 결과에서 확인할 수 있는 세 가지 주요 IP 대역의 역할을 이해하는 것이 중요하다.
| 종류 | 예시 대역 | 역할 |
| Node IP | 192.168.57.0/24 | 물리적/가상 머신 자체가 갖는 주소. 노드 간 통신에 사용. |
| Pod IP | 10.244.0.0/16 | 파드들이 갖는 고유 주소. CNI에 의해 할당되며 파드 간 상호 연결에 사용. |
| Cluster IP | 10.10.0.0/8 | 서비스(Service) 객체가 갖는 가상 IP. 외부/내부 연결의 단일 진입점 (VIP) 역할. |
🌀서비스(Service)와 로드 밸런싱
파드는 유동적인 IP를 가지므로 직접 통신하는 것은 위험하다.
따라서 Service 객체를 생성하여 여러 파드를 하나로 묶고 고정된 Virtual IP(VIP)를 부여한다.
서비스는 파드들에 대해 라운드 로빈(Round Robin) 방식의 로드 밸런싱을 수행하며, 외부 요청을 적절한 워커 노드의 파드로 배분한다.

- 단일 진입점 제공: 서비스는 파드들이 교체되어도 변하지 않는 고정된 ClusterIP를 가진다. 클라이언트는 파드의 개별 IP가 아닌 서비스의 VIP만 알면 통신이 가능하다.
- 라운드 로빈(Round Robin): 서비스는 연결된 파드 그룹(엔드포인트) 리스트를 관리하며, 요청이 들어올 때마다 순차적으로 파드들에게 배분한다. 이를 통해 특정 파드에 부하가 집중되는 것을 방지한다.
- 노드 간 분산: 서비스는 요청을 전달할 때 해당 파드가 어떤 워커 노드에 있는지는 상관하지 않는다. 클러스터 네트워크(CNI)의 도움을 받아 Worker Node 1과 Worker Node 2에 흩어져 있는 파드들에 골고루 트래픽을 전달한다.
6. 결론
쿠버네티스는 인프라의 모든 구성 요소를 객체(Object)화하여 관리한다.
Vagrant를 통해 구축된 클러스터 위에서 Deployment와 Service를 활용함으로써, 개발자는 개별 컨테이너의 위치나 상태에 얽매이지 않고 전체 시스템의 '상태'를 정의하는 것만으로 안정적인 서비스를 운영할 수 있다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [k8s] Vagrant 설정파일 분석 (0) | 2026.01.30 |
|---|---|
| [k8s] 내 파드는 잘 연결되었을까? 쿠버네티스 서비스(Service) 상태 확인 (0) | 2026.01.29 |
| [k8s] VMware 우분투 머신 세 대로 쿠버네티스 클러스터 구축하기 (+트러블 슈팅) (0) | 2026.01.23 |
| [Docker Swarm] 도커 스택(Stack)을 배포해보자 (0) | 2026.01.16 |
| [Docker Swarm] 데이터 관리: 시크릿(secret)과 컨피그(config) (0) | 2026.01.16 |