Autoscaling Monzo: How we optimise our platform to be just the right size
Monzo · 2020 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- Gần như mọi hệ thống của Monzo chạy microservice trên Kubernetes (trừ vài hạ tầng có trạng thái như Cassandra, etcd). Mỗi service build từ cùng một framework, deploy cùng một kiểu: một container service + một sidecar envoy của service mesh.
- Chọn kích thước cho service thường là: đoán, sai, chờ cạn tài nguyên, thêm biên rộng "để không bao giờ lặp lại" (rồi vẫn lặp lại). Đánh đổi giữa hiệu quả (càng nhỏ càng rẻ) và khả năng chịu đựng (cần headroom).
Thay đổi chính
-
Vertical Pod Autoscaler (VPA): recommender dựng mô hình từ CPU/RAM thực dùng và gợi ý request; updater evict pod có request lệch xa (Kubernetes khi đó chưa đổi request của pod đang chạy được); admission webhook gán request mới khi pod được tạo lại. Recommender chạy một mình cũng dùng được như công cụ cảnh báo.
-
Horizontal Pod Autoscaler (HPA): thêm bớt replica theo ngưỡng (70% CPU).
-
Ba chế độ trong công cụ nền tảng, service owner tự chọn:
Chế độ VPA HPA Manual chỉ gợi ý, không áp tắt Vertical (mặc định) áp cho mọi container tắt Horizontal lo RAM của service, CPU+RAM của envoy theo CPU của container service Envoy luôn được scale tự động, trong suốt với service owner; cả hai container tự tăng RAM khi bị OOM kill.
-
Vòng đời điển hình: service mới chạy Vertical với 3 replica, nhiều service chỉ cần 10 millicore mỗi replica; VPA tự nâng request khi service làm nhiều hơn; khi vào đường găng hoặc tải dao động (ví dụ luồng mở app) thì chuyển Horizontal. Đang làm "mode trigger" để chuyển chế độ tự động.
Những gì không suôn sẻ
- Evict không có rate limit: chạy VPA ở chế độ Off để kiểm gợi ý, bật Auto thì hàng nghìn pod bị evict liên tiếp. Monzo đóng góp bản sửa cho phép cấu hình rate limit eviction.
- Eviction không tôn trọng rollout strategy của Deployment: có thể evict mọi replica cùng lúc. Sửa bằng Pod Disruption Budget cho mỗi service.
- Không lấy được lịch sử từ Prometheus ở cụm lớn: recommender dựng mô hình lại từ đầu mỗi lần restart, gợi ý dao động, evict nhiều hơn, rồi evict chính recommender; có lúc hơn 1.000 eviction/giờ. Theo Monzo, ngân hàng vẫn không bị ảnh hưởng nhờ Kubernetes giữ đúng thứ đang chạy.
- Hai autoscaler giẫm nhau: HPA mặc định tính 70% trên cả pod, nên với pod request nhỏ, riêng envoy (xử lý cập nhật về downstream) đã đủ kích HPA scale lên. Sửa bằng custom metric chỉ tính container service.
Bài học cho SWE
- Đặt kích thước tài nguyên nên là việc của nền tảng, có mặc định tốt, không phải của từng service owner (Nền tảng nội bộ cho service (đường ray chung)).
- Chạy hệ tự động ở chế độ chỉ-gợi-ý trước khi cho nó hành động; khi bật thì có rate limit cho hành động.
- Mọi cơ chế tự động có quyền dừng pod cần một giới hạn chung (PDB) để không đánh sập cả service.
- Autoscaler tự scale chính nó tạo vòng phản hồi xấu khi dữ liệu đầu vào hỏng.
- Right-sizing là bài toán chi phí lẫn độ tin cậy (Chi phí hạ tầng và build vs buy).