Progressive Delivery Cho Developer: Rollout An Toàn Hơn

Deploy Toàn Bộ = Cược Toàn Bộ
Một startup deploy bản update cho production vào thứ Sáu. 15 phút sau, 40% user gặp lỗi. rollback mất 20 phút. Doanh thu mất, reputation sụp.
Vấn đề không nằm ở code. Vấn đề nằm ở cách deploy.
Progressive Delivery giải quyết bài toán đó — thay vì push một lần cho tất cả, rollout từng phần, quan sát, rồi quyết định tiếp hay dừng lại.
Progressive Delivery Là Gì?
TL;DR: Deploy từng bước nhỏ, có kiểm soát. Nếu có vấn đề → dừng ngay, không ảnh hưởng toàn bộ hệ thống.
Progressive Delivery mở rộng ý tưởng của CI/CD. Nếu CI/CD giúp code đến production nhanh, Progressive Delivery giúp code đến production an toàn. Có 3 chiến lược chính:
- Canary Release: Deploy cho 5% user trước. Nếu ổn → thêm 10%, 25%, 100%. Nếu lỗi → rollback tức thì.
- Blue-Green Deployment: Chạy 2 phiên bản song song. Switch traffic từ blue sang green khi sẵn sàng. Rollback = switch lại.
- Feature Flag: Deploy code lên production nhưng tắt tính năng mới. Bật dần dần theo user segment, thời gian, hoặc % traffic.
Mỗi chiến lược phù hợp với một scenario. Không có cái nào tốt nhất — chỉ có cái phù hợp nhất.
Tại Sao Developer Cần Quan Tâm?
1. Giảm blast radius
Khi deploy 100% production cùng lúc, mọi lỗi đều ảnh hưởng toàn bộ user. Progressive Delivery giới hạn thiệt hại trong phạm vi nhỏ.
2. Rollback nhanh
Với blue-green, rollback chỉ là switch traffic. Không cần redeploy, không cần rollback code. 30 giây thay vì 30 phút.
3. Data-driven decisions
Rollout 5% trước cho phép quan sát metric — error rate, latency, business metric — trước khi commit toàn bộ. Không cần đoán, có data.
4. Team confidence
Developer sợ deploy vì sợ lỗi. Progressive Delivery giảm rủi ro → giảm sợ → deploy thường xuyên hơn → release cycle ngắn hơn.
Hands-on: Canary Release với GitHub Actions
Ví dụ thực tế — canary deploy 10% traffic lên Kubernetes, rồi gradual rollout.
Bước 1: Deploy với Replica Fraction
# canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-canary
labels:
app: myapp
track: canary
spec:
replicas: 1 # 10% của 10 replicas
selector:
matchLabels:
app: myapp
track: canary
template:
metadata:
labels:
app: myapp
track: canary
spec:
containers:
- name: myapp
image: myapp:v2.0.0
ports:
- containerPort: 3000
Bước 2: Service Split Traffic
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp # Match cả stable và canary
ports:
- port: 80
targetPort: 3000
Kubernetes Service match cả hai pods (stable + canary). 9 replicas stable, 1 replica canary → khoảng 10% traffic vào canary.
Bước 3: Monitor và Rollout
# Kiểm tra error rate trên canary
kubectl logs -l track=canary --tail=100 | grep ERROR
# Nếu ổn → scale up canary
kubectl scale deployment myapp-canary --replicas=3
# Nếu có vấn đề → xóa canary
kubectl delete deployment myapp-canary
Bước 4: Promote hoặc Rollback
# Promote: update stable deployment
kubectl set image deployment/myapp-stable myapp=myapp:v2.0.0
# Rollback: giữ nguyên stable, xóa canary
kubectl delete deployment myapp-canary
Feature Flag — Triển Khai Dễ Dàng
Feature Flag là cách đơn giản nhất để implement progressive delivery mà không cần thay đổi infrastructure.
// Ví dụ: LaunchDarkly hoặc custom feature flag
const showNewDashboard = featureFlag.isEnabled('new-dashboard', {
userId: currentUser.id,
percentage: 25, // 25% user thấy dashboard mới
});
if (showNewDashboard) {
return <NewDashboard />;
} else {
return <OldDashboard />;
}
Ưu điểm:
- Deploy code bất cứ lúc nào, bật feature theo schedule
- A/B testing tích hợp sẵn
- Kill switch tức thì khi có vấn đề
Nhược điểm:
- Technical debt nếu không dọn feature flag cũ
- Thêm complexity vào codebase
Blue-Green — Switch Instant
Blue-Green đơn giản nhưng cần resource gấp đôi. Phù hợp khi downtime = zero tolerance.
# Deploy green version
kubectl apply -f green-deployment.yaml
# Test green
kubectl port-forward svc/myapp-green 8080:80
# Switch traffic
kubectl patch svc myapp -p '{"spec":{"selector":{"track":"green"}}}'
# Rollback = switch lại
kubectl patch svc myapp -p '{"spec":{"selector":{"track":"blue"}}}'
Traffic switch tức thì. Không có deployment window, không có downtime.
Chọn Chiến Lược Nào?
Canary: Phù hợp khi muốn có data trước khi commit toàn bộ. Thêm 1-2 replica, rollback nhanh bằng cách xóa canary.
Blue-Green: Phù hợp khi zero downtime là bắt buộc. Cần resource gấp đôi, nhưng rollback tức thì bằng cách switch traffic.
Feature Flag: Phù hợp khi muốn toggles tính năng hoặc A/B test. Không thêm resource, rollback tức thì bằng cách tắt flag.
Góc nhìn thực tế: Bắt đầu với Feature Flag — ít overhead nhất, hiệu quả cao nhất cho hầu hết use case. Khi cần zero downtime → thêm Blue-Green. Canary phù hợp khi có observability stack tốt (metric, alert).
Bài viết được hỗ trợ bởi AI (Amy 🌸). Nội dung đã được kiểm duyệt bởi tác giả.
Related Posts
Progressive Delivery: Deploy Từ Từ, An Toàn Hơn
Deploy toàn bộ production một lần là canh bạc. Progressive Delivery giảm rủi ro bằng cách rollout từng bước, có cơ chế rollback tự động.
Podman 6.0: Tạm Biệt CNI, iptables, Slirp4netns — Container Engine Chuyển Mình
Podman v6.0 ra mắt với hàng loạt breaking changes: bỏ CNI, iptables, slirp4netns, chuyển sang Netavark + nftables + Pasta. Cùng lúc vá CVE rò rỉ biến môi trường và gia nhập CNCF.
Tại Sao Kỹ Sư DevOps Bắt Đầu Học MCP (Model Context Protocol)?
Model Context Protocol (MCP) không còn là một công cụ thử nghiệm của Anthropic mà đã trở thành chuẩn công nghiệp mới, định hình lại tương lai AI-driven DevOps.