VPA: Recommender, Updater, và Admission Controller.
Đây là chi tiết quy trình hoạt động:
1. VPA Collect Metric như thế nào? (Thu thập dữ liệu)
Thành phần chịu trách nhiệm chính là VPA Recommender.
- Nguồn dữ liệu: VPA Recommender không tự đo đạc trực tiếp từ container. Thay vào đó, nó lấy dữ liệu từ Metrics Server (thông qua Metrics API) hoặc có thể cấu hình để lấy từ Prometheus (lịch sử dài hơn).
- Quy trình:
- Nó liên tục “poll” (hỏi) metrics sử dụng CPU và Memory hiện tại của các Pod.
- Nó cũng lắng nghe các sự kiện OOM (Out Of Memory). Nếu một Pod bị chết do hết RAM, VPA sẽ ghi nhận sự kiện này để đề xuất mức RAM lớn hơn ngay lập tức.
- Lưu trữ: Dữ liệu lịch sử được lưu dưới dạng các đối tượng
Checkpointtrong Kubernetes (hoặc trong Prometheus nếu cấu hình). Điều này giúp VPA nhớ được biểu đồ sử dụng của Pod ngay cả khi Pod đó bị restart.
Chúng ta sẽ có 3 mode cho VPA:
| Update Mode | Hành vi | Giải thích |
|---|---|---|
Off | Chỉ tính toán | VPA tính toán recommendation nhưng không bao giờ sửa Pod. Dùng để chạy thử (Dry-run) xem đề xuất. |
Initial | Sửa lúc tạo | VPA chỉ can thiệp (inject resource) khi Pod được tạo mới (webhook). Sau khi Pod chạy, nó sẽ không bao giờ bị sửa đổi hay restart. |
Recreate | Kill & Inject | (Cách hoạt động cổ điển) VPA sẽ Evict (Kill) Pod đang chạy nếu cần sửa resource. Pod mới sinh ra sẽ được inject thông số mới. |
InPlaceOrRecreate | Thử In-place -> Kill | (Tính năng bạn đang tìm) VPA sẽ thử update nóng resource (In-place). Nếu thất bại (do Node full, lỗi…) thì mới quay sang Kill Pod (Recreate). |
Chúng ta đều biêt ở K8S v1.35 có tính năng In-place Pod Resize và đặc điệm quan trong là chúng ta có thể change ram/cpu của pod trên k8s mà không gây ra vấn đề restart pod.
Để tuận dụng cho việc này chúng ta cần update mode cho VPA sẽ là InPlaceOrRecreate.
2) Workflow InPlaceOrRecreate (Quy trình chuẩn)
- Tính toán (Giống cũ):
- Recommender vẫn tính toán và update object
VerticalPodAutoscalervới các thông số đề xuất (Target,LowerBound,UpperBound).
- Recommender vẫn tính toán và update object
- Phát hiện chênh lệch (Updater):
- VPA Updater chạy định kỳ và thấy Pod cần thay đổi resource.
- Khác biệt bắt đầu ở đây: Thay vì ra lệnh “Evict” ngay lập tức, Updater kiểm tra xem thay đổi này có thể thực hiện “In-place” được không (dựa trên version K8s, trạng thái Node, config VPA).
- Rẽ Nhánh Xử Lý:
- Nhánh A: In-Place Update (Ưu tiên)
- Thực thi (Updater): VPA Updater gọi trực tiếp API Server để PATCH object Pod đang chạy (cập nhật trường
resourcestrongspec). - Kubelet & Runtime: Kubelet trên Node nhận thấy Pod Spec thay đổi -> Ra lệnh cho Container Runtime (containerd/CRI-O) cập nhật cgroups giới hạn CPU/RAM cho process đang chạy.
- Kết quả: Pod KHÔNG bị giết. Process tiếp tục chạy với resource mới.
- Vai trò Admission Controller: Ở nhánh này, Admission Controller KHÔNG tham gia vào việc bơm cấu hình, vì Pod không hề được tạo lại.
- Thực thi (Updater): VPA Updater gọi trực tiếp API Server để PATCH object Pod đang chạy (cập nhật trường
- Nhánh B: Recreate (Fallback – Giống quy trình cũ)
- Khi nào vào nhánh này? Khi thay đổi quá lớn (Node hết chỗ), hoặc giảm RAM sâu, hoặc gặp lỗi khi Patch.
- Trục xuất (Updater): Updater quyết định In-place không khả thi -> Gửi lệnh Evict Pod.
- Tạo lại (Controller Manager): Deployment tạo Pod mới.
- Bơm cấu hình (Admission Controller): Lúc này Admission Controller mới nhảy vào, chặn request tạo Pod và inject thông số mới (giống hệt quy trình bạn mô tả).
- Nhánh A: In-Place Update (Ưu tiên)
Bảng Hành Vi Tổng Quát:
Trong chế độ này, nguyên tắc cốt lõi là: “Thử In-place trước. Nếu thất bại hoặc không khả thi -> Evict (Kill)”.
Các điểm cần lưu ý kỹ (Gotchas)
- Cơ chế Fallback (Dự phòng):
Quy trìnhInPlaceOrRecreatekhông phải là “làm hoặc chết”. Nó là một vòng lặp thử nghiệm:- Bước 1: Updater gọi API Patch Pod.
- Bước 2: Xem kết quả
PodStatus.Resize. - Bước 3: Nếu trạng thái là
InProgressquá lâu hoặcInfeasible(Không khả thi), Updater mới quyết định gửi lệnh Eviction.
- Giảm Memory (Scale Down):
Đây là thay đổi lớn nhất. Trước đây (Alpha/Beta cũ), giảm RAM luôn dẫn đến Restart. Trên K8s 1.35 (Stable), giảm RAM In-place là khả thi nhưng Best-effort.- Nếu App đang dùng 800MB, VPA muốn giảm Limit xuống 500MB -> Không thể In-place (vì sẽ gây OOM ngay). VPA sẽ chọn Evict để tạo Pod mới ép App chạy trong khuôn khổ 500MB (có thể crash loop nếu App thực sự cần 800MB).
- Nếu App đang dùng 300MB, VPA muốn giảm Limit xuống 500MB -> Thành công In-place.
- Startup CPU Boost:
K8s 1.35 hỗ trợ mẫu hình “CPU Boost”. Pod khởi động với 2 CPU (để boot nhanh), sau đó VPA hạ xuống 0.5 CPU In-place. Đây là use-case hoàn hảo nhất củaInPlaceOrRecreate.
Bạn cũng thể tìm hiểu cơ chế của VPA recommandation collect và đưa ra quyết định: