Lab 1 - Xây dựng Kubernetes Cluster Local từ đầu
Series: Kubernetes từ Zero đến Production
Tình huống thực tế
Ngày đầu tiên đi làm.
Team Backend vừa hoàn thành API.
Team Frontend cũng đã xong giao diện.
Bây giờ mọi người đều hỏi bạn:
"Có Kubernetes Cluster để deploy thử chưa?"
Là DevOps Engineer, nhiệm vụ đầu tiên của bạn không phải viết YAML.
Mà là xây dựng một Kubernetes Cluster để mọi người có thể sử dụng.
Trong lab này, chúng ta sẽ tự dựng một cluster local và khám phá cách Kubernetes vận hành.
Mục tiêu
Sau khi hoàn thành lab, bạn sẽ:
- Hiểu Kubernetes Cluster gồm những gì
- Biết cách tạo cluster bằng Minikube
- Làm quen với kubectl
- Hiểu Namespace, Pod, Deployment, Service
- Deploy ứng dụng đầu tiên
- Biết cách debug khi có lỗi
Đây là nền tảng cho toàn bộ các bài lab phía sau.
Kiến thức cần chuẩn bị
Công nghệ sử dụng:
- Docker
- Minikube
- kubectl
- Kubernetes Dashboard
Kiến trúc của Lab
Developer Machine
|
|
Kubernetes Cluster
|
+------+------+
| |
Node 1 Node 2
Trong bài này chúng ta dùng Minikube.
Mặc dù chỉ chạy trên một máy tính nhưng bạn vẫn sẽ thấy đầy đủ các thành phần của Kubernetes.
Bước 1. Cài Docker
Kiểm tra Docker:
docker version
Kiểm tra Docker đang chạy:
docker ps
Nếu hai lệnh trên hoạt động bình thường thì có thể tiếp tục.
Bước 2. Cài Minikube
Kiểm tra:
minikube version
Ví dụ:
minikube version: v1.38.x
Nếu chưa có thì cài Minikube theo hệ điều hành của bạn.
Bước 3. Cài kubectl
Kiểm tra:
kubectl version --client
Ví dụ:
Client Version: v1.34.x
kubectl chính là công cụ giúp chúng ta điều khiển Kubernetes.
Bạn sẽ sử dụng nó trong gần như mọi bài lab.
Bước 4. Khởi tạo Kubernetes Cluster
Khởi động cluster:
minikube start
Nếu máy dùng Docker Driver:
minikube start --driver=docker
Đợi vài phút.
Sau khi hoàn tất:
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Cluster đầu tiên đã được tạo.
Bước 5. Kiểm tra Cluster
Xem thông tin:
kubectl cluster-info
Ví dụ:
Kubernetes control plane is running at https://127.0.0.1:56872
CoreDNS is running at https://127.0.0.1:56872/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Kiểm tra version:
kubectl version
Kiểm tra node:
kubectl get nodes
Ví dụ:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 3d v1.35.1
Đây chính là node đầu tiên của cluster.
Bước 6. Hiểu cấu trúc Cluster
Kubernetes Cluster gồm:
Cluster
│
├── Control Plane
│ ├── API Server
│ ├── Scheduler
│ ├── Controller Manager
│ └── etcd
│
└── Worker Node
├── kubelet
├── kube-proxy
└── Container Runtime
Bạn chưa cần nhớ tất cả.
Chỉ cần hiểu:
- API Server nhận lệnh từ kubectl
- Scheduler quyết định Pod chạy ở đâu
- kubelet chạy Pod
- Container Runtime chạy container
Các thành phần này sẽ được giải thích chi tiết ở các bài sau.
Bước 7. Khám phá Namespace
Liệt kê Namespace:
kubectl get namespaces
Ví dụ:
NAME STATUS AGE
default Active 3d
kube-node-lease Active 3d
kube-public Active 3d
kube-system Active 3d
Ý nghĩa:
| Namespace | Tác dụng |
|---|---|
| default | nơi deploy mặc định |
| kube-system | thành phần hệ thống |
| kube-public | dữ liệu public |
| kube-node-lease | heartbeat của node |
Bước 8. Khám phá Pod
Hiện Pod:
kubectl get pods -A
Bạn sẽ thấy khá nhiều Pod.
Ví dụ:
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7d764666f9-qjb82 1/1 Running 3 (34h ago) 3d
kube-system etcd-minikube 1/1 Running 3 (34h ago) 3d
kube-system kube-apiserver-minikube 1/1 Running 3 (10m ago) 3d
kube-system kube-controller-manager-minikube 1/1 Running 3 (34h ago) 3d
kube-system kube-proxy-xmztq 1/1 Running 3 (34h ago) 3d
kube-system kube-scheduler-minikube 1/1 Running 3 (34h ago) 3d
kube-system storage-provisioner 1/1 Running 5 (10m ago) 3d
Đây đều là các thành phần giúp cluster hoạt động.
Bước 9. Deploy ứng dụng đầu tiên
Tạo Deployment:
kubectl create deployment nginx --image=nginx
Kiểm tra:
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 6s
Sau đó:
kubectl get pods
Bạn sẽ thấy:
NAME READY STATUS RESTARTS AGE
nginx-56c45fd5ff-z8qcq 1/1 Running 0 11s
Đây chính là Pod đầu tiên bạn tạo.
Bước 10. Expose Service
Tạo Service:
kubectl expose deployment nginx --type=NodePort --port=80
Kiểm tra:
kubectl get svc
Ví dụ:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
nginx NodePort 10.108.213.122 <none> 80:32406/TCP 7s
Bước 11. Truy cập ứng dụng
Nếu dùng Minikube:
minikube service nginx
Trình duyệt sẽ mở ra:
Chúc mừng!
Bạn vừa deploy ứng dụng đầu tiên lên Kubernetes.
Workflow khi deploy (bước 9)
kubectl
│
▼
API Server
│
▼
Deployment
│
▼
ReplicaSet
│
▼
Pod
│
▼
Container
Đây là workflow quan trọng nhất trong Kubernetes.
Bạn sẽ gặp nó hàng ngày.
Bước 12. Quan sát Object
Quan sát Deployment:
kubectl describe deployment nginx
Quan sát Pod:
kubectl describe pod <pod-name>
Quan sát Service:
kubectl describe svc nginx
Hãy đọc kỹ phần:
- Events
- Labels
- Selector
- Container
Bạn sẽ dùng chúng rất nhiều khi debug.
Bước 13. Debug Pod Crash
Xóa Pod:
kubectl delete pod <pod-name>
Điều gì xảy ra?
Ngay lập tức Pod mới xuất hiện.
Deployment
│
ReplicaSet
│
Pod A
(delete)
│
Pod B
Deployment luôn cố giữ đủ số lượng Pod.
Đây là khả năng tự phục hồi (Self-healing) nổi tiếng của Kubernetes.
Bước 14. Debug Image không tồn tại
Tạo Deployment lỗi:
kubectl create deployment bad-app --image=nginx:notfound
Kiểm tra:
kubectl get pods
Bạn sẽ thấy:
ImagePullBackOff
Xem nguyên nhân:
kubectl describe pod <pod-name>
Đọc phần:
Events
Bạn sẽ thấy lỗi pull image.
Bước 15. Debug Service
Tạo Service sai selector:
kubectl expose deployment nginx --name=wrong-service --type=NodePort --port=80
Sửa selector thành giá trị không tồn tại:
kubectl edit svc wrong-service
Sau đó:
kubectl get endpoints
Kết quả:
wrong-service <none>
Service không có Endpoint nên sẽ không thể chuyển tiếp request đến Pod.
Đây là một lỗi rất phổ biến khi làm việc với Kubernetes.
Bước 16. Xem Logs
kubectl logs <pod-name>
Theo dõi realtime:
kubectl logs -f <pod-name>
Logs là nơi đầu tiên bạn nên kiểm tra khi ứng dụng gặp sự cố.
Bước 17. Mở Kubernetes Dashboard
Bật Dashboard:
minikube dashboard
Bạn sẽ thấy giao diện trực quan hiển thị:
- Nodes
- Pods
- Deployments
- Services
- Events
- Logs

