k3s 경량 Kubernetes로 VPS 미니 클러스터 구축: 단일 노드 시작 완벽 가이드 (2026)

컨테이너가 많아지면 어떻게 되나요. 어떤 서버에 어떤 앱을 띄웠는지 헷갈립니다. 한 서버가 죽으면 그 안의 앱도 같이 죽습니다. 트래픽이 몰리면 손으로 복제본 수를 늘려야 합니다. Kubernetes는 이런 운영을 엔진에 맡기는 오케스트레이션 도구입니다. 다만 풀 Kubernetes는 무겁습니다. 이 글에서는 단일 VPS에 k3s라는 경량 Kubernetes를 올려 입문하는 완벽 가이드를 다룹니다.

Kubernetes가 해결하는 문제

W31에서 Docker Compose로 웹·DB·캐시 컨테이너를 한 번에 올렸습니다. Compose는 단일 호스트에서는 훌륭합니다. 하지만 컨테이너가 죽었을 때 자동으로 다시 띄워주지는 않습니다. 트래픽에 맞춰 복제본 수를 자동 조절하지도 않습니다. 여러 서버에 컨테이너를 분산하는 것도 직접 해야 합니다.

Kubernetes는 이런 것들을 선언적으로 처리합니다. “nginx 복제본 2개가 항상 떠 있어야 해”라고 YAML로 적어두면, 컨테이너가 죽어도 자동으로 다시 띄워주고 서버 자원에 맞춰 분산합니다.

핵심 개념 3가지 — 파드·디플로이먼트·서비스

  • 파드(Pod): Kubernetes의 최소 실행 단위. 보통 컨테이너 한 개를 담습니다.
  • 디플로이먼트(Deployment): “파드를 몇 개 유지할지”를 선언하는 컨트롤러. 복제본 수, 재시작 정책, 롤링 업데이트를 관리합니다.
  • 서비스(Service): 파드를 외부에 노출하거나 파드 간 통신을 중개하는 안정적인 엔드포인트. 파드는 언제든 재생성되어 IP가 바뀌므로, 서비스가 고정 주소를 제공합니다.

왜 k3s인가 — 경량 Kubernetes의 등장

풀 Kubernetes는 etcd라는 분산 키-값 저장소, 컨트롤플레인 여러 컴포넌트로 구성됩니다. 배우는 데도, 리소스도 무겁습니다. k3s는 Rancher Labs가 만든 경량 Kubernetes입니다.

  • 단일 바이너리: 모든 구성 요소가 하나의 실행 파일에 들어 있습니다.
  • SQLite 기본 저장소: etcd 대신 SQLite를 써서 단일 노드에서 가볍게 동작합니다(외부 DB로 확장도 가능).
  • 512MB 메모리면 동작: 작은 VPS 한 대에 올라갑니다. W32 Redis와 같은 서버에 공존할 수 있을 만큼 가볍습니다.
  • 엣지·IoT·단일 노드: 사이드 카 빌드, CI runner, 개발 클러스터 등에 널리 쓰입니다.

1. 단일 VPS에 k3s 설치

설치는 공식 스크립트 한 줄입니다.

curl -sfL https://get.k3s.io | sh -

# 확인
sudo systemctl status k3s
sudo kubectl get nodes
# NAME              STATUS   ROLES                  AGE   VERSION
# your-vps          Ready    control-plane,master   30s   v1.29.0+k3s1

kubeconfig는 /etc/rancher/k3s/k3s.yaml에 생깁니다. kubectl이 즉시 사용 가능합니다.

2. kubectl 기본 조작

Docker(W15) 명령어와 비슷하지만, 대상이 “로컬 컨테이너”가 아니라 “클러스터 전체의 파드”입니다.

# 파드 목록
kubectl get pods -A

# 디플로이먼트
kubectl get deployments

# 상세 정보
kubectl describe pod <name>

# 로그
kubectl logs <pod-name>

# 파드 안에서 명령 실행
kubectl exec -it <pod-name> -- /bin/sh

# 리소스 삭제
kubectl delete -f app.yaml

3. 디플로이먼트 + 서비스 배포

YAML로 nginx 복제본 2개를 선언합니다.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
kubectl apply -f deployment.yaml

# 파드 2개 확인
kubectl get pods
# nginx-deploy-xxxx-aaaa   Running
# nginx-deploy-xxxx-bbbb   Running

파드 하나를 강제로 지워봅니다:

kubectl delete pod nginx-deploy-xxxx-aaaa
# 디플로이먼트가 즉시 새 파드를 띄움 → "자가 치유"

트래픽이 몰리면 복제본 수만 바꿉니다:

kubectl scale deployment nginx-deploy --replicas=5

4. Ingress + Traefik — 도메인 연결

k3s는 Traefik을 기본 Ingress 컨트롤러로 내장합니다. W29 Nginx 리버스 프록시와 같은 역할을 클러스터 안에서 수행합니다.

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80

Traefik이 외부 트래픽을 받아 nginx-svc로 라우팅합니다. cert-manager를 붙이면 Let’s Encrypt 자동 발급까지 가능합니다.

5. Ansible과 결합 — 설치 자동화

W33에서 다룬 Ansible playbook으로 k3s 설치를 자동화할 수 있습니다. role 하나만 있으면 새 VPS에 k3s를 한 번에 올릴 수 있습니다.

# roles/k3s/tasks/main.yml
- name: k3s 설치
  shell: curl -sfL https://get.k3s.io | sh -
  args:
    creates: /usr/local/bin/k3s

- name: kubeconfig 복사
  copy:
    src: /etc/rancher/k3s/k3s.yaml
    dest: "{{ ansible_env.HOME }}/.kube/config"
    remote_src: yes
    mode: '0600'

이렇게 하면 서버 10대에 k3s를 동시에 올릴 수 있습니다. W33 멱등성 패턴 그대로 적용됩니다.

k3s vs Docker Compose — 언제 뭘 쓸까

구분 Docker Compose (W31) k3s (W34)
적합 규모 단일 호스트, 소규모 서비스 단일~다중 노드, 컨테이너 수가 많을 때
자가 치유 restart: always (제한적) 디플로이먼트가 항상 복제본 유지
스케일링 수동 scale kubectl scale, HPA 자동 확장
학습 비용 낮음 (YAML) 중간~높음 (Kubernetes 개념)

한 대 서버에 서비스 몇 개면 Compose가 빠르고 단순합니다. 컨테이너가 많아지거나 여러 서버로 확장하면 k3s가 유리합니다.

마무리 — VPS 데브옵스 시리즈 21주 피날레

k3s로 단일 VPS에 경량 Kubernetes를 올리는 방법을 다뤘습니다. 설치 한 줄, YAML 선언으로 자가 치유와 스케일링을 확보했습니다. W33 Ansible과 결합하면 여러 서버로도 쉽게 확장할 수 있습니다.

이것으로 VPS 데브옵스 시리즈 21주차(W14-W34)가 마무리됩니다. W32 Redis 객체 캐시, W33 Ansible playbook과 함께 이 3차 배치를 마무리합니다. 이전 Docker Compose 프로덕션 스택(W31), PostgreSQL 백업 자동화(W30), Nginx 리버스 프록시(W29)도 함께 참고하세요.

VPS 데브옵스 시리즈 피날레. 추천 VPS 링크는 영상 설명란에서 확인하세요.

관련 글

📎 이 영상의 발표 자료

누구나 무료로 다운로드할 수 있습니다.

Leave a Comment