컨테이너가 많아지면 어떻게 되나요. 어떤 서버에 어떤 앱을 띄웠는지 헷갈립니다. 한 서버가 죽으면 그 안의 앱도 같이 죽습니다. 트래픽이 몰리면 손으로 복제본 수를 늘려야 합니다. 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 링크는 영상 설명란에서 확인하세요.
자주 묻는 질문 (FAQ)
Q1. Docker Compose로 충분한데 왜 Kubernetes가 필요한가요?
Compose는 단일 호스트에서는 훌륭하지만 컨테이너가 죽었을 때 자동으로 다시 띄우거나, 트래픽에 맞춰 복제본 수를 조절하거나, 여러 서버에 분산하는 일은 하지 못합니다. 컨테이너 수가 많아지거나 서버가 여러 대가 되면 k3s가 유리합니다.
Q2. 풀 Kubernetes 대신 k3s를 쓰는 이유는?
모든 구성 요소가 단일 바이너리에 들어 있고, etcd 대신 SQLite를 기본 저장소로 써서 512MB 메모리에서도 동작합니다. 작은 VPS 한 대에 올릴 수 있을 만큼 가볍습니다.
Q3. 설치는 얼마나 복잡한가요?
curl -sfL https://get.k3s.io | sh – 한 줄이면 끝납니다. 설치 후 sudo kubectl get nodes로 노드가 Ready 상태인지 확인하면 되고, kubeconfig는 /etc/rancher/k3s/k3s.yaml에 생성됩니다.
Q4. 파드가 죽으면 어떻게 되나요?
디플로이먼트가 선언된 복제본 수를 유지하므로 파드를 강제로 지워도 즉시 새 파드가 뜹니다. 이것이 자가 치유입니다. 트래픽이 몰리면 kubectl scale deployment nginx-deploy –replicas=5처럼 복제본 수만 바꾸면 됩니다.



















