🎯 Mục tiêu bài học
Hiểu ReplicaSet đảm bảo số lượng Pod replicas, tại sao Deployment tốt hơn ReplicaSet thuần, cách thực hiện rolling update và rollback an toàn, và các deployment strategies phổ biến.
1. ReplicaSet
ReplicaSet đảm bảo số lượng Pod replicas được chỉ định luôn chạy. Nếu Pod bị xóa hoặc crash, ReplicaSet tạo Pod mới để bù vào.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ReplicaSet dùng label selectors để biết Pods nào nó quản lý. Tuy nhiên, bạn hiếm khi tạo ReplicaSet trực tiếp — thay vào đó dùng Deployment.
2. Deployment — Tại sao tốt hơn ReplicaSet?
Deployment là abstraction cấp cao hơn ReplicaSet, cho phép:
- Declarative updates: chỉ khai báo desired state, Deployment lo phần còn lại
- Rolling updates: zero-downtime deployment
- Revision history: lưu lịch sử updates, cho phép rollback
- Pause/Resume: rollout có thể tạm dừng
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 5
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2 # tối đa thêm 2 pods trong quá trình update
maxUnavailable: 1 # tối đa 1 pod unavailable tại một thời điểm
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
3. Rolling Update
Rolling Update thay thế Pods cũ dần dần bằng Pods mới, đảm bảo không có downtime.
# Update image kubectl set image deployment/nginx-deploy nginx=nginx:1.28Hoặc edit trực tiếp
kubectl edit deployment nginx-deploy
Theo dõi rollout
kubectl rollout status deployment/nginx-deploy
Xem chi tiết
kubectl describe deployment nginx-deploy
Với maxSurge: 2 và maxUnavailable: 1 trên 5 replicas:
- Tối đa 7 pods tồn tại cùng lúc (5 + 2 surge)
- Tối thiểu 4 pods available (5 - 1 unavailable)
- Kubernetes tạo Pods mới song song với terminate Pods cũ
4. Recreate Strategy
Xóa toàn bộ Pods cũ trước khi tạo Pods mới. Có downtime nhưng đơn giản và không có versioning conflict.
strategy:
type: Recreate
Dùng khi: database migration cần single instance, không chấp nhận 2 versions chạy song song.
5. Revision History và Rollback
# Xem revision history kubectl rollout history deployment/nginx-deployXem chi tiết revision cụ thể
kubectl rollout history deployment/nginx-deploy --revision=3
Rollback về revision trước
kubectl rollout undo deployment/nginx-deploy
Rollback về revision cụ thể
kubectl rollout undo deployment/nginx-deploy --to-revision=2
Số revisions được lưu kiểm soát bởi spec.revisionHistoryLimit (mặc định 10).
6. Pause và Resume Rollout
# Pause rollout (để kiểm tra pods mới trước khi tiếp tục) kubectl rollout pause deployment/nginx-deployUpdate image
kubectl set image deployment/nginx-deploy nginx=nginx:1.28
Pods mới bắt đầu tạo, kiểm tra chúng
kubectl get pods
Nếu ok, resume
kubectl rollout resume deployment/nginx-deploy
Nếu không ok, rollback
kubectl rollout undo deployment/nginx-deploy
7. Blue/Green Deployment
Triển khai phiên bản mới song song với phiên bản cũ, sau đó chuyển toàn bộ traffic sang phiên bản mới.
# Blue (phiên bản hiện tại)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-blue
spec:
replicas: 5
selector:
matchLabels:
app: nginx
version: blue
template:
metadata:
labels:
app: nginx
version: blue
spec:
containers:
- name: nginx
image: nginx:1.27
---
# Service chỉ vào blue
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
version: blue # chuyển sang "green" để switch traffic
ports:
- port: 80
# Sau khi deploy green và kiểm tra xong:
kubectl patch service nginx-service -p '{"spec":{"selector":{"version":"green"}}}'
8. Canary Deployment
Gửi một phần nhỏ traffic đến phiên bản mới để kiểm tra.
# Stable: 9 replicas
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-stable
spec:
replicas: 9
selector:
matchLabels:
app: nginx
track: stable
template:
metadata:
labels:
app: nginx
track: stable
spec:
containers:
- name: nginx
image: nginx:1.27
---
# Canary: 1 replica (~10% traffic)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-canary
spec:
replicas: 1
selector:
matchLabels:
app: nginx
track: canary
template:
metadata:
labels:
app: nginx
track: canary
spec:
containers:
- name: nginx
image: nginx:1.28
---
# Service match cả hai
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # match cả stable và canary
9. Scaling
# Scale thủ công kubectl scale deployment nginx-deploy --replicas=10HPA tự động scale (xem bài Autoscaling)
kubectl autoscale deployment nginx-deploy --min=3 --max=10 --cpu-percent=70
10. Deployment Anti-patterns cần tránh
- ❌ Không đặt resource requests/limits → Pod bị evict khi node pressure
- ❌ Không có readinessProbe → traffic đến Pod chưa ready
- ❌
maxUnavailable: 0vàmaxSurge: 0cùng lúc → invalid - ❌ Dùng
latestimage tag → không reproducible - ❌
revisionHistoryLimit: 0→ không thể rollback
Tóm tắt
- Deployment quản lý ReplicaSet, không nên tạo ReplicaSet trực tiếp
- Rolling Update: zero-downtime, điều chỉnh maxSurge và maxUnavailable
- Rollback bằng
kubectl rollout undo - Blue/Green: instant switch, cần double resources
- Canary: gradual rollout, kiểm soát % traffic bằng số replicas