Kubernetes cục bộ: Tại sao bạn nên thay thế Minikube bằng kind hoặc k3d

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Chi phí của việc phát triển ưu tiên đám mây (Cloud-First)

Thử nghiệm Helm charts hoặc Kubernetes manifests trực tiếp trên EKS hoặc GKE là một cách tốn kém chỉ để phát hiện lỗi cú pháp. Tôi đã chứng kiến nhiều đội ngũ tiêu tốn hàng trăm đô la tín dụng đám mây chỉ để chờ nhà cung cấp khởi tạo LoadBalancer, rồi mới nhận ra một ConfigMap bị lỗi đánh máy. Vòng phản hồi (feedback loop) đơn giản là quá chậm. Bạn cần một môi trường cục bộ mô phỏng môi trường production mà không tốn nhiều tài nguyên như các máy ảo truyền thống.

Minikube từng là lựa chọn duy nhất, nhưng việc phụ thuộc vào các máy ảo (VM) cồng kềnh khiến nó trở nên chậm chạp trên các máy tính xách tay hiện đại. Đó là lý do tại sao kind (Kubernetes in Docker) và k3d (k3s in Docker) đã vươn lên chiếm ưu thế. Bằng cách chạy các node Kubernetes dưới dạng Docker container, chúng khởi động trong vài giây thay vì vài phút. Theo kinh nghiệm của tôi, làm chủ các công cụ này là cách nhanh nhất để rút ngắn chu kỳ phát triển và đảm bảo mã nguồn của bạn hoạt động ổn định trước khi thực hiện lệnh git push.

Khởi đầu nhanh: Tạo Cluster trong chưa đầy 60 giây

Chỉ cần bạn đang chạy Docker, bạn có thể khởi tạo một cluster đầy đủ chức năng trước khi tách cà phê kịp nguội. Dưới đây là các bước cho cả hai công cụ.

Thiết lập kind

# Cài đặt kind trên macOS qua Homebrew
brew install kind

# Tạo cluster đầu tiên của bạn
kind create cluster --name dev-cluster

# Xác nhận các node đã sẵn sàng
kubectl get nodes

Thiết lập k3d

# Cài đặt k3d qua script
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

# Khởi tạo cluster với 1 load balancer và 2 worker node
k3d cluster create labs --agents 2

# Xác minh thiết lập
kubectl get nodes

Cuộc đối đầu: kind vs. k3d

Việc chọn công cụ phù hợp phụ thuộc vào mục tiêu cụ thể của bạn. Mặc dù nhìn bề ngoài chúng có vẻ giống nhau, nhưng logic bên trong lại khác biệt đáng kể.

1. Triết lý và độ chính xác

kind tập trung vào việc mang lại trải nghiệm “nguyên bản” nhất. Nó sử dụng kubeadm để khởi tạo các node và chạy bản phân phối Kubernetes upstream tiêu chuẩn. Nếu bạn đang thử nghiệm các thành phần nội tại cấp thấp của cluster hoặc muốn một môi trường giống 99% với bản cài đặt thuần túy trên đám mây, kind là lựa chọn tốt nhất.

k3d đóng vai trò là một wrapper cho k3s, bản phân phối siêu nhẹ từ Rancher. Nó thay thế các thành phần nặng nề như etcd bằng SQLite trong các thiết lập nhỏ và loại bỏ các đoạn mã cũ (legacy code). Điều này giúp k3d cực kỳ tiết kiệm tài nguyên. Một cluster k3d thường chỉ chiếm khoảng 500MB RAM khi ở trạng thái nghỉ, trong khi kind thường yêu cầu từ 1GB trở lên để duy trì sự ổn định.

2. Đơn giản hóa Networking và Ingress

Việc công khai (expose) các dịch vụ trong k3d cực kỳ đơn giản vì nó tích hợp sẵn một proxy Nginx load balancer. Bạn có thể ánh xạ (map) các cổng trực tiếp từ máy host vào cluster trong quá trình khởi tạo. Với kind, thông thường bạn phải cài đặt một Ingress controller như Nginx hoặc Contour một cách thủ công và xử lý các cấu hình ánh xạ cổng bổ sung trong tệp YAML.

