← Về danh sách bài học Bài 4/25

🚀 Bài 4: Deployment - Quản Lý Pods

⏱️ Thời gian: 25 phút | 📚 Độ khó: Dễ

🎯 Sau bài học này, bạn sẽ:

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

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

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