Nỗi ám ảnh mang tên Kubernetes Local
Bạn đã bao giờ thấy laptop “gào thét” chỉ vì lỡ tay bật một cluster Kubernetes để test code chưa? Mình từng kẹt trong cảnh đó: chiếc máy 16GB RAM mà quạt kêu như động cơ phản lực, còn Docker Desktop thì ngốn sạch tài nguyên hệ thống. Việc deploy một ứng dụng Hello World đơn giản đôi khi mất cả buổi sáng chỉ để đợi pull image và khởi tạo node.
Đa số công cụ truyền thống như Minikube thường chạy một máy ảo (VM) hoàn chỉnh. Cách tiếp cận này cực kỳ ngốn RAM và CPU. Sau nhiều lần vật lộn, mình tìm thấy k3d. Trải nghiệm thay đổi hoàn toàn. Thay vì đợi 5-10 phút, mình chỉ mất chưa đầy 30 giây để có một cluster sẵn sàng làm việc.
So sánh: Tại sao k3d lại vượt trội?
Để thấy rõ sự khác biệt, hãy đặt k3d lên bàn cân với các đối thủ phổ biến hiện nay:
- Minikube: Lão làng trong giới K8s local, hỗ trợ nhiều driver. Tuy nhiên, nó khá nặng nề và cấu hình mạng giữa máy host với VM thường xuyên xảy ra lỗi vặt.
- Kind (Kubernetes in Docker): Ý tưởng khá giống k3d khi chạy K8s trong container. Nhưng Kind dùng bản phân phối K8s tiêu chuẩn nên vẫn nặng hơn đáng kể.
- k3d (k3s in Docker): Đây là bản wrapper của k3s – phiên bản K8s rút gọn do Rancher phát triển. Nó loại bỏ các thành phần dư thừa, gói gọn trong một file binary duy nhất.
Dưới đây là bảng so sánh dựa trên hiệu suất thực tế trên máy Dell XPS 13 (i7, 16GB RAM):
| Tiêu chí | Minikube (Docker driver) | Kind | k3d |
|---|---|---|---|
| Thời gian khởi động | ~2 phút | ~1 phút | < 25 giây |
| RAM chiếm dụng (Idle) | ~1.5GB – 2GB | ~800MB – 1GB | ~400MB – 500MB |
| Multi-node | Phức tạp | Khá tốt | Cực kỳ linh hoạt |
Sức mạnh thực sự của k3d nằm ở đâu?
K3d giúp bạn chạy k3s bên trong Docker container một cách mượt mà. K3s vốn được tối ưu cho các thiết bị IoT hoặc Edge computing với tài nguyên cực thấp. Khi đưa vào môi trường dev, nó chạy nhanh tới mức bạn có thể tạo hoặc xóa cluster liên tục mà không thấy phiền.
Khả năng giả lập multi-node là điểm mình thích nhất. Bạn dễ dàng dựng 1 Master và 3 Workers chỉ bằng một dòng lệnh duy nhất. Mọi thứ đều nằm gọn trong các Docker container độc lập. Sau khi học xong, việc dọn dẹp môi trường chỉ mất vài giây.
Chuẩn bị công cụ
Trước khi bắt tay vào dựng lab, máy bạn cần cài sẵn hai thứ:
- Docker: Nền tảng cốt lõi để k3d vận hành.
- kubectl: Công cụ điều khiển Kubernetes từ dòng lệnh.
Cài đặt k3d rất nhanh. Nếu bạn dùng MacOS (Homebrew), hãy gõ:
brew install k3d
Đối với người dùng Windows, Chocolatey là lựa chọn tốt nhất. Riêng với Linux, bạn chỉ cần thực thi một dòng script:
wget -qO- https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | TAG=v5.6.0 bash
Triển khai thực tế: Từ số 0 đến Cluster hoàn chỉnh
1. Khởi tạo cluster đầu tiên
Gõ lệnh sau để tạo một cluster cơ bản:
k3d cluster create my-lab
K3d sẽ tự động cấu hình file ~/.kube/config. Bạn có thể dùng kubectl để kết nối ngay lập tức. Kiểm tra trạng thái node bằng lệnh:
kubectl get nodes
Hệ thống sẽ hiển thị một node duy nhất đóng cả hai vai trò: master và worker.
2. Dựng mô hình Multi-node (1 Master, 2 Workers)
Để test khả năng chịu lỗi hoặc phân tán của ứng dụng, bạn nên dùng mô hình nhiều node. Hãy thử lệnh sau:
k3d cluster create multi-node-cluster --servers 1 --agents 2
Lúc này, Docker sẽ khởi chạy 3 containers tương ứng với 3 nodes. Bạn có thể kiểm tra danh sách này bằng lệnh docker ps quen thuộc.
3. Mở cổng (Expose Port) ra máy host
Truy cập ứng dụng từ trình duyệt là bước nhiều bạn hay gặp khó khăn nhất. Vì K8s nằm trong Docker, bạn cần map port từ máy thật vào LoadBalancer của cluster.
Mình thường dùng cách mapping qua Traefik (Ingress mặc định của k3s):
k3d cluster create web-lab -p "8080:80@loadbalancer" --agents 2
Lưu ý: Mọi traffic gửi tới localhost:8080 sẽ được chuyển tiếp thẳng vào port 80 của cluster.
4. Deploy thử nghiệm ứng dụng Nginx
Hãy kiểm chứng hệ thống bằng cách chạy một server Nginx. Lưu nội dung sau vào file nginx-deploy.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:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
Triển khai file vừa tạo vào cluster:
kubectl apply -f nginx-deploy.yaml
Bây giờ, hãy truy cập localhost:8080 trên trình duyệt. Nếu thấy trang chào mừng của Nginx, bạn đã dựng Lab thành công!
Mẹo tối ưu quy trình làm việc với k3d
Sử dụng Image Local: Thay vì tốn thời gian push image lên Docker Hub, bạn có thể đẩy thẳng image từ máy host vào cluster. Đây là tính năng cực kỳ đáng giá:
k3d image import my-app-image:latest -c my-lab
Tạm dừng khi không sử dụng: Nếu muốn tiết kiệm pin laptop mà không muốn xóa sạch tài nguyên đã cài đặt, hãy dùng lệnh stop. Nó hoạt động tương tự như việc tắt Docker container:
k3d cluster stop my-lab
k3d cluster start my-lab
Thao tác này giúp máy chạy nhẹ nhàng hơn hẳn so với việc treo Minikube chạy ngầm.
Lời kết
K3d không chỉ dành cho việc học tập. Nó thực sự là trợ thủ đắc lực giúp quy trình phát triển ứng dụng hàng ngày trở nên chuyên nghiệp hơn. Từ khi chuyển sang k3d, mình không còn lo lắng về việc máy bị treo hay thiếu RAM khi làm việc với Kubernetes nữa.
Nếu bạn đang tìm kiếm một môi trường Lab K8s nhanh, nhẹ và dễ quản lý, k3d chính là câu trả lời hoàn hảo nhất hiện nay.
