Chuyển đến nội dung chính

BÀI 6: REPLICASETS VÀ DEPLOYMENTS

Quản lý nhiều Pod replicas với ReplicaSet và Deployment. Rolling updates, rollbacks, deployment strategies (Recreate, RollingUpdate, Blue/Green, Canary). Hiểu revision history và cách rollback an toàn.

🎯 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.

Kubernetes Deployment & Rolling Update Strategies

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.28

Hoặ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-deploy

Xem 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-deploy

Update 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=10

HPA 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: 0 và maxSurge: 0 cùng lúc → invalid
  • ❌ Dùng latest image 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