Kubernetes giải quyết vấn đề gì?
Docker chạy 1 container. Kubernetes chạy hàng trăm container trên nhiều máy, tự động: khởi động lại khi crash, scale khi tải tăng, cân bằng traffic, rolling update không downtime.
| Vấn đề | Docker Compose | Kubernetes |
|---|---|---|
| Container crash | Phải tự restart | Tự restart trong vài giây |
| Scale lên 10 bản | Sửa docker-compose, restart | Một lệnh: kubectl scale —replicas=10 |
| Update không downtime | Phải tắt rồi bật | Rolling update tự động |
| Nhiều máy chủ | Không hỗ trợ | Tự phân bổ container lên các máy |
| Health check | Cơ bản | Liveness + Readiness probe |
Các khái niệm cốt lõi
| Khái niệm | Giải thích | Tương đương Docker |
|---|---|---|
| Pod | Đơn vị nhỏ nhất, chứa 1+ container | Container |
| Deployment | Quản lý nhiều Pod giống nhau, auto-scale | docker-compose service |
| Service | Cổng vào ổn định cho Pod (IP cố định) | Port mapping |
| Ingress | Điều hướng HTTP từ domain vào Service | Nginx reverse proxy |
| ConfigMap / Secret | Biến môi trường và secret | .env file |
| Namespace | Tách môi trường (dev, staging, prod) | Separate docker-compose files |
Viết file cấu hình Kubernetes
// File: deployment.yaml
# deployment.yaml — chạy 3 bản app
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
replicas: 3 # chạy 3 Pod giống nhau
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: api
image: my-api:1.0.0
ports:
- containerPort: 3000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
# Health check: K8s tự restart nếu app không khoẻ
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 30
// File: service.yaml
# service.yaml — cổng vào ổn định
apiVersion: v1
kind: Service
metadata:
name: my-api-service
spec:
selector:
app: my-api # kết nối tới Pod có label app=my-api
ports:
- port: 80 # port bên ngoài
targetPort: 3000 # port container
type: ClusterIP # chỉ truy cập nội bộ cluster
Lệnh kubectl cơ bản
// File: kubectl.sh
# Apply cấu hình
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# Xem trạng thái
kubectl get pods # danh sách Pod
kubectl get deployments # danh sách Deployment
kubectl get services # danh sách Service
# Scale lên/xuống
kubectl scale deployment my-api --replicas=5
# Xem log của 1 Pod
kubectl logs my-api-xyz123 -f # -f = follow (live)
# Vào bên trong container (debug)
kubectl exec -it my-api-xyz123 -- /bin/sh
# Rolling update: đổi image → K8s tự deploy từng Pod
kubectl set image deployment/my-api api=my-api:2.0.0
💡 Bắt đầu với Minikube hoặc Docker Desktop
Không cần cloud để học K8s. Minikube tạo cluster K8s trên máy local. Docker Desktop cũng có K8s built-in (Settings → Kubernetes → Enable). Hoặc dùng k3d/kind — nhẹ hơn Minikube.
❓ Pod trong Kubernetes khác container Docker thế nào?
- Giải thích vì sao cần K8s khi có nhiều container
- Nói được 5 khái niệm cốt lõi: Pod, Deployment, Service, Ingress, Secret
- Viết file Deployment + Service YAML
- Dùng kubectl cơ bản: apply, get, scale, logs