Skip to content

Thực hành: Pod & Deployment

🎯 Mục tiêu

🎯 Sau bài thực hành này, bạn sẽ:

  • Tạo và quản lý Pod trực tiếp bằng YAML
  • Triển khai Deployment với ReplicaSet
  • Thực hiện Rolling Update và Rollback
  • Hiểu ảnh hưởng của resource requests/limits

Mô tả bài tập

Bạn được giao nhiệm vụ triển khai ứng dụng web NGINX lên Kubernetes cluster. Từ việc tạo Pod đơn giản đến quản lý Deployment hoàn chỉnh với chiến lược update không downtime.

Yêu cầu

Bài 1: Tạo Pod cơ bản

Tạo file web-pod.yaml để chạy 1 Pod NGINX với các yêu cầu:

  • Image: nginx:1.24-alpine
  • Labels: app: web, tier: frontend
  • Container port: 80
  • Resource requests: CPU 100m, Memory 128Mi
  • Resource limits: CPU 200m, Memory 256Mi
yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-pod
  labels:
    # TODO: Thêm labels
spec:
  containers:
  - name: nginx
    image: # TODO: Chọn image phù hợp
    ports:
    - containerPort: 80
    resources:
      # TODO: Thêm requests và limits

Kiểm tra: kubectl get pod web-pod -o wide — Pod phải ở trạng thái Running.

Bài 2: Deployment với Rolling Update

Tạo web-deployment.yaml với cấu hình:

  • Replicas: 3
  • Image: nginx:1.24-alpine
  • Strategy: RollingUpdate (maxSurge: 1, maxUnavailable: 0)
  • Cùng labels và resource config như Bài 1
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: # TODO
  strategy:
    type: RollingUpdate
    rollingUpdate:
      # TODO: Cấu hình maxSurge và maxUnavailable
  selector:
    matchLabels:
      # TODO
  template:
    # TODO: Pod template

Kiểm tra: kubectl get deployment web-deployment — 3/3 READY.

Bài 3: Rolling Update và Rollback

  1. Update image từ nginx:1.24-alpinenginx:1.25-alpine
  2. Quan sát quá trình rolling update: kubectl rollout status deployment/web-deployment
  3. Giả lập lỗi: update sang image không tồn tại nginx:9.99-broken
  4. Kiểm tra Pod status và thực hiện rollback

Lệnh cần dùng:

bash
kubectl set image deployment/web-deployment nginx=nginx:1.25-alpine
kubectl rollout status deployment/web-deployment
kubectl rollout history deployment/web-deployment
kubectl rollout undo deployment/web-deployment

Gợi ý

💡 Xem gợi ý
  • Bài 1: Dùng kubectl explain pod.spec.containers.resources để xem cấu trúc
  • Bài 2: maxUnavailable: 0 đảm bảo zero-downtime, nhưng cần maxSurge: 1 để có Pod mới sẵn sàng trước
  • Bài 3: kubectl rollout undo quay về revision trước. Dùng --to-revision=N để chỉ định revision cụ thể
  • Luôn dùng semantic versioning cho image tag, KHÔNG dùng :latest

Lời giải

✅ Xem lời giải

Bài 1: Pod YAML hoàn chỉnh

yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-pod
  labels:
    app: web
    tier: frontend
spec:
  containers:
  - name: nginx
    image: nginx:1.24-alpine
    ports:
    - containerPort: 80
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "200m"
        memory: "256Mi"

Bài 2: Deployment YAML hoàn chỉnh

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:1.24-alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"

Bài 3: Rollback commands

bash
# Update lên version mới
kubectl set image deployment/web-deployment nginx=nginx:1.25-alpine
kubectl rollout status deployment/web-deployment

# Giả lập lỗi
kubectl set image deployment/web-deployment nginx=nginx:9.99-broken
# Pod mới sẽ ImagePullBackOff, Pod cũ vẫn chạy (nhờ maxUnavailable: 0)

# Rollback
kubectl rollout undo deployment/web-deployment
kubectl rollout status deployment/web-deployment

Liên kết liên quan