Kubernetes là gì? Câu trả lời ngắn: container orchestration — chạy hàng trăm container trên nhiều server với auto-scale, self-healing, rolling deploy. Bài này đi từ khái niệm cơ bản đến deploy app Node.js đầu tiên lên K8s.
Vì sao cần K8s?
Docker chạy container trên 1 host. Khi anh có 100 container trên 10 server, câu hỏi xuất hiện:
- Container nào chạy trên server nào?
- Nếu server crash, container chạy lại ở đâu?
- Auto-scale khi traffic spike?
- Deploy mới không downtime?
- Service A tìm service B thế nào?
K8s giải tất cả. Trade-off: setup phức tạp, learning curve cao. Đó là lý do chỉ adopt khi quy mô đủ lớn.
Kiến trúc K8s
┌─ Control Plane (master) ───────────┐
│ api-server scheduler controller │
│ etcd (key-value store) │
└────────────────────────────────────┘
│
┌────┴────────────────┐
▼ ▼
┌─ Node 1 ──────┐ ┌─ Node 2 ──────┐
│ kubelet │ │ kubelet │
│ pod pod │ │ pod │
│ container │ │ container │
└───────────────┘ └───────────────┘
- Control plane: bộ não. API server nhận lệnh kubectl, scheduler chọn node, controller đảm bảo state mong muốn.
- etcd: lưu mọi state cluster. Backup etcd = backup cluster.
- Node: server worker chạy pod. Mỗi node có kubelet (agent), runtime (containerd).
7 khái niệm cốt lõi
| Object | Vai trò |
|---|---|
| Pod | Đơn vị deploy nhỏ nhất. 1+ container chia sẻ network/storage. |
| Deployment | Quản lý nhiều replica của pod. Rolling update, rollback. |
| Service | Stable endpoint cho pod (IP/DNS không đổi khi pod restart). |
| Ingress | Route HTTP từ ngoài vào service theo host/path. |
| ConfigMap | Config non-secret (env var, file config). |
| Secret | Config secret (password, key) — base64 (nên thêm encryption). |
| Namespace | Group resource. Tách dev/staging/prod hoặc team. |
Deploy app Node.js đầu tiên
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alodev-api
labels: { app: alodev-api }
spec:
replicas: 3
selector:
matchLabels: { app: alodev-api }
template:
metadata:
labels: { app: alodev-api }
spec:
containers:
- name: app
image: ghcr.io/alodev/api:v1.2.3
ports:
- containerPort: 3000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef: { name: app-secrets, key: database_url }
resources:
requests: { memory: "256Mi", cpu: "100m" }
limits: { memory: "512Mi", cpu: "500m" }
readinessProbe:
httpGet: { path: /healthz, port: 3000 }
initialDelaySeconds: 5
livenessProbe:
httpGet: { path: /healthz, port: 3000 }
initialDelaySeconds: 30
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: alodev-api
spec:
selector: { app: alodev-api }
ports:
- port: 80
targetPort: 3000
kubectl apply -f deployment.yaml -f service.yaml
kubectl get pods
kubectl logs -f deploy/alodev-api
kubectl describe pod alodev-api-xxx
kubectl scale deploy/alodev-api --replicas=10
Readiness vs Liveness probe
- Readiness: pod sẵn sàng nhận traffic chưa? Fail = remove khỏi service. App khởi động chậm dùng để delay.
- Liveness: pod còn alive? Fail = restart pod. Phát hiện deadlock, leak.
Đừng dùng cùng endpoint cho cả 2 nếu app phụ thuộc DB. Liveness fail vì DB tạm rớt = restart hết pod = đè DB chết hơn.
Ingress cho HTTPS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alodev
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts: [api.alodev.vn]
secretName: alodev-tls
rules:
- host: api.alodev.vn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: alodev-api
port: { number: 80 }
cert-manager auto issue cert Let's Encrypt. Ingress controller (nginx-ingress, Traefik) handle TLS termination + routing.
Auto-scale theo CPU/memory
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: alodev-api
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: alodev-api
minReplicas: 3
maxReplicas: 30
metrics:
- type: Resource
resource:
name: cpu
target: { type: Utilization, averageUtilization: 70 }
Khi CPU trung bình > 70% trong vài phút → scale up. Custom metric (request/s, queue depth) cần Prometheus + KEDA.
Khi nào nên dùng K8s?
✓ Có lý do:
- ≥5 service nội bộ
- Multi-region, multi-cloud
- Team ≥ 20 engineer
- Cần auto-scale, self-healing đa node
- Compliance yêu cầu on-premise
✗ Đừng adopt nếu:
- 1 app, 1 server vẫn đủ
- Team < 5 người, chưa có DevOps dedicated
- Chỉ vì AWS/Google nói thế
Cho team nhỏ: Cloud Run, Fly.io, Railway, Render — managed simple, bill theo usage. Khi growth lớn rồi migrate K8s sau.
Kết luận
Kubernetes là gì? Đó là engine chạy mọi container production trên thế giới hiện đại. Mạnh mẽ nhưng phức tạp. Bắt đầu với managed K8s (GKE/EKS), Helm chart cho deployment, đừng tự host control plane. Chỉ adopt khi pain thực sự xuất hiện — Compose vẫn đủ cho dự án vừa và nhỏ.