Container & Deployment Microservices — K8s & Progressive Delivery

Phong

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 DeploymentGiữ hai môi trường production song song, switch traffic khi deploy
Canary ReleaseDeploy từ từ cho một tỷ lệ nhỏ user trước, mở rộng dần
Feature FlagKỹ thuật bật/tắt tính năng qua config, không qua deploy
Dark LaunchDeploy service mới nhưng mirror traffic, chưa cho user thấy kết quả
Blast RadiusMức độ ảnh hưởng khi một component gặp sự cố
Immutable InfrastructureKhô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!