3. Chỉ số hiệu năng sơ bộ

  • Thời gian khởi động: k3d là ông vua tốc độ, thường đạt trạng thái “Ready” trong 20-30 giây. kind thường mất 60-90 giây.
  • Kích thước file thực thi: k3s là một file binary duy nhất nặng 50MB. kind nặng hơn một chút vì nó phải tải các image đầy đủ cho node.
  • Trường hợp sử dụng: Dùng kind để kiểm tra tính tương thích với bản gốc (upstream); dùng k3d để phát triển ứng dụng nhanh chóng.

Thiết lập nâng cao: Multi-node và cấu hình tùy chỉnh

Các môi trường production hiếm khi chỉ có một node duy nhất. Để kiểm tra pod anti-affinity hoặc taints và tolerations, bạn cần mô phỏng kiến trúc đa node (multi-node).

Cấu hình Multi-node trong kind

Lưu tệp này dưới tên kind-config.yaml để tạo một cluster với một control plane và ba worker:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Khởi chạy với lệnh: kind create cluster --config kind-config.yaml

Ánh xạ cổng (Port Mapping) trong k3d

Nếu bạn cần truy cập một dịch vụ web tại localhost:8080, k3d cho phép bạn ánh xạ cổng đó ngay lập tức trong giai đoạn khởi tạo:

k3d cluster create web-labs -p "8080:80@loadbalancer" --agents 2

Lệnh này định tuyến lưu lượng từ cổng 8080 trên laptop của bạn đến K3s LoadBalancer. Bất kỳ Ingress nào bạn triển khai bây giờ sẽ có thể truy cập được qua trình duyệt ngay lập tức.

Tích hợp CI/CD: Thử nghiệm thật, không dùng Mock

Chạy một cluster Kubernetes thực thụ bên trong CI runner là một sự nâng cấp lớn về độ tin cậy. Thay vì giả lập (mock) các API, bạn có thể chạy các bài kiểm tra tích hợp (integration tests) trên một môi trường sống chỉ tồn tại trong thời gian thực hiện công việc (job).

Ví dụ với GitHub Actions

Tôi sử dụng workflow cụ thể này để xác thực Helm charts trước khi merge. Nó giúp phát hiện các vấn đề như thiếu ImagePullSecrets hoặc chọn sai service selector trước khi chúng được đưa lên môi trường staging.

name: Kiểm tra tích hợp K8s
on: [push]
jobs:
  integration:
    runs-on: ubuntu-latest
    steps:
    - name: Kiểm tra mã nguồn (Checkout)
      uses: actions/checkout@v4

    - name: Thiết lập kind
      uses: engineerd/[email protected]
      with:
        version: "v0.19.0"

    - name: Kiểm tra trạng thái Cluster
      run: kubectl cluster-info
        
    - name: Triển khai và Chờ đợi
      run: |
        kubectl apply -f ./k8s/deployment.yaml
        kubectl wait --for=condition=available --timeout=90s deployment/api-server

Tổng kết

Đối với việc lập trình hàng ngày, tôi khuyên dùng k3d. Tốc độ và tính năng cân bằng tải tích hợp của nó giúp loại bỏ những rào cản trong quá trình phát triển cục bộ. Tuy nhiên, tôi thường sử dụng kind trong các pipeline CI/CD. Vì kind là công cụ chính thức để thử nghiệm chính Kubernetes, nó cung cấp một tiêu chuẩn khắt khe cho việc xác thực tự động.

Chỉ cần nhớ dọn dẹp không gian làm việc của bạn. Rất dễ quên rằng bạn đang có ba cluster chạy ngầm, âm thầm tiêu thụ tài nguyên CPU. Hãy chạy kind delete cluster hoặc k3d cluster delete --all sau khi kết thúc phiên làm việc để máy tính của bạn hoạt động trơn tru.

Share: