Cài Đặt minikube + kubectl, Cluster Đầu Tiên
Lý thuyết đủ rồi — bài này ta dựng cluster của chính mình. Hai công cụ cần cài: kubectl (client để ra lệnh) và minikube (dựng cluster). Xong là có ngay một Kubernetes thật để nghịch.
Cần gì trước
minikube cần một "driver" để dựng cluster — phổ biến và nhẹ nhất là Docker (cluster chạy trong một container Docker). Nếu bạn đã theo series Docker thì có sẵn rồi. Ngoài Docker, minikube còn hỗ trợ driver VM (HyperKit, VirtualBox, QEMU...), nhưng Docker là lựa chọn gọn nhất để học.
Cài kubectl và minikube
Trên macOS dùng Homebrew:
brew install kubectl minikube
(Linux/Windows: xem trang cài đặt chính thức tại kubernetes.io — có gói cho apt/dnf, hoặc tải binary trực tiếp.)
Kiểm tra đã cài được:
minikube version
kubectl version --client
minikube version: v1.38.1
Client Version: v1.35.2
kubectl là client: nó không tự làm gì, chỉ gửi lệnh tới API server của cluster (nhớ Bài 1 — mọi thứ đi qua API server). Nên cài kubectl xong mà chưa có cluster thì nó chưa nói chuyện với ai cả.
Khởi động cluster
minikube start --driver=docker
Lần đầu sẽ hơi lâu vì minikube tải image nền. Output rút gọn:
* minikube v1.38.1 on Darwin
* Using the docker driver based on user configuration
* Starting "minikube" primary control-plane node in "minikube" cluster
* Pulling base image ...
* Configuring bridge CNI (Container Networking Interface) ...
* Verifying Kubernetes components...
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Dòng cuối quan trọng: minikube tự cấu hình kubectl trỏ vào cluster vừa tạo. Bạn không phải khai báo gì thêm.
Kiểm tra cluster sống:
minikube status
kubectl get nodes
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 2m53s v1.35.1
Một node tên minikube, trạng thái Ready, vai trò control-plane. Như đã nói ở Bài 1: minikube một node nên node đó kiêm cả hai vai.
kubeconfig và context: kubectl biết nói chuyện với cluster nào
Làm sao kubectl biết gửi lệnh tới đâu? Qua file kubeconfig (mặc định ~/.kube/config). File này chứa danh sách cluster, thông tin xác thực, và các context — mỗi context là một bộ ba (cluster + user + namespace). minikube start đã thêm một context tên minikube và đặt nó làm mặc định.
kubectl config current-context
minikube
Đây là chi tiết dễ vấp trong thực tế: nếu máy bạn từng kết nối cluster khác (ví dụ EKS ở công ty), kubectl có thể đang trỏ nhầm cluster. Luôn kiểm tra current-context trước khi gõ lệnh, và chuyển bằng:
kubectl config use-context minikube
Một mẹo nhỏ: lệnh
kubectlkhá dài, nhiều người đặt aliask=kubectl. Trong series mình viết đầy đủkubectlcho rõ.
Pod đầu tiên: "hello world"
Đủ thủ tục — chạy thử cái gì đó. Lệnh kubectl run tạo nhanh một pod (ta sẽ hiểu pod kỹ ở Bài 3):
kubectl run hello-nginx --image=nginx:alpine
pod/hello-nginx created
Xem nó:
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
hello-nginx 1/1 Running 0 1s 10.244.0.4 minikube <none>
Vài giây đầu bạn có thể thấy STATUS là ContainerCreating (đang kéo image, dựng container) rồi chuyển sang Running. Cột READY 1/1 nghĩa là 1/1 container trong pod đã sẵn sàng, và pod được gán IP nội bộ 10.244.0.4 trên node minikube. Toàn bộ chuỗi Bài 1 vừa diễn ra: apiserver ghi xuống etcd → scheduler chọn node → kubelet khởi container.
Dọn dẹp pod thử:
kubectl delete pod hello-nginx
pod "hello-nginx" deleted from default namespace
Vài lệnh minikube tiện dùng
minikube dashboard # mở giao diện web quản lý cluster (Bài 13)
minikube addons list # liệt kê addon (ingress, metrics-server...) — bật khi cần
minikube ip # IP của cluster
minikube stop # tắt cluster (giữ nguyên dữ liệu, bật lại nhanh)
minikube delete # xóa sạch cluster
stop khác delete: stop chỉ tắt máy ảo/container (bật lại bằng start rất nhanh, giữ nguyên mọi thứ đã tạo); delete xóa toàn bộ. Khi học xong cả series, một lệnh minikube delete là máy bạn sạch như chưa có gì.
Tổng kết
Cài kubectl (client ra lệnh) và minikube (dựng cluster), rồi minikube start --driver=docker là có một cluster Kubernetes thật một node — minikube tự cấu hình kubectl trỏ vào đó. kubectl định tuyến lệnh qua kubeconfig/context, nên luôn kiểm current-context (đặc biệt khi máy có nhiều cluster). kubectl run tạo nhanh pod đầu tiên, kubectl get pods để xem, kubectl delete để dọn. minikube stop tạm tắt, minikube delete xóa sạch.
Ta vừa chạy một pod mà chưa thật sự hiểu nó là gì. Bài 3 mổ xẻ Pod — đơn vị nhỏ nhất và là khái niệm bạn sẽ gặp mỗi ngày trong Kubernetes.