Container & Deployment Microservices — K8s & Progressive Delivery
Mở đầu
Ảnh: Wolfgang Weiser — Pexels
Khi bạn đã thiết kế microservices, xác định bounded context, chọn communication style, và xây dựng CI/CD pipeline — bước cuối cùng là đưa chúng vào production một cách an toàn. Chapter 8 của Building Microservices bàn về deployment: làm sao để triển khai nhiều service nhỏ lên môi trường production mà không làm sập hệ thống, không gây downtime, và có thể rollback nhanh khi cần.
Sam Newman dành cả chapter này để nói về hai trụ cột: container (với Docker) làm nền tảng, và Kubernetes làm orchestration layer, kết hợp với progressive delivery để giảm thiểu rủi ro mỗi lần deploy.
Tại sao Container là nền tảng cho Microservices?
Ảnh: ThisIsEngineering — Pexels
Container giải quyết vấn đề muôn thuở của microservices: "nó chạy trên máy tôi mà". Mỗi service có thể dùng phiên bản ngôn ngữ, thư viện, hệ điều hành khác nhau — container đóng gói tất cả vào một image duy nhất, đảm bảo môi trường giống nhau từ dev lên production.
Với Docker, bạn build image một lần và chạy ở mọi nơi. Newman nhấn mạnh một số best practices:
- Minimal base images: Dùng Alpine hoặc distroless images để giảm dung lượng và attack surface. Image nhỏ = pull nhanh hơn = scale nhanh hơn.
- Immutable infrastructure: Không SSH vào container để fix bug. Có lỗi thì build lại image mới, deploy lại. Container là disposable — tạo mới dễ hơn sửa cũ.
- One concern per container: Mỗi container chạy đúng một process (ứng dụng), không chạy nhiều process trong cùng container. Dùng init system (tini, dumb-init) nếu cần handle signal.
- Health checks: Luôn định nghĩa health check endpoint để orchestrator biết service còn sống hay không.
Container image registry cũng là một thành phần quan trọng. Bạn cần một private registry (Docker Hub private, Amazon ECR, Google Container Registry, Harbor) để lưu images và quản lý version. Mỗi build → một tag mới (không dùng latest trong production).
Kubernetes — Bộ não điều phối Container
Ảnh: Mikhail Fesenko — Pexels
Khi bạn có 20, 50, 100 microservices, không thể manual start/stop từng cái được. Kubernetes (K8s) là orchestration platform phổ biến nhất, giúp bạn quản lý container cluster với các khái niệm cốt lõi:
- Pod: Đơn vị nhỏ nhất trong K8s — một hoặc nhiều container chạy cùng node, cùng network namespace. Thường 1 pod = 1 service container + sidecar (nếu cần).
- Deployment: Declare desired state: "chạy 3 replicas của service X với image version Y". K8s tự động maintain trạng thái đó — nếu pod chết, nó tạo pod mới.
- Service: Abstraction layer cho network — mỗi service có một virtual IP và DNS name ổn định, bất kể pod bị recreate hay reschedule.
- ConfigMap & Secret: Tách cấu hình và credentials khỏi container image. ConfigMap cho config không nhạy cảm, Secret cho dữ liệu nhạy cảm (API keys, database passwords).
Newman cũng lưu ý rằng K8s không phải giải pháp một-size-fits-all. Nếu bạn chỉ có 3-5 services, một orchestrator nhẹ hơn (Docker Compose, Nomad) hoặc thậm chí serverless (AWS Lambda) có thể phù hợp hơn. K8s có độ phức tạp vận hành (cluster management, networking, monitoring) không nhỏ.
Progressive Delivery — Deploy an toàn từng bước
Phần quan trọng nhất của chapter này là progressive delivery: chiến lược deploy từ từ, giảm blast radius — nếu có lỗi chỉ ảnh hưởng một phần nhỏ user.
Blue-Green Deployment
Giữ hai môi trường giống hệt nhau: Blue (production cũ) và Green (production mới). Deploy phiên bản mới lên Green, chạy thử, test, rồi chuyển router từ Blue sang Green. Nếu có vấn đề, chuyển lại Blue ngay lập tức. Newman thích cách này vì rollback nhanh (chỉ là switch traffic). Nhược điểm: tốn gấp đôi tài nguyên.
Canary Release
Deploy phiên bản mới cho một nhóm nhỏ user trước (ví dụ 5%), monitor metrics, nếu ổn thì tăng dần lên 25%, 50%, 100%. Cần có feature flag hoặc service mesh để route traffic linh hoạt. Canary release an toàn hơn blue-green vì bạn có thể quan sát tác động thực tế trước khi roll ra toàn bộ.
Feature Flags (Feature Toggles)
Kỹ thuật này cho phép bạn merge code lên production sớm nhưng ẩn tính năng sau một flag. Kích hoạt flag khi đã sẵn sàng, hoặc cho một nhóm user cụ thể (beta testers, internal staff). Feature flags tách rời thời điểm deploy khỏi thời điểm release — deploy anytime, release when ready.
Dark Launch
Deploy service mới nhưng chưa cho user thấy — chỉ gửi traffic copy (mirror) từ service cũ sang service mới để kiểm tra performance và correctness trong production. Nếu service mới chạy ổn, route traffic thật qua.
Blast Radius — Nguyên tắc vàng của Deployment
Xuyên suốt chapter này, Newman nhắc đi nhắc lại khái niệm blast radius: "khi deploy gây lỗi, bao nhiêu phần hệ thống bị ảnh hưởng?"
Chiến lược giảm blast radius:
- Cell-based architecture: Chia cluster thành các cell độc lập, mỗi cell có đủ tài nguyên riêng. Lỗi chỉ trong một cell.
- Shard your services: Thay vì một instance to, chạy nhiều instance nhỏ — mỗi instance phục vụ một subset user.
- Deploy theo nhóm: Không deploy tất cả service cùng lúc. Deploy từng service một, quan sát, rồi deploy service tiếp theo.
- Rollback plan trước khi deploy: Luôn có sẵn rollback script. Không deploy nếu chưa biết cách undeploy.
Key Takeaways
- Container (Docker) là nền tảng deployment chuẩn cho microservices — immutable, reproducible, lightweight
- Kubernetes giúp quản lý container cluster với deployment, service discovery, scaling tự động
- Progressive delivery (blue-green, canary, feature flags) giảm rủi ro deploy bằng cách phơi nhiễm dần user mới
- Blast radius là nguyên tắc thiết kế quan trọng nhất: luôn deploy sao cho lỗi ảnh hưởng ít user nhất
- Feature flags tách deploy khỏi release — cho phép deploy code bất kỳ lúc nào, release khi đã sẵn sàng
📋 Phụ lục thuật ngữ
| Container | Đơn vị đóng gói ứng dụng + dependencies, chạy isolated trên host OS, nhẹ hơn VM |
| Kubernetes (K8s) | Container orchestration platform — tự động deploy, scale, quản lý container cluster |
| Pod | Đơn vị nhỏ nhất trong K8s, chứa một hoặc nhiều container |
| Blue-Green Deployment | Giữ hai môi trường production song song, switch traffic khi deploy |
| Canary Release | Deploy từ từ cho một tỷ lệ nhỏ user trước, mở rộng dần |
| Feature Flag | Kỹ thuật bật/tắt tính năng qua config, không qua deploy |
| Dark Launch | Deploy service mới nhưng mirror traffic, chưa cho user thấy kết quả |
| Blast Radius | Mức độ ảnh hưởng khi một component gặp sự cố |
| Immutable Infrastructure | Không sửa server đang chạy — tạo lại từ image mới khi cần thay đổi |
Kết
Deployment là nơi lý thuyết gặp thực tế — thiết kế có đẹp đến mấy mà deploy lên production không an toàn thì cũng vô dụng. Chapter này của Building Microservices không chỉ dạy bạn cách dùng Docker và K8s, mà quan trọng hơn: mindset về progressive delivery và blast radius.
Chapter tiếp theo sẽ đi sâu vào chi tiết vận hành microservices trong production — từ monitoring, logging đến incident response. Hẹn gặp lại bạn ở bài sau!