Giao diện
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à limitsKiể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 templateKiểm tra: kubectl get deployment web-deployment — 3/3 READY.
Bài 3: Rolling Update và Rollback
- Update image từ
nginx:1.24-alpine→nginx:1.25-alpine - Quan sát quá trình rolling update:
kubectl rollout status deployment/web-deployment - Giả lập lỗi: update sang image không tồn tại
nginx:9.99-broken - 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-deploymentGợ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ầnmaxSurge: 1để có Pod mới sẵn sàng trước - Bài 3:
kubectl rollout undoquay 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