Nhắc đến Kubernetes (K8s), dân dev thường nghĩ ngay tới một hệ thống đồ sộ. Nó ngốn cả chục GB RAM và đòi hỏi đội ngũ vận hành chuyên trách. Nhưng nếu trong tay bạn chỉ có 2-3 con VPS giá rẻ (loại 1-2GB RAM) chạy Ubuntu Server thì sao? K3s chính là câu trả lời hoàn hảo: nhẹ, nhanh, đủ tính năng tự phục hồi và chia tải mà không làm nghẽn tài nguyên phần cứng.
1. Quick start: Dựng cụm K3s đa node trong 5 phút
Mô hình lab tối thiểu cần 2 VPS hoặc máy ảo Ubuntu Server (22.04 hoặc 24.04 LTS) thông mạng nội bộ:
- Master Node (Server): IP
192.168.1.10(tối thiểu 1 vCPU, 1.5GB RAM) - Worker Node (Agent): IP
192.168.1.11(tối thiểu 1 vCPU, 1GB RAM)
Bước 1: Cài đặt K3s trên Master Node
SSH vào máy Master và chạy một lệnh duy nhất:
curl -sfL https://get.k3s.io | sh -
K3s sẽ tự tải binary, khởi tạo systemd service và cấu hình sẵn kubectl. Quá trình này thường mất chưa đầy 30 giây.
Tiếp theo, lấy mã token bí mật để cấp quyền cho Worker Node gia nhập cụm:
sudo cat /var/lib/rancher/k3s/server/node-token
(Copy chuỗi token này, ví dụ: K10abcd1234...::server:5678efgh)
Bước 2: Nối Worker Node vào Cluster
Mở terminal máy Worker và chạy lệnh sau (thay đúng IP Master và Token của bạn):
curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.10:6443 K3S_TOKEN="CHUỖI_TOKEN_VỪA_LẤY" sh -
Bước 3: Kiểm tra trạng thái Cluster
Quay lại Master Node và kiểm tra danh sách máy trong cụm:
sudo k3s kubectl get nodes
Cả hai máy chuyển sang trạng thái Ready nghĩa là cụm K8s đã sẵn sàng nhận việc:
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 3m v1.30.2+k3s1
worker01 Ready <none> 45s v1.30.2+k3s1
2. K3s hoạt động như thế nào và vì sao nó nhẹ?
Kubernetes bản chuẩn giống như một chiếc xe container 18 bánh: cực kỳ mạnh mẽ nhưng cồng kềnh và hao xăng. Khi bạn chỉ cần vận chuyển vài kiện hàng nhỏ giữa các chi nhánh, lái xe 18 bánh sẽ gây lãng phí lớn.
Rancher Labs thiết kế K3s như một chiếc bán tải tinh gọn. Đội ngũ phát triển đã loại bỏ các driver đám mây dư thừa, thay cơ sở dữ liệu etcd bằng SQLite/kine và đóng gói mọi thứ vào một file binary duy nhất dưới 100MB.
Nhờ cấu trúc này, Master Node chỉ chiếm khoảng 450MB – 512MB RAM khi chạy nền. Bạn có thể tự tin vận hành trên các gói VPS 5-10$/tháng của Hetzner, Linode hay các nhà cung cấp trong nước.
Mô hình phân chia công việc trong cụm
- Server Node (Control Plane): Tiếp nhận lệnh deploy từ người dùng, theo dõi sức khỏe của Pod và điều phối container về đúng node phù hợp.
- Agent Node (Worker): Chịu trách nhiệm kéo container image và vận hành Pods qua runtime
containerdtích hợp sẵn. - Traefik Ingress Controller: Cổng đón traffic mặc định (Reverse Proxy & Load Balancer). Toàn bộ request từ bên ngoài vào port 80/443 sẽ qua Traefik trước khi phân phối tới từng container bên trong.
3. Thực hành: Cấu hình Ingress và Cân bằng tải (Load Balancing)
Chúng ta sẽ triển khai một ứng dụng web gồm 3 bản sao (replicas) phân tán trên các node để kiểm tra cơ chế phân phối tải thực tế.
Tạo Deployment và Service chia tải
Tạo file app-demo.yaml trên Master Node:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
labels:
app: web-demo
spec:
replicas: 3
selector:
matchLabels:
app: web-demo
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-demo-service
spec:
type: ClusterIP
selector:
app: web-demo
ports:
- port: 80
targetPort: 80
Áp dụng cấu hình vào cụm:
sudo k3s kubectl apply -f app-demo.yaml
Cấu hình Ingress định tuyến tên miền
Tạo tiếp file ingress-demo.yaml để trỏ domain demo.itfromzero.local vào Service vừa tạo:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-demo-ingress
spec:
ingressClassName: traefik
rules:
- host: demo.itfromzero.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-demo-service
port:
number: 80
Áp dụng Ingress:
sudo k3s kubectl apply -f ingress-demo.yaml
Kiểm tra phân tải thực tế
Gửi request thử nghiệm đến Master Node bằng cURL:
curl -H "Host: demo.itfromzero.local" http://192.168.1.10
Mỗi lần chạy lệnh, trường Hostname trong response sẽ đổi tên Pod liên tục (ví dụ từ web-demo-6d4c5-abc1 sang web-demo-6d4c5-xyz2). Traefik Ingress tự động chia tải đều đặn theo thuật toán Round-Robin qua các Pod trên cả Master lẫn Worker.
4. Kinh nghiệm thực chiến khi vận hành K3s trên VPS
Dưới đây là 4 tinh chỉnh thực tế giúp cụm K3s hoạt động ổn định dài lâu mà không bị nghẽn RAM hay dính lỗi bảo mật:
- Quản lý cụm từ máy cá nhân: File cấu hình cluster nằm tại
/etc/rancher/k3s/k3s.yaml. Tải file này về máy dev theo đường dẫn~/.kube/configvà sửa127.0.0.1thành IP Public của Master Node. Bạn có thể dùng ngayk9s, Lens hoặc VS Code để quản lý cụm mà không cần SSH trực tiếp. - Tắt bớt thành phần không dùng: Nếu đã có sẵn Nginx ngoài host hoặc muốn tiết kiệm thêm 150MB RAM, bạn có thể bỏ Traefik và Local Storage mặc định ngay từ bước cài đặt:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik --disable local-storage" sh - - Thiết lập Firewall (UFW) chặt chẽ: Master Node chỉ mở port
6443cho IP nội bộ của Worker. Các port80, 443mở public để đón khách. Tránh mở port 6443 ra toàn internet để bảo vệ Kubernetes API Server khỏi các đợt scan tự động. - Sao lưu dữ liệu Control Plane định kỳ: Database nội bộ của K3s lưu tại
/var/lib/rancher/k3s/server/db/. Hãy tạo một cronjob nén thư mục này và đồng bộ lên S3 hoặc Cloud Storage mỗi đêm. Nếu máy chủ gặp sự cố phần cứng, bạn có thể khôi phục lại cụm chỉ trong vài phút.