Dashboard rất hữu ích để quan sát cluster trong giai đoạn mới học.
Dọn dẹp môi trường
Xóa Deployment:
kubectl delete deployment nginx
Xóa Service:
kubectl delete svc nginx
Xóa Deployment lỗi:
kubectl delete deployment bad-app
Dừng cluster:
minikube stop
Nếu muốn xóa hoàn toàn:
minikube delete
Những gì bạn đã học
Sau bài lab này, bạn đã hiểu:
✅ Kubernetes Cluster là gì
✅ Cách tạo Cluster bằng Minikube
✅ Cách sử dụng kubectl
✅ Namespace, Node, Pod, Deployment, Service
✅ Workflow triển khai ứng dụng
✅ Cách xem logs
✅ Cách debug ImagePullBackOff
✅ Cách debug Pod
✅ Cách debug Service
Bài học rút ra
Điều quan trọng nhất của Lab này không phải là chạy được Nginx.
Điều quan trọng là bạn đã hiểu được vòng đời cơ bản của một ứng dụng trong Kubernetes:
kubectl
↓
API Server
↓
Deployment
↓
ReplicaSet
↓
Pod
↓
Container
↓
Service
↓
Browser
Đây chính là "xương sống" của Kubernetes.
Khi đã nắm vững luồng này, những chủ đề nâng cao như ConfigMap, Secret, Ingress, HPA, Helm hay GitOps sẽ trở nên dễ hiểu hơn rất nhiều.
Ở bài lab tiếp theo, chúng ta sẽ áp dụng toàn bộ kiến thức này để triển khai một ứng dụng Todo hoàn chỉnh gồm Frontend, Backend và PostgreSQL trên Kubernetes, mô phỏng sát với môi trường làm việc thực tế.
All rights reserved