Skip to content

NimTechnology

Trình bày các công nghệ CLOUD một cách dễ hiểu.

  • Kubernetes & Container
    • Docker
    • Kubernetes
      • Ingress
      • Pod
    • Helm Chart
    • OAuth2 Proxy
    • Isito-EnvoyFilter
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Vault
    • Longhorn – Storage
    • VictoriaMetrics
    • MetalLB
    • Kong Gateway
  • CI/CD
    • ArgoCD
    • ArgoWorkflows
    • Argo Events
    • Spinnaker
    • Jenkins
    • Harbor
    • TeamCity
    • Git
      • Bitbucket
  • Coding
    • DevSecOps
    • Terraform
      • GCP – Google Cloud
      • AWS – Amazon Web Service
      • Azure Cloud
    • Golang
    • Laravel
    • Python
    • Jquery & JavaScript
    • Selenium
  • Log, Monitor & Tracing
    • DataDog
    • Prometheus
    • Grafana
    • ELK
      • Kibana
      • Logstash
  • BareMetal
    • NextCloud
  • Toggle search form

[K8S] Reseach VPA on K8S

Posted on February 9, 2026February 9, 2026 By nim No Comments on [K8S] Reseach VPA on K8S

VPA: Recommender, Updater, và Admission Controller.

Đây là chi tiết quy trình hoạt động:

Contents

Toggle
  • 1. VPA Collect Metric như thế nào? (Thu thập dữ liệu)
  • 2) Workflow InPlaceOrRecreate (Quy trình chuẩn)
  • Các điểm cần lưu ý kỹ (Gotchas)

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 Checkpoint trong 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 ModeHành viGiải thích
OffChỉ tính toánVPA tính toán recommendation nhưng không bao giờ sửa Pod. Dùng để chạy thử (Dry-run) xem đề xuất.
InitialSửa lúc tạoVPA 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.
RecreateKill & 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.
InPlaceOrRecreateThử 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).
Vertical Pod Autoscaling architecture

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)

  1. Tính toán (Giống cũ):
    • Recommender vẫn tính toán và update object VerticalPodAutoscaler với các thông số đề xuất (Target, LowerBound, UpperBound).
  2. 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).
  3. 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 resources trong spec).
      • 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.
    • 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ả).

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)”.

Kịch bản thay đổiHành vi của VPATrạng thái PodGiải thích Chi tiết
Tăng CPU (Scale Up)In-place UpdateRunningVPA patch Pod Spec. Kubelet cập nhật cgroups ngay lập tức. Process nhận thêm CPU quota mà không gián đoạn.
Giảm CPU (Scale Down)In-place UpdateRunningVPA giảm CPU request/limit. Process bị throttle lại ngay lập tức.
Tăng Memory (Scale Up)In-place UpdateRunningVPA patch Pod Spec. Nếu Node còn đủ RAM trống, Kubelet tăng memory.limit_in_bytes. Giúp tránh OOM Kill nóng.
Giảm Memory (Scale Down)In-place Update (Có điều kiện)RunningMới trên K8s 1.35: Kubelet thử giảm RAM. Nếu mức dùng hiện tại (usage) < mức mới (limit), nó giảm thành công mà không restart. Nếu usage > new limit, hành động này bị chặn hoặc thất bại -> Chuyển sang Evict ​.
Scale Up (Node Full)Evict & RecreateRestartNếu Node hiện tại hết tài nguyên để nới rộng Pod, In-place update sẽ thất bại (API trả về lỗi hoặc Pending). VPA Updater nhận biết điều này và chuyển sang phương án Kill Pod để Scheduler chuyển nó sang Node khác.
ResizePolicy: RestartEvict & RecreateRestartNếu trong Pod Spec bạn cấu hình resizePolicy: RestartContainer cho resource đó, VPA tôn trọng cấu hình này và sẽ Kill Pod thay vì thử In-place.
Thay đổi quá lớn (>10%)In-place UpdateRunningKhác với bản cũ, bản mới vẫn ưu tiên In-place dù thay đổi lớn, miễn là Node đáp ứng được ​.

Các điểm cần lưu ý kỹ (Gotchas)

  1. Cơ chế Fallback (Dự phòng):
    Quy trình InPlaceOrRecreate khô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à InProgress quá lâu hoặc Infeasible (Không khả thi), Updater mới quyết định gửi lệnh Eviction.
  2. 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.
  3. 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ủa InPlaceOrRecreate.

Bạn cũng thể tìm hiểu cơ chế của VPA recommandation collect và đưa ra quyết định:

https://erikzilinsky.com/posts/vpa1.html

Uncategorized

Post navigation

Previous Post: [Interview] Những kiến thực thú vị cần tìm hiểu trong interview
Next Post: [Gateway API] Migrate from NGINX Ingress to Gateway API

More Related Articles

Protected: My Assignment  Uncategorized
[Cilium/Hubble] Research together and install cilium instead of using kube-proxy and other CNI providers. Kubernetes
[Azure] Boosting Azure Network Performance with Accelerated Networking on AKS Uncategorized
[Phi&P] Leadershift Certificate. Coding
[Prometheus] Relabelling – Custom “__name__” to your mind Prometheus
[Golang] List large files in the folder quickly on Golang Golang

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Tham Gia Group DevOps nhé!
Để Nim có nhiều động lực ra nhiều bài viết.
Để nhận được những thông báo mới nhất.

Recent Posts

  • Compare Instance mode (NodePort) và IP mode (Pod IP) in EKS Application Load Balancer (ALB) March 14, 2026
  • [Database] How do you choose the best database for your product. March 14, 2026
  • [Openclaw] Openclaw authentication with chatgpt March 8, 2026
  • [OpenClaw]”Openclaw suddenly became stupid” or “lost its rights.” March 8, 2026
  • [GatewayAPI/Traefik] (Error) Failed to verify certificate: x509: certificate has expired March 6, 2026

Archives

  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021

Categories

  • AI
    • OpenClaw
  • BareMetal
    • NextCloud
  • CI/CD
    • Argo Events
    • ArgoCD
    • ArgoWorkflows
    • Git
      • Bitbucket
    • Harbor
    • Jenkins
    • Spinnaker
    • TeamCity
  • Coding
    • DevSecOps
    • Golang
    • Jquery & JavaScript
    • Laravel
    • NextJS 14 & ReactJS & Type Script
    • Python
    • Selenium
    • Terraform
      • AWS – Amazon Web Service
      • Azure Cloud
      • GCP – Google Cloud
  • Kubernetes & Container
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Docker
    • Helm Chart
    • Isito-EnvoyFilter
    • Kong Gateway
    • Kubernetes
      • Ingress
      • Pod
    • Longhorn – Storage
    • MetalLB
    • OAuth2 Proxy
    • Vault
    • VictoriaMetrics
  • Log, Monitor & Tracing
    • DataDog
    • ELK
      • Kibana
      • Logstash
    • Fluent
    • Grafana
    • Prometheus
  • Uncategorized
  • Admin

Copyright © 2026 NimTechnology.