Cài đặt Kubernetes nhẹ k3s trên VPS Ubuntu 24.04

SSH vào VPS mới cài Ubuntu 24.04, bạn gõ một lệnh, đợi 30 giây, và đã có một cluster Kubernetes chạy. Không cần kubeadm, không cần etcd phức tạp, không cần 4GB RAM. Đó là k3s, bản phân phối Kubernetes được Rancher (nay thuộc SUSE) phát triển, đóng gói thành một binary riêng biệt dưới 100MB. Bài này sẽ hướng dẫn bạn cài đặt k3s trên một VPS Ubuntu 24.04, add thêm worker node, và deploy một ứng dụng thử nghiệm.
Yêu cầu trước khi bắt đầu
- Một VPS Linux chạy Ubuntu 24.04 LTS, tối thiểu 1 vCPU, 1 GB RAM (vẫn chạy được ở 512 MB nếu không chạy workload nặng).
- Quyền root hoặc user sudo.
- Port 6443 (Kubernetes API) mở trên firewall nếu bạn cần truy cập từ ngoài, hoặc để trong mạng nội bộ.
- Hiểu cơ bản về container và Pod, bài này là hands-on, không giải thích lại toàn bộ Kubernetes concepts.
Tại sao chọn k3s thay vì Kubernetes đầy đủ trên VPS
Kubernetes chính thống (kubeadm) yêu cầu tối thiểu 2 vCPU, 2 GB RAM cho control plane, chưa kể etcd ngốn thêm tài nguyên. Với một VPS phổ thông 2 GB RAM, bạn gần như không còn dư để chạy ứng dụng. k3s giải quyết vấn đề này bằng cách:
- Thay etcd bằng SQLite (mặc định) hoặc embedded etcd, giảm memory footprint từ 300-500 MB xuống còn ~100 MB.
- Gộp các component (kube-controller-manager, kube-scheduler, kube-apiserver) vào một process riêng biệt.
- Loại bỏ các plugin không cần thiết: cloud provider, storage driver, legacy alpha API.
- Giảm binary từ 300 MB (kubelet+…) xuống còn ~70 MB.
Kết quả: k3s khởi động xong chỉ tốn ~250 MB RAM cho control plane. Bạn có thể chạy cả một cluster Kubernetes thật trên VPS 1 GB RAM mà vẫn dư để deploy ứng dụng.
Bước 1 - Cài đặt k3s server (control plane)
k3s cài bằng một script riêng biệt. SSH vào VPS với user có sudo, chạy:
curl -sfL https://get.k3s.io | sh -
Script tự động detect OS, tải binary, tạo systemd service và khởi động. Sau khoảng 30-60 giây, kiểm tra trạng thái:
sudo systemctl status k3s
Kết quả mong đợi: active (running). Kiểm tra node đã join:
sudo k3s kubectl get node
Bạn sẽ thấy một node control-plane với trạng thái Ready. File kubeconfig nằm tại /etc/rancher/k3s/k3s.yaml, bạn dùng file này để connect từ máy local nếu cần.
Bước 2 - Cấu hình k3s cho production (tuỳ chọn)
Mặc định, k3s chạy với SQLite, Traefik làm Ingress Controller, và ServiceLB cho LoadBalancer. Nếu bạn muốn tinh chỉnh, tạo file cấu hình:
sudo mkdir -p /etc/rancher/k3s
sudo nano /etc/rancher/k3s/config.yaml
Ví dụ cấu hình cho cluster ổn định:
write-kubeconfig-mode: 644
disable:
- traefik
- servicelb
kube-controller-manager-arg:
- "terminated-pod-gc-threshold=10"
kubelet-arg:
- "max-pods=50"
Ở đây mình disable Traefik để dùng Ingress Controller khác (như Nginx Ingress), và disable ServiceLB vì VPS chỉ có 1 IP. Restart k3s để áp dụng:
sudo systemctl restart k3s
Verify: kiểm tra pod nào đang chạy:
sudo k3s kubectl get pod -A
Lúc này sẽ không thấy Traefik pod nữa.
Bước 3 - Add worker node vào cluster
Để mở rộng cluster, bạn cần thêm VPS thứ hai làm worker. Trên node server (control plane), lấy token kết nối:
sudo cat /var/lib/rancher/k3s/server/node-token
Token có dạng K10.... Lưu lại. Trên VPS worker (cùng OS), chạy lệnh:
curl -sfL https://get.k3s.io | K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> sh -
Thay <server-ip> bằng IP thật của VPS server. Sau 30 giây, kiểm tra từ server:
sudo k3s kubectl get node
Bạn sẽ thấy 2 node, một có role control-plane, một <none> (worker).
Mở rộng với 3-5 worker: k3s không giới hạn số worker, bạn có thể add 10 node nếu có dedicated server dư tài nguyên. Mỗi worker cần node token giống nhau.
Bước 4 - Deploy ứng dụng thử nghiệm lên k3s
Tạo file nginx-test.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
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-test
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Apply lên cluster:
sudo k3s kubectl apply -f nginx-test.yaml
Kiểm tra deployment và service:
sudo k3s kubectl get deploy,svc,pod -o wide
Service dạng NodePort sẽ expose port ngẫu nhiên (30000-32767). Xem port qua lệnh sudo k3s kubectl get svc nginx-test. Truy cập http://<vps-ip>:<node-port> trên trình duyệt, nếu thấy trang Nginx mặc định, cluster hoạt động.
Lưu ý bảo mật: port NodePort mở trên tất cả IP của VPS. Nếu bạn chỉ muốn access nội bộ, thay type bằng ClusterIP và dùng kubectl port-forward để test.
Bảng thông số k3s server
| Thành phần | Mặc định | Ghi chú |
|---|---|---|
| API Server port | 6443 | Mở firewall nếu muốn truy cập từ ngoài |
| Data store | SQLite | Chỉ cho single-server; multi-server cần etcd hoặc embedded etcd |
| Ingress Controller | Traefik (có thể disable) | Thay bằng Nginx Ingress nếu quen |
| Service LoadBalancer | ServiceLB (MetalLB-style) | Chỉ hữu ích với nhiều IP public |
| Kubeconfig | /etc/rancher/k3s/k3s.yaml | Dùng kubectl từ ngoài |
| Node token | /var/lib/rancher/k3s/server/node-token | Để add worker |
Xử lý lỗi thường gặp
Lỗi: k3s service không start, log báo 'failed to load config'
Kiểm tra file cấu hình YAML có bị sai indent không. Chạy journalctl -u k3s --no-pager -n 50 xem log cụ thể. Lỗi phổ biến: thiếu khoảng trắng trong kubelet-arg.
Lỗi: worker node không join được, '403 Forbidden'
Kiểm tra token có chính xác không, và server IP có ping được từ worker không. Nếu dùng firewall (ufw), mở port 6443 trên server: sudo ufw allow 6443.
Lỗi: pod pending vì không đủ CPU/RAM
k3s mặc định dành một phần tài nguyên cho system. Nếu VPS của bạn RAM thấp (dưới 1 GB), hãy giảm replicas xuống 1 và kiểm tra resource request trong deployment. Cân nhắc thuê gói VPS NVMe 2GB RAM để thoải mái chạy thêm vài pod nữa.
Câu hỏi thường gặp
k3s có khác gì Kubernetes chính thống không?
Có, k3s là bản phân phối Kubernetes được chứng nhận CNCF, đảm bảo tương thích API đầy đủ. Bạn có thể dùng kubectl, Helm, và tất cả manifest K8s chuẩn đều chạy trên k3s. Khác biệt chính là thay etcd bằng SQLite và gộp component để giảm tài nguyên.
k3s có phù hợp cho production không?
Có, nhiều công ty dùng k3s cho edge computing, IoT, và CI/CD clusters. Rancher (SUSE) chính thức hỗ trợ k3s. Tuy nhiên, với multi-server production nên dùng embedded etcd thay SQLite để tránh single point of failure.
k3s có thể nâng cấp lên Kubernetes chính thống không?
Không có tool migration tự động. Bạn phải deploy lại ứng dụng từ đầu lên cluster K8s mới. Vì vậy, nếu có kế hoạch mở rộng lên cluster lớn, nên bắt đầu bằng kubeadm hoặc thử nghiệm với k3s nhẹ trước.
k3s có hỗ trợ GPU trên VPS không?
Có, k3s support GPU scheduling qua device plugin. Nhưng VPS thường không có GPU vật lý. Nếu bạn cần GPU, hãy dùng dedicated server có card đồ hoạ.
Bài viết liên quan
- Cách cài Docker trên VPS Ubuntu, chi tiết từ A đến Z
- Triển khai CI/CD lên VPS với GitHub Actions và SSH
- Quản lý container với Portainer trên VPS
- Docker networking: bridge, host, overlay, khác nhau thế nào?


