Kubernetes là gì? Kubernetes (viết tắt K8s) là nền tảng mã nguồn mở dùng để tự động triển khai, mở rộng và quản lý ứng dụng chạy trong container trên nhiều máy chủ. Nếu Docker giúp bạn đóng gói và chạy một container, thì Kubernetes giúp điều phối hàng trăm container: tự khởi động lại khi lỗi, phân bổ tải, cập nhật phiên bản không gián đoạn. Bài viết giải thích kiến trúc Kubernetes, các khái niệm pod, node, deployment, service và hướng dẫn chạy thử trên máy cá nhân.
Vì sao cần Kubernetes?
Khi chỉ có một vài container trên một server, Docker Compose là đủ. Nhưng khi hệ thống lớn lên, bạn sẽ gặp các câu hỏi:
- Container bị lỗi lúc nửa đêm, ai khởi động lại?
- Lượng truy cập tăng gấp nhiều lần, làm sao thêm bản sao nhanh chóng?
- Một server hỏng, container trên đó chuyển đi đâu?
- Cập nhật phiên bản mới thế nào để người dùng không bị gián đoạn, và quay lại nếu có lỗi?
Kubernetes trả lời các câu hỏi này bằng cách để bạn khai báo trạng thái mong muốn (ví dụ: “luôn có 3 bản sao của ứng dụng web”), và hệ thống tự liên tục điều chỉnh để đạt trạng thái đó.
Docker và Kubernetes khác nhau thế nào?
| Docker | Kubernetes | |
|---|---|---|
| Vai trò | Đóng gói và chạy container | Điều phối container trên cụm nhiều máy |
| Phạm vi | Thường một máy | Nhiều máy (cluster) |
| Tự phục hồi | Hạn chế (restart policy) | Có, tự thay thế pod lỗi |
| Mở rộng | Thủ công | Khai báo số bản sao, hỗ trợ tự động mở rộng |
| Độ phức tạp | Thấp | Cao hơn đáng kể |
Hai công nghệ bổ trợ cho nhau: bạn vẫn build image bằng Docker (hoặc công cụ tương đương), rồi Kubernetes chạy image đó. Nếu chưa quen container, hãy đọc Docker là gì trước.
Kiến trúc một cụm Kubernetes
Control plane
Bộ não của cụm, gồm:
- kube-apiserver: cổng giao tiếp, mọi lệnh
kubectlđều đi qua đây. - etcd: cơ sở dữ liệu key-value lưu toàn bộ trạng thái cụm.
- kube-scheduler: quyết định pod chạy trên node nào.
- controller-manager: các vòng điều khiển liên tục đưa trạng thái thực tế về trạng thái mong muốn.
Worker node
Các máy chạy ứng dụng, mỗi node có:
- kubelet: tác tử nhận lệnh và đảm bảo container chạy đúng.
- container runtime: ví dụ containerd, trực tiếp chạy container.
- kube-proxy: xử lý định tuyến mạng cho service.
Các khái niệm cốt lõi
| Khái niệm | Giải thích ngắn |
|---|---|
| Pod | Đơn vị nhỏ nhất, chứa một hoặc vài container dùng chung mạng và lưu trữ |
| Deployment | Quản lý số bản sao pod, cập nhật cuốn chiếu (rolling update) và rollback |
| Service | Địa chỉ ổn định để truy cập nhóm pod, cân bằng tải giữa chúng |
| Ingress | Định tuyến HTTP/HTTPS từ bên ngoài vào các service theo domain, đường dẫn |
| ConfigMap / Secret | Tách cấu hình và thông tin nhạy cảm khỏi image |
| Namespace | Phân vùng logic trong cụm (dev, staging, theo nhóm) |
| PersistentVolume | Lưu trữ bền vững cho dữ liệu cần giữ lại |
| StatefulSet / DaemonSet / Job | Kiểu chạy cho ứng dụng có trạng thái, chạy trên mọi node, tác vụ một lần |
Ví dụ: triển khai ứng dụng web
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits: { cpu: "500m", memory: "256Mi" }
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
Áp dụng và kiểm tra:
kubectl apply -f web.yaml
kubectl get pods
kubectl get svc
kubectl scale deployment web --replicas=5
kubectl rollout status deployment/web
kubectl logs -l app=web
Thử xoá một pod bằng kubectl delete pod <tên>, bạn sẽ thấy Kubernetes tự tạo pod mới để giữ đủ số bản sao.
Chạy thử Kubernetes trên máy cá nhân
- minikube: tạo cụm một node trên máy, phù hợp học tập.
- kind: chạy cụm Kubernetes bên trong container Docker, nhẹ và nhanh.
- Docker Desktop: có tuỳ chọn bật Kubernetes tích hợp.
- k3s: bản Kubernetes gọn nhẹ, chạy được trên VPS nhỏ.
Khi chạy thật, nhiều đội chọn dịch vụ Kubernetes được quản lý như Amazon EKS, Google GKE hoặc Azure AKS để không phải tự vận hành control plane.
Khi nào không nên dùng Kubernetes?
Kubernetes mạnh nhưng phức tạp. Với website nhỏ, ít dịch vụ hoặc đội ngũ chưa có người vận hành, một VPS với Docker Compose hoặc dịch vụ PaaS thường đơn giản và rẻ hơn. Hãy cân nhắc Kubernetes khi bạn thực sự cần mở rộng linh hoạt, nhiều dịch vụ, nhiều môi trường và tính sẵn sàng cao.
Lộ trình học Kubernetes
- Vững Linux, mạng và Docker.
- Pod, Deployment, Service, Namespace với
kubectl. - ConfigMap, Secret, volume, probe (liveness/readiness).
- Ingress, HTTPS, quản lý tài nguyên CPU/RAM.
- Helm để đóng gói và tái sử dụng cấu hình.
- Giám sát với Prometheus, Grafana; CI/CD triển khai lên cụm.
- Bảo mật: RBAC, network policy, quét image.
Kubernetes là một chặng trong lộ trình học DevOps tổng thể.
Rolling update và rollback hoạt động ra sao?
Một trong những lý do chính để dùng Kubernetes là cập nhật ứng dụng mà người dùng không bị gián đoạn. Khi bạn đổi image trong Deployment, Kubernetes không tắt toàn bộ pod cũ cùng lúc, mà lần lượt tạo pod mới, chờ pod mới sẵn sàng, rồi mới tắt bớt pod cũ. Hai tham số maxSurge và maxUnavailable quyết định mỗi lần được tạo thêm bao nhiêu pod và được phép thiếu bao nhiêu pod.
kubectl set image deployment/web web=nginx:1.28
kubectl rollout status deployment/web
kubectl rollout history deployment/web
kubectl rollout undo deployment/web # quay lại phiên bản trước
Để quá trình này an toàn, bạn cần khai báo readiness probe (kiểm tra pod đã sẵn sàng nhận request chưa) và liveness probe (kiểm tra pod còn “sống” không, nếu không thì khởi động lại). Thiếu readiness probe, Kubernetes có thể chuyển traffic vào pod chưa khởi động xong, gây lỗi cho người dùng ngay trong lúc deploy.
Quản lý cấu hình và bí mật
Không nên “nướng” cấu hình vào image. Thay vào đó, hãy tách ra ConfigMap (cấu hình thường như URL dịch vụ, chế độ log) và Secret (mật khẩu database, API key), rồi gắn vào pod dưới dạng biến môi trường hoặc file.
kubectl create configmap web-config --from-literal=LOG_LEVEL=info
kubectl create secret generic db-pass --from-literal=PASSWORD=doi-mat-khau-that
Lưu ý: Secret mặc định chỉ được mã hoá base64, không phải mã hoá thật. Trong môi trường production, hãy bật mã hoá etcd, giới hạn quyền đọc Secret bằng RBAC, hoặc dùng các giải pháp quản lý secret chuyên dụng của nhà cung cấp cloud.
Tự động mở rộng
Horizontal Pod Autoscaler (HPA) có thể tự tăng giảm số bản sao pod dựa trên mức sử dụng CPU, bộ nhớ hoặc metric tuỳ chỉnh. Để HPA hoạt động, pod cần khai báo resources.requests và cụm cần có metrics-server. Ngoài ra, Cluster Autoscaler trên cloud có thể tự thêm hoặc bớt node khi tài nguyên thiếu hoặc dư. Kết hợp hai cơ chế này giúp hệ thống chịu được lúc cao điểm mà vẫn tiết kiệm chi phí lúc vắng khách.
Lệnh kubectl hay dùng khi vận hành
| Lệnh | Tác dụng |
|---|---|
kubectl get pods -A | Xem pod ở mọi namespace |
kubectl describe pod <tên> | Xem chi tiết và sự kiện của pod, rất hữu ích khi pod không khởi động được |
kubectl logs -f <tên> | Theo dõi log của pod |
kubectl exec -it <tên> -- sh | Mở shell bên trong container |
kubectl port-forward svc/web 8080:80 | Truy cập service từ máy cá nhân để kiểm tra |
kubectl get events --sort-by=.lastTimestamp | Xem các sự kiện gần nhất trong cụm |
Khi pod ở trạng thái CrashLoopBackOff, hãy xem log của lần chạy trước bằng kubectl logs --previous. Khi pod ở trạng thái Pending, thường là do thiếu tài nguyên hoặc không có node phù hợp, lệnh describe sẽ cho biết lý do. Trạng thái ImagePullBackOff thường do sai tên image hoặc thiếu quyền truy cập registry.
Câu hỏi thường gặp
Vì sao Kubernetes gọi là K8s?
Vì giữa chữ “K” và “s” có 8 ký tự, cách viết tắt này giúp gọi tên ngắn gọn.
Pod và container khác nhau thế nào?
Container là tiến trình được đóng gói. Pod là lớp bao bọc của Kubernetes, có thể chứa một hoặc vài container chạy cùng nhau, chia sẻ địa chỉ mạng và volume.
Học Kubernetes có khó không?
Kubernetes có nhiều khái niệm và cần nền tảng Linux, mạng, container. Nếu học theo thứ tự và thực hành trên cụm thử nghiệm, bạn sẽ nắm được dần.
Kubernetes có thay thế Docker không?
Không. Kubernetes điều phối container; bạn vẫn cần công cụ để build image như Docker.
Kết luận
Kubernetes là nền tảng điều phối container phổ biến cho các hệ thống cần mở rộng và độ ổn định cao. Hãy nắm vững Docker trước, sau đó thực hành các khái niệm pod, deployment, service trên minikube hoặc kind. Để học bài bản từ cơ bản đến thực chiến, tham khảo khoá học Kubernetes và khoá học Docker của MelyDemy.