← Về danh sách bài học
Bài 4/25
🚀 Bài 4: Deployment - Quản Lý Pods
🎯 Sau bài học này, bạn sẽ:
- Hiểu Deployment là gì và tại sao cần
- Tạo Deployment để quản lý Pods
- Thực hiện rolling update và rollback
- Scale số lượng pods
1. Tại Sao Cần Deployment?
Trong thực tế, bạn không tạo Pod trực tiếp. Vì nếu Pod chết, không ai khởi động lại!
📌 Deployment giải quyết:
• Tự động tạo lại Pod khi fail (self-healing)
• Duy trì số lượng replicas mong muốn
• Rolling update không downtime
• Rollback khi có lỗi
• Tự động tạo lại Pod khi fail (self-healing)
• Duy trì số lượng replicas mong muốn
• Rolling update không downtime
• Rollback khi có lỗi
Mối quan hệ: Deployment → ReplicaSet → Pod
Deployment (quản lý version, update strategy)
└── ReplicaSet (đảm bảo số lượng pods)
└── Pod 1
└── Pod 2
└── Pod 3
2. Tạo Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # Số lượng pods
selector: # Chọn pods để quản lý
matchLabels:
app: nginx
template: # Template cho pods
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
# Apply deployment
kubectl apply -f deployment.yaml
# Kiểm tra
kubectl get deployments
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx-deployment 3/3 3 3 30s
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# nginx-deployment-xxx-abc 1/1 Running 0 30s
# nginx-deployment-xxx-def 1/1 Running 0 30s
# nginx-deployment-xxx-ghi 1/1 Running 0 30s
kubectl get replicasets
# NAME DESIRED CURRENT READY AGE
# nginx-deployment-xxx 3 3 3 30s
💡 Quan trọng:
selector.matchLabels phải khớp với
template.metadata.labels
3. Scaling Pods
Cách 1: Sửa file YAML
# Đổi replicas: 3 → replicas: 5
spec:
replicas: 5
kubectl apply -f deployment.yaml
Cách 2: Dùng lệnh scale
# Scale lên 5 pods
kubectl scale deployment nginx-deployment --replicas=5
# Scale xuống 2 pods
kubectl scale deployment nginx-deployment --replicas=2
# Kiểm tra
kubectl get pods -w
4. Rolling Update
Cập nhật version image mà không downtime:
# Cách 1: Sửa image trong command
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
# Cách 2: Sửa YAML và apply
# image: nginx:1.24 → image: nginx:1.25
kubectl apply -f deployment.yaml
# Xem tiến trình update
kubectl rollout status deployment/nginx-deployment
# Output:
# Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
# Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
# deployment "nginx-deployment" successfully rolled out
Cách Rolling Update hoạt động
🔄 Quá trình:
1. Tạo ReplicaSet mới với image mới
2. Dần tăng pods trong RS mới
3. Dần giảm pods trong RS cũ
4. Hoàn thành khi RS cũ = 0 pods
1. Tạo ReplicaSet mới với image mới
2. Dần tăng pods trong RS mới
3. Dần giảm pods trong RS cũ
4. Hoàn thành khi RS cũ = 0 pods
5. Rollback
Khi update lỗi, quay lại version trước:
# Xem lịch sử rollout
kubectl rollout history deployment/nginx-deployment
# Output:
# REVISION CHANGE-CAUSE
# 1
# 2
# Rollback về version trước
kubectl rollout undo deployment/nginx-deployment
# Rollback về revision cụ thể
kubectl rollout undo deployment/nginx-deployment --to-revision=1
# Kiểm tra
kubectl rollout status deployment/nginx-deployment
💡 Tip: Thêm annotation để ghi lại lý do thay đổi:
kubectl annotate deployment nginx-deployment kubernetes.io/change-cause="Update to v1.25"
6. Update Strategy
spec:
replicas: 3
strategy:
type: RollingUpdate # hoặc Recreate
rollingUpdate:
maxSurge: 1 # Số pods tạo thêm tối đa
maxUnavailable: 1 # Số pods unavailable tối đa
| Strategy | Mô tả |
|---|---|
| RollingUpdate | Từ từ thay thế pods (mặc định, không downtime) |
| Recreate | Xóa hết pods cũ rồi tạo mới (có downtime) |
7. Các Lệnh Quan Trọng
# CRUD
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl describe deployment nginx-deployment
kubectl delete deployment nginx-deployment
# Scaling
kubectl scale deployment nginx-deployment --replicas=5
# Update
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
kubectl rollout status deployment/nginx-deployment
# Rollback
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment
# Pause/Resume (cho controlled rollout)
kubectl rollout pause deployment/nginx-deployment
kubectl rollout resume deployment/nginx-deployment
📝 Tóm Tắt Bài Học
- Deployment quản lý ReplicaSet và Pods
- Tự động duy trì số lượng replicas mong muốn
- Rolling Update: Update không downtime
- Rollback:
kubectl rollout undo - Scale:
kubectl scale --replicas=N