구형 PC 3대로 Kubernetes 클러스터 — k3s 1분 설치 가이드 (2026)

서버 한 대로 서비스를 돌리면, 그 서버가 죽는 순간 전부 죽습니다. 서버 3대를 묶으면 한 대가 죽어도 나머지 두 대가 서비스를 이어갑니다. 이게 Kubernetes 클러스터입니다. 근데 Kubernetes는 설치만 해도 반나절이죠. k3s는 이걸 1분으로 줄여줍니다. 이 글에서는 k3s로 3대 노드 클러스터를 구축하는 전체 과정을 정리합니다.

왜 클러스터가 필요한가

서버 한 대로 서비스를 돌리는 단점은 단일 장애점(SPOF, Single Point of Failure)이 생긴다는 겁니다. 그 서버가 죽으면 서비스 전체가 멈춥니다. 하드웨어 고장, 네트워크 끊김, 커널 패닉, 정전 — 언제든 일어날 수 있습니다. 클라우드 벤더의 가용성 보장도 100%가 아닙니다.

서버 3대를 묶으면 한 대가 죽어도 나머지 두 대가 트래픽을 이어받습니다. 사용자는 서비스가 잠깐 느려졌다가 곧 정상 속도로 돌아오는 정도만 느낍니다. 이게 고가용성(High Availability)의 기본 전략입니다. 단순히 여러 대를 두는 게 아니라, 한 대가 죽어도 전체 서비스가 살아 있도록 자동 페일오버되는 구조가 필요합니다.

Kubernetes vs k3s

Kubernetes는 컨테이너 오케스트레이션의 사실상 표준입니다. 여러 대 서버에 컨테이너를 분산 배치하고, 죽으면 다시 띄우고, 트래픽에 따라 늘리거나 줄입니다. 근데 Kubernetes 자체가 너무 무겁습니다. 정식 Kubernetes(kubeadm)는 설치만 해도 반나절, 메모리 2GB 이상을 먹습니다.

k3s는 Rancher Labs에서 만든 경량 Kubernetes 배포판입니다. 단일 바이너리로 되어 있어서 설치가 1분 이내에 끝납니다. 메모리 512MB만 있으면 돌아갑니다. etcd 대신 내장형 SQLite(또는 외부 DB)를 써서 가볍고, 불필요한 기능(클라우드 벤더 통합, 레거시 API)을 빼서 바이너리 크기를 줄였습니다. 핵심 Kubernetes API는 그대로 지원해서 kubectl 명령이 그대로 동작합니다.

항목 kubeadm (정식) k3s (경량)
설치 시간 반나절 1분 이내
최소 메모리 2GB 이상 512MB
바이너리 크기 수백 MB 약 50MB (단일 바이너리)
외부 의존성 etcd, CNI 등 별도 설치 전부 내장
API 호환성 표준 표준 (kubectl 그대로)
적합 규모 대규모 프로덕션 소규모/엣지/홈서버

Master 노드 설치 (1번 서버)

k3s 설치는 master 노드(컨트롤 플레인) 한 대와 worker 노드 여러 대로 구성됩니다. master 노드에서 클러스터 상태를 관리하고, worker 노드가 실제 워크로드를 실행합니다. master 노드 설치는 정말 한 줄입니다.

# 1번 서버 (master)에서 실행
curl -sfL https://get.k3s.io | sh -

# 설치 확인
sudo k3s kubectl get nodes
# NAME        STATUS   ROLES                  AGE   VERSION
# master-01   Ready    control-plane,master   30s   v1.31.x+k3s1

curl 명령 한 줄이면 k3s 바이너리 다운로드, 설치, systemd 서비스 등록, 클러스터 초기화까지 전부 끝납니다. 설치 직후 master 노드가 Ready 상태로 나옵니다. 클러스터가 살아 있는 겁니다.

worker 노드를 연결하려면 토큰이 필요합니다. master 노드에서 토큰을 확인합니다.

# master 노드에서 토큰 확인
sudo cat /var/lib/rancher/k3s/server/node-token
# 출력: K10xxx...eyJhbGc...

Worker 노드 Join (2번, 3번 서버)

이제 2번 서버와 3번 서버를 클러스터에 연결합니다. master 노드의 IP와 방금 확인한 토큰만 있으면 됩니다. 각 worker 노드에서 다음 명령을 실행합니다.

# 2번, 3번 서버 (worker)에서 실행
# MASTER_IP는 master 노드의 실제 IP로 교체
curl -sfL https://get.k3s.io | \
  K3S_URL=https://MASTER_IP:6443 \
  K3S_TOKEN=K10xxx...eyJhbGc... \
  sh -

# K3S_URL과 K3S_TOKEN 환경변수를 주면
# k3s가 worker 모드로 설치되고 자동으로 master에 연결됨

각 worker 노드에서 설치가 끝나면, master 노드에서 노드 목록을 확인합니다. 3개 노드가 전부 Ready로 나오면 클러스터 완성입니다.

# master 노드에서
sudo k3s kubectl get nodes
# NAME        STATUS   ROLES                  AGE   VERSION
# master-01   Ready    control-plane,master   5m    v1.31.x+k3s1
# worker-01   Ready    <none>                 2m    v1.31.x+k3s1
# worker-02   Ready    <none>                 1m    v1.31.x+k3s1

컨테이너 배포로 검증하기

클러스터가 진짜 동작하는지 확인하려면 컨테이너 하나를 띄워봅니다. nginx 웹서버 3개 복제본을 배포해 봅니다.

# nginx 디플로이먼트 3 replicas
sudo k3s kubectl create deployment nginx --image=nginx --replicas=3

# 파드가 어느 노드에 떴는지 확인
sudo k3s kubectl get pods -o wide
# NAME                     READY   STATUS    NODE
# nginx-xxx-aaa            1/1     Running   worker-01
# nginx-xxx-bbb            1/1     Running   worker-02
# nginx-xxx-ccc            1/1     Running   master-01

3개 파드가 3개 노드에 골고루 분산된 걸 볼 수 있습니다. k3s가 알아서 분산시킨 겁니다. 이제 worker-01 노드를 강제로 끄면, k3s가 그 노드의 파드를 감지하고 다른 노드에서 다시 띄웁니다. 자동 페일오버가 작동합니다.

꿀팁: 구형 PC나 라즈베리파이로도 충분

k3s는 메모리 512MB면 돌아갑니다. 집에 있는 낡은 노트북, 5년 된 미니 PC, 라즈베리파이 4대로도 충분히 클러스터를 만들 수 있습니다. 사실 Kubernetes 학습용으로는 라즈베리파이 클러스터가 아주 좋습니다. 전력 소모도 적고, 크기도 작고, 한눈에 들어옵니다.

각 노드는 최소 2코어 CPU, 2GB RAM, 20GB 디스크 정도면 쾌적합니다. 라즈베리파이 4 4GB 모델 3대면 홈서버 클러스터로 훌륭합니다. 중고로 구하면 3대에 10만 원대면 가능합니다.

주의점: etcd 쿼럼과 가용성

3대 클러스터의 가장 큰 주의점은 etcd 쿼럼입니다. k3s는 기본적으로 SQLite를 쓰지만, HA 구성을 하면 etcd나 MySQL/PostgreSQL을 쓸 수 있습니다. 쿼럼은 과반수(majority)로 동작합니다. 3대 중 2대가 살아 있어야 정상 동작합니다. 2대가 동시에 죽으면 클러스터 전체가 멈춥니다.

그래서 노드 수는 홀수(3, 5, 7)로 두는 게 일반적입니다. 3대면 1대까지 죽어도 되고, 5대면 2대까지 죽어도 됩니다. 4대로 늘리면 쿼럼이 3이 되어 1대까지 죽어도 되는 건 똑같은데 리소스만 더 씁니다. 그래서 홀수가 효율적입니다.

또 한 가지, master 노드와 worker 노드를 분리하는 게 좋습니다. k3s는 기본적으로 master 노드에서도 워크로드를 실행하지만, 프로덕션에서는 master 노드를 컨트롤 플레인 전용으로 두는 게 안정적입니다. 마스터가 무거워지면 클러스터 관리 자체가 느려집니다.

운영 팁: kubectl alias

매번 sudo k3s kubectl을 치면 손이 아픕니다. kubectl 명령을 일반 사용자로 쓸 수 있게 설정합니다.

# k3s kubeconfig를 일반 사용자 홈으로 복사
mkdir -p ~/.kube
sudo k3s kubectl config view --raw > ~/.kube/config
chmod 600 ~/.kube/config

# kubectl 설치 (별도 바이너리)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# alias 설정 (~/.bashrc)
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "alias k=kubectl" >> ~/.bashrc
source ~/.bashrc

# 이제 k get pods 로 짧게 쓸 수 있음

단일 노드 k3s부터 시작하는 분은 k3s 단일 노드 가이드를 먼저 보시면 좋습니다. k3s 공식 문서에도 설치와 설정 상세가 있습니다.

Kubernetes 진입은 k3s로 시작하세요. 설치 1분, 노드 3대, 한 대 죽어도 서비스는 살아 있습니다. DevOps 실전 팁을 매주 받아보시려면 구독해 주세요.

관련 글