Hướng dẫn k3d: Tạo Kubernetes Cluster “nhẹ tênh” trên Docker chỉ trong 30 giây

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

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ứ:

  1. Docker: Nền tảng cốt lõi để k3d vận hành.
  2. 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.

Share: