0

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:

Screenshot 2026-07-27 at 11.40.58.png 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

Screenshot 2026-07-27 at 11.46.37.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí