Answer-first: Tính năng In-Place Pod Resizing (Nâng hạ Pod Tại Chỗ - đã đạt mốc GA ổn định ở Kubernetes v1.35) trao quyền cho bạn thay đổi cấu hình requests/limits của cả CPU và memory (bộ nhớ) trên các containers đang trong quá trình chạy mà chẳng thèm phải restart (khởi động lại) cái pod đó — triệt tiêu hoàn toàn sự gián đoạn của các đợt khởi động lạnh (cold-start disruptions) dành riêng cho nhóm tải việc AI inference (suy luận AI), hệ thống cơ sở dữ liệu (databases), và cả mấy cái khối xử lý mang thuộc tính stateful (cần lưu trạng thái) cứng đầu. Cuốn cẩm nang này sẽ moi móc hết rạch ròi về yêu cầu mấu chốt, hàng mẫu YAML dùng cho production, kiểu tích hợp chung bộ VPA, các nước cờ tối ưu hóa tiền bạc, cùng mấy cái bẫy chết người (gotchas).
Ngược dòng thời gian trước khi có thứ vũ khí này, muốn sửa đổi miếng bánh tài nguyên (resource allocation) cấp cho một cái container thì chỉ có nước cắn răng nhấn xóa đập bỏ đi xong rồi lại móc nặn tái tạo từ đầu một cái pod mới (deleting and recreating the pod). Thử tưởng tượng với một con database dạng stateful đang tay ôm giữ khư khư mớ chùm nối mạng connections, hay một bộ não mô hình AI đang chất ních ngậm 30GB khối lượng weights trương phình chật kín bộ nhớ, hoặc rủi là một chuyến tàu chở hàng batch job chạy marathon — cái nhát cắn restart đó đúng là thảm họa giáng xuống đầu (catastrophic). Phép màu In-Place Pod Resize rốt cục đã giang tay gỡ trói tháo tung cái gánh nặng kìm kẹp cột quản lý tài nguyên tách bạch hoàn toàn ra khỏi cái vòng luân hồi sinh tử của một con pod (pod lifecycle).
Bài báo này chính xác là một bộ cẩm nang chiến trận production: chộp lấy giải thích rõ nó là cái quái gì, đem đi xài như thế nào, và đâu là những góc cạnh sắc bén rạch máu tay. Để liếc nhìn rộng hơn về bức tranh bài binh bố trận toàn diện bên phía hệ Kubernetes, thì thử ngó qua bài chỉ nam GitOps ở Quy Mô Lớn (GitOps at Scale) của tụi này. Chẳng may mà bạn còn đang lên kế hoạch mài giũa hệ thống Go services, thì cái đống xôi thịt Cải tiến Go 1.26 Green Tea GC quả thực là đòn kết hợp cực phẩm ăn ý cặp bài trùng sóng đôi cùng ngón đòn resize tại chỗ này để dồn ép bọn ứng dụng thèm ngốn bộ nhớ (memory-efficient workloads).
1. Món In-Place Pod Resizing Này Rốt Cuộc Là Cái Cớ Sự Gì?
Answer-first: In-Place Pod Resizing giang tay thả lỏng để cho bạn gõ một phát PATCH đè ngay lập tức lệnh chỉnh sửa các thông số resource requests/limits của container trên một cái pod đương nhịp chạy sống rành rành nhờ vào trạm đường dẫn nhánh (subresource) tên /resize. Thành phần kubelet sẽ tự tay thọc sâu vào cựa nắn ép các giới hạn của phần container cgroup mà tuyệt đối không nảy sinh trò ngắt cầu dao dừng máy hay bắt ép phải nhồi khởi động lại nó (restarting). Tính năng xịn sò này đã đường hoàng bước lên bục phong ấn mác Ổn Định (Stable - GA) nằm ngay tại bản Kubernetes v1.35, vừa ra lò nhả khói dạo tháng 12/2025.
Bức Tranh So Kè Trở Tay: Trước vs. Sau
| Khung Cảnh Trận Mạc (Scenario) | Thuở Trước v1.35 | Thời Khắc Sau v1.35 |
|---|---|---|
| Tụi AI inference pod rú rít đòi thêm họng bộ nhớ lúc đụng nóc tải (peak) | Chém đầu pod → Cắm cờ gọi pod mới lên → Gồng lưng nhồi nạp model weights (ăn nhạt 30s–5phút chờ cold start) | Giã lệnh PATCH resize → Hạn mức Memory nhích nở lên tức thì chừng ~1s → Êm ru chả rớt nhịp (No disruption) |
| Lão Database nài nỉ xin trướng phình CPU burst gánh chuyến chót mẻ đêm batch | Tay máy Vertical Pod Autoscaler bực bóp mỏ restart → rơi rụng xả cụt sạch lốc mớ chùm kết nối connections | VPA quất nhẹ lệnh patches resize → Vạch chỉ CPU limit vọt lên → Không rụng một cọng kết nối (zero connection loss) |
| Pod của bầy phát triển dev gào kêu mượn rớ nới tí xíu tài nguyên tạm bợ | Mò mẫm sửa deployment → cắn răng rolling restart | Gõ cọc kubectl resize → Nhanh phát một tắp lự (instant) |
| Phí phạm để không tụi pods rảnh rỗi ngốn đồ lãng phí suốt đêm overnight | Phải Scale down giật tụt số lượng replicas xuống (bị bóp mất tiêu trạng thái state) | Thu chóp Resize xuống thấp → nuôi lây lất giữ lấy cái mạng sống pod hớp tí ti cỏn con tài nguyên (minimal resources) |
Chặng Đường Tu Đạo Lên Ngai GA
| Phiên Bản (Version) | Định Phận Dấu Ấn (Status) | Lời Bàn (Notes) |
|---|---|---|
| Dấu v1.27 (2023) | Mầm non Alpha | Bị nhốt sau cánh cổng InPlacePodVerticalScaling |
| Cột v1.31 (2024) | Chồi xanh Beta | Được đặc xá mở sẵn bên phía API server, còn bên vế kubelet thì bị khép cửa |
| Chạm v1.33 (2025) | Lõi rễ Beta | Cờ bật thả lỏng mặc định ở mọi mặt trận |
| Đỉnh v1.35 (Tháng 12 2025) | Thành Quả Lớn Ổn Định (Stable / GA) | Không rào không dậu mớ cổng feature gates chi nữa cả. Rộng cửa rước vào mặc định (Enabled by default). |
2. Các Đòi Hỏi Khắt Khe Nền Tảng (Requirements)
Answer-first: Đáp đất ngay bãi Kubernetes v1.35+, chức năng thần thông In-Place Pod Resizing tự tin chường mặt hoạt động ngon lành (works out of the box) mà chẳng phải cạy gỡ thêm cái đống chốt khóa feature gates nào ráo. Thứ vướng bận đòi nợ nhức óc nhất chính là bộ nền chạy container (container runtime) bắt buộc phải đính sẵn chức năng hậu thuẫn ôm đỡ cái rễ API resize — điểm mặt có đại diện containerd ≥ 1.6.9 hoặc cũng có thể thế chân là CRI-O ≥ 1.25.
Bảng Mục Kiểm Duyệt Nền Móng (Infrastructure Checklist)
| Món Thành Phần (Component) | Vạch Mức Bản Phiên Tối Thiểu (Minimum Version) | Đôi Lời Chú Thích (Notes) |
|---|---|---|
| Kubernetes | v1.35+ | Giăng bảng GA, tiễn mớ chốt khóa rào feature gates |
| containerd | ≥ 1.6.9 | Gồng gánh rước bộ chức năng lệnh gọi CRI UpdateContainerResources |
| CRI-O | ≥ 1.25 | Phương án thay áo đối ngạch bọc rẽ so găng với anh containerd |
| kubelet | v1.35+ | Buộc rập y xì khớp dính với bảng phiên số từ rốn API server |
| kubectl | v1.35+ | Có vậy mới xúi giục gõ rào thao tác tiện trơn cái món lệnh kubectl resize |
Tình Hình Bảo Kê Trợ Lực Từ Tụi Dịch Vụ Kubernetes Đi Thuê (Dữ Liệu Thống Kê Điểm Nhịp Tới Tháng 6 Năm 2026)
| Nhà Cho Thuê Cung Ứng (Provider) | Độ Mở Hỗ Trợ (Supported) | Chút Vài Dòng Thông Báo Lẻ (Notes) |
|---|---|---|
| Cụm EKS | ✅ Nằm cụm cluster v1.35 | Phơi hàng lòi ra đón khách từ Tháng 3 2026 |
| Bãi GKE | ✅ Cắm cụm cluster v1.35 | Ngồi chiếu ưu tiên ở làn rước nhanh Rapid channel first |
| Sới AKS | ✅ Nã cụm cluster v1.35 | Dòm thả mồi xem trước Preview tít tắp tháng 2 2026 |
| K3s | ✅ Bản v1.35+ | Ăn nhịp bập liền mạch lọt với bộ rễ nhúng nhét đính sẵn embedded containerd |
3. Khui Cấu Trúc Guồng Bộ Máy (How It Works): Luật Kéo Cắt (Resize Policy) Cùng Với Tình Trạng Hiện Thời Của Cái Pod (Pod Status)
Answer-first: Từng cái vạch mặt container một sẽ được nhúng găm cho dính một cái bản điều quy tên resizePolicy đánh rớt thẳng lên từng món tài nguyên riêng lẻ (CPU/memory) hòng ấn định vạch mặt chỉ tên xem trò resize này có được cho ập xuống quất rốc tác động tức thì ngay lập tức không (NotRequired) hoặc nhỡ phải đi theo quy trình bế quan giật nút nổ tung dập lại container kia (RestartContainer). Rờ qua tay cái ngạch status.resize gắn trên mình của cái pod là rành rẽ nắm ngay được cái cỗ máy vòng trạng thái của tiến trình resize (resize state machine).
Khởi Thủy Dòng Chảy Thay Đổi Thể Tích (Resize Flow)
sequenceDiagram
participant User as Người gọi kubectl / VPA
participant API as Cổng API Server
participant Kubelet as Kubelet
participant CRI as Bộ runtime containerd / CRI-O
participant Container as Lõi Running Container
User->>API: Phất lệnh PATCH /api/v1/namespaces/ns/pods/name/resize
API->>API: Kiểm định vạch soi tài nguyên mới quăng chọi rà coi mớ LimitRange/Quota có cho lọt
API->>Kubelet: Ánh mắt Watch đánh hơi xì nhan đánh tiếng có biến động spec
Kubelet->>Kubelet: Soi mói đem đọ đo lôi spec.resources chọi vào status.resources
Kubelet->>CRI: Tạt lệnh UpdateContainerResources(newCPU, newMemory)
CRI->>Container: Nắn thóp bóp vuốt cái ngưỡng vạch cgroup limits (cpu.max, memory.max)
Container-->>CRI: Duyệt OK (im ru lẳng lặng không hề có mớ bùng nổ restart)
CRI-->>Kubelet: Thắng Lợi Success
Kubelet->>API: Úp đè vá Update mảng pod.status.containerStatuses[].resources
Kubelet->>API: Chốt đinh Set pod.status.resize = "" (khép cửa coi như hoàn thành complete)
Bộ Chọn Lựa Thả Luật Resize (Resize Policy Options)
spec:
containers:
- name: inference
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired # Đụng đè CPU resize: chả thèm cớ gì đòi bưng cái restart needed
- resourceName: memory
restartPolicy: RestartContainer # Lấn dạt sang Memory resize: trói ép phải bắt chịu cái khoản container restart
Mạch restartPolicy | Kiểu Đu Đưa (Behavior) | Khuyên Gấp Rinh Về Ngay Lúc Nào (Use When) |
|---|---|---|
Mã NotRequired | Sự vuốt nắn resize chọt nhảy ập live thẳng thừng ăn dọng thông qua nhát điệu chỉnh bóp ngạch cgroup adjustment | Chuyên mâm cho nhóm CPU (luôn thả ga bảo vệ an toàn), Memory (tự tin chơi bạo nếu cái khối app nhai tiêu chịu đựng mướt mượt được pha nhồi nở dãn ngạch memory limit) |
Chức RestartContainer | Lõi Container bị bứng sập nhồi giật tung bừng tỉnh thức lại (restarted) liền bám chóp ngay sau vệt resize | Nhóm thọt thụt khoét tụt ngạch Memory decrease (nguy to cái khối app rất có khi đã há mõm ăn ngoạm lút liếm lấp sạch lên đụng luôn trần của cái cữ ngạch cũ old limit mất tiêu), hay là gieo cho mớ app có tật xấu cắn nhay chỉ thèm nhấm soi mút cái thẻ bài memory limit vào đúng cái giờ khắc bừng mắt thức giấc lúc ban sơ mới dậy startup |
Lời Sấm Truyền Tỏ Rạch Góc Production (Production recommendation): Dành riêng cho số bầy đàn phần lớn các con dịch vụ, hãy phang ghim cọc thẳng CPU vào mức
NotRequiredcùng với món memory neo ở mốcNotRequirednhưng cấm kỵ chỉ để khui mở rộng nới cửa mút nâng tăng lên dãn bung thêm (increases only) mà thôi. Cái chiêu thụt hạ ghim Memory decreases đánh dập lên đầu đám apps đang phình bụng phễnh phễnh ngấu nghiến ôm đống cấp mảng bãi heap to ụ (large heap allocations) rất có bề sinh sự chết giập OOM nếu như chả may con mảng app đó khờ rạc ngu ngu chẳng chịu nôn trả ngả mồi ói bớt memory (release memory) vào dĩ vãng.
Săm Soi Nắm Bắt Các Cung Bậc Tình Huống Của Pod (Pod Status) Ngay Trong Cơn Rặn Resize
status:
resize: InProgress # hay dòm thấy ngó: Proposed, Deferred, Infeasible, ""
containerStatuses:
- name: inference
resources:
requests:
cpu: "4" # thực chất khoản tài nguyên xơi lót dọn mâm thực nhận current allocation
memory: "8Gi"
allocatedResources:
cpu: "4"
memory: "8Gi"
Nhìn vào status.resize | Cắt Nghĩa Căn Nguyên Bụng Dạ (Meaning) |
|---|---|
Cái chóp "" (Rỗng không empty) | Khúc dạo resize đã đứt đuôi hoàn mĩ xong xuôi hoặc bới chả có móc được mớ móng resize nào đang dính nợ đọng chờ pending |
Gắn thẻ Proposed | Ngõ trạm cửa API server đã thả rào duyệt ngó ưng cái món lệnh resize đó, có cơ thằng kubelet lề rề chưa có chịu xắn tay vào cựa quậy động chân tay (hasn’t acted yet) |
Ngạch InProgress | Cu li Kubelet đang nhào lộn cắm đầu hì hục nhồi bóp áp lệnh dộng cái nhát resize vào |
Vướng Deferred | Đau đớn cái thây máy Node dạo chóp này rỗng tuếch chả còn miếng mồi free resources rảnh rỗi nào dắt trong túi lúc này ngay tức thời right now; hẹn mai sau anh vác tiền tới gõ lại trả retry |
Chết tức tưởi Infeasible | Món nợ đòi resize là nhiệm vụ bất khả thi hụt ăn không sao rặn gồng ra để thầu nổi (do nống xé đòi lố quá sức chứa node capacity) |
4. Rải Xem Bảng Hàng Mẫu Đính Kèm File YAML Đóng Dấu Đóng Mộc Cho Khâu Production (Production YAML Examples)
Tờ Ráp Mẫu 1: Trồng Pod Cắm Trại Nhồi AI Inference Kẹp Phép Biến Thể Nhanh Tức Khắc CPU/Memory (Live CPU/Memory Scaling)
apiVersion: v1
kind: Pod
metadata:
name: llm-inference
labels:
app: llm-inference
model: llama-3-70b
spec:
containers:
- name: inference
image: ghcr.io/yourorg/llm-server:v2.1
resources:
requests:
cpu: "4"
memory: "32Gi"
limits:
cpu: "8"
memory: "64Gi"
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: NotRequired # Thoải mái con gà mái bọc an toàn: trọng số model weights được luồn trét nạp bằng mmap'd, không phải ôm nạp vô cục nợ xơi heap
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 5
Bơm kích tống resize đôn nạp ngay chóc giữa tâm bão giông tải nặng chót vót của inference (Resize during peak inference load):
# Sốc nhồi húc chổng đẩy bốc CPU lên nấc cao trào đón vỡ mâm lòi đỉnh đỉnh điểm (no restart miễn đụng chạm sập nguồn)
kubectl patch pod llm-inference --subresource resize --type merge -p \
'{"spec":{"containers":[{"name":"inference","resources":{"requests":{"cpu":"8"},"limits":{"cpu":"16"}}}]}}'
# Rú ga thục dồn tụt đạp lui dạt xuống lùi giảm gánh lúc chợp buông lơi rảnh ngơi off-peak
kubectl patch pod llm-inference --subresource resize --type merge -p \
'{"spec":{"containers":[{"name":"inference","resources":{"requests":{"cpu":"4"},"limits":{"cpu":"8"}}}]}}'
Mẫu 2: Nặn Hình Pod Dành Chứa Database — Phía CPU Lùa Nóng Live, Mảng Memory Nổ Đập Bắt Chịu Restart
apiVersion: v1
kind: Pod
metadata:
name: postgres-primary
spec:
containers:
- name: postgres
image: postgres:16
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired # Phần dải CPU phớt lờ rải dạt tự nhồi live mượt
- resourceName: memory
restartPolicy: RestartContainer # Món hệ PostgreSQL cố chấp khư khư bới móc dòm nốc vào xơi cữ shared_buffers mãi tận khúc lúc startup thôi
env:
- name: POSTGRES_SHARED_BUFFERS
value: "2GB"
Bản Gỡ Số 3: Bài Kéo Xe Cày Batch Job — Nêm Cựa Nhét Réo Resize Cả Khi Dang Tung Bừng Làm Việc Tứ Tung (During Execution)
apiVersion: batch/v1
kind: Job
metadata:
name: data-pipeline
spec:
template:
spec:
containers:
- name: etl
image: yourorg/etl-runner:latest
resources:
requests:
cpu: "2"
memory: "8Gi"
limits:
cpu: "8"
memory: "32Gi"
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: NotRequired
restartPolicy: Never
Nhỡ cái xui rủi rớt vô pha cày bừa nặng trịch nhai xé memory-intensive rát rạt khâu hệ cuốc cày ETL job đâm va phải (memory-intensive phase), một cái cỗ gác cổng external controller vất vưởng đứng canh ngoắt ngơ bên ngoài (hay kể cả là VPA) thình lình được phép móc đục tung vớt xốc lại mức dung lượng resize rượt đè giữa cơn điên rặn chạy (mid-execution) đó mà chả mảy may phá đánh rớt hụt gãy tan tành những công lao đổ mồ hôi sôi nước mắt vắt ròng rã suốt hàng mớ tá tiếng (hours of progress). Cho gộp cùng dải những nhánh dịch vụ đâm ngập rúng món họa rò rỉ rác thiu thúi goroutine leak issues gây bồi chắp nhồi tạo đắp thứ u nhọt cày phá làm cơi dãn bọc memory ngày một to đùng rềnh ràng (gradual memory growth), cắm tạt đòn ngón dộng đòn resize tại chỗ tắp lự in-place xoa trét cũng hòng bứng gỡ mua kéo nới dài rẽ gác thời gian nhằm mục rắp chờ bắt nắn dòm bệnh bắt mạch tìm nguồn cho mớ bòng bong cái leak chết tiệt kia bị vạch mặt trói ra dọn dẹp (diagnosed) — thế mà, cảnh tỉnh là đó rốt cục quyết liệt không được quyền rước ôm mang phong ấn làm chiêu thức bài thuốc lấp liếm dập rúc vứt bệt làm kế chắp vá mỏng manh thay bọc cho việc lột moi xắn tìm vá tận sào huyệt dẹp sửa mớ cái nguồn căn gốc rễ dọn dẹp nguyên do rách rưới (root cause).
5. Ghép Trọn Đòn VPA Lên Mâm: Cú Kéo Nắn Nới Tự Chạy Auto (Automatic In-Place Resizing)
Answer-first: Đấng cứu tinh Vertical Pod Autoscaler (VPA) từ mốc v1.3+ mang lọng ra oai bảo kê yểm hộ chức In-Place resize đứng chễm chệ khoanh một vai thành viên bệ mâm trong hội tụ phương pháp điều nắn chọt bản gán đè (update mode), gỡ bỏ rào cản chìa sẵn một con đường trổ mở thênh thang để cho bộ gác nắn lôi quẹt nhấc tự canh chọt tự vặn (automatic resource adjustment) trổ oai nhảy sầm sập hoạt động khơi khơi đắp vô tư khỏi sợ phiền dính gây náo động phá rối gì ráo (without pod disruption) — gạt sừng bỏ đuôi gộp chẻ chính đây là cú đánh xẹt bóc dính cực khủng tạt cái dẹp đem thẳng VPA tọt nhúm luôn vào ngạch chuẩn bị chinh chiến xịn production-ready nhắm ôm cái kho trút mớ workloads khó tánh xơi hàng stateful.
Lên VPA Cùng Với Lá Bài In-Place Update Mode
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: llm-inference-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: llm-inference
updatePolicy:
updateMode: "InPlace" # Đập cái mode mới toanh New mode: bóp nắn resize lẳng lặng vô thanh vô thức không sập ngóm restart
resourcePolicy:
containerPolicies:
- containerName: inference
minAllowed:
cpu: "2"
memory: "16Gi"
maxAllowed:
cpu: "32"
memory: "128Gi"
controlledResources: ["cpu", "memory"]
Hành Trình Tạt Dọn Cửa Của VPA Lồng In-Place Resize Hoạt Động Cụ Thể (How VPA + In-Place Resize Works)
flowchart TD
VPA[Khối xui giục đề bạt VPA Recommender] -->|Nuốt ngấu soi mói thông số đo metrics| REC[Phát loa Gợi ý Recommendation: rước chóp CPU đi từ 8 → nhún nảy 12]
REC --> UPDATER[Khối Update chỉnh nắn VPA Updater]
UPDATER -->|Hỏi han rờ mó ngạch updateMode| MODE{Bấm nút InPlace?}
MODE -->|Nghe chữ Yes| PATCH[Nã lệnh PATCH phang vô pod luồn trạm /resize subresource]
MODE -->|Bật cớ No| EVICT[Cuốn gói tống chóp Evict bứng pod → xé nháp ra luồng cọc cắm dựng new pod ôm chứa sườn tài nguyên mới bự rác new resources]
PATCH --> KUBELET[Culi Kubelet cắm búa rập khéo nắn cgroup]
KUBELET --> DONE[Con pod phơi lưng lướt chạy Running trượt nhịp sống vui sướng chắp gánh new resources ✅]
Tuyệt Kỹ Tạt Đánh Vuốt Giảm Nhẹ Hầu Bao Đựng Bạc Cost Optimization Pattern: Bo Nắn Bóp Tải Canh Giờ (Time-Based Resizing)
Lên hàng đắp riêng nắn riêng cho cái luồng bóp khối trí tuệ nhân tạo AI inference ôm sọt cái đống thông số đường vạch nhồi vác (load patterns) nắm nằm lòng sờ rờ thấy rõ đoãn (nã máy rát rạt cháy túi khung thời gian đút lót kiếm xu dạo xưởng mở cửa mần business hours, còn hất ngược rơi vãi rống khóc lúc trơ gác bếp nhàn cư rỗng túi overnight):
apiVersion: batch/v1
kind: CronJob
metadata:
name: inference-scaleup
spec:
schedule: "0 8 * * 1-5" # Nã nốc dọng đồng hồ đúng 8 AM gõ vạch ngày hì hục cày trong tuần weekdays
jobTemplate:
spec:
template:
spec:
containers:
- name: resizer
image: bitnami/kubectl:1.35
command:
- /bin/sh
- -c
- |
kubectl get pods -l app=llm-inference -o name | while read pod; do
kubectl patch $pod --subresource resize --type merge -p \
'{"spec":{"containers":[{"name":"inference","resources":{"requests":{"cpu":"16","memory":"64Gi"},"limits":{"cpu":"32","memory":"128Gi"}}}]}}'
done
restartPolicy: OnFailure
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: inference-scaledown
spec:
schedule: "0 22 * * 1-5" # Đánh kiểng còi 10 PM đổ mốc tối mờ tối mịt mấy bữa trong tuần weekdays
jobTemplate:
spec:
template:
spec:
containers:
- name: resizer
image: bitnami/kubectl:1.35
command:
- /bin/sh
- -c
- |
kubectl get pods -l app=llm-inference -o name | while read pod; do
kubectl patch $pod --subresource resize --type merge -p \
'{"spec":{"containers":[{"name":"inference","resources":{"requests":{"cpu":"4","memory":"32Gi"},"limits":{"cpu":"8","memory":"64Gi"}}}]}}'
done
restartPolicy: OnFailure
Bảng áng chừng hốt đếm cắt vụn rả món tiền gác túi lời Cost savings estimate: Nhỡ đâu gá nguyên sườn một con pod tải AI inference cày phơi lưng ải đày cưỡi cái mâm rác chóp vạch tương tự dòng p3.2xlarge (có cái gía $3.06/tiếng nhai) ngay tại dải khoanh vùng thời gian chạy công xưởng xé mâm business hours, sau đó lùi hẻm dạt nhịp lọt thu tóp hóp tẹp mỏng (downscale) trượt đáp cánh gãy càng vô mâm tương đồng dòng m5.xlarge (có mốc ăn dọng $0.192/giờ hao mòn) đút chọc khỏa lấp trong suốt 12 giờ cạn vắng tanh khách lảng vảng mâm rỗng off-peak hours — vậy tính ra đó là rớt lọt êm sấp sỉ thu vớt ~$34/ngày đút trọn túi (savings) bấu vớt thu lại trích rành đo trên chóp mỗi một mảng con pod rập bưng dạo.
6. Điểm Thụt Lùi Rớt Cấn Ràng Chân Limitations Kẹp Cùng Mớ Ổ Gà Lỗ Chó Bẫy Ngầm Gotchas
Answer-first: Chiêu rập bóp lọt In-Place Pod Resizing đeo đính trĩu vai gồng mớ rào cản thắt trói (constraints) cộm đầy hiện thực vô cùng chát chúa (real): anh không có cái quyền được nhét nhấn nạp hạ thấp rạch ngạch ép resize tuột tụt quá cả cái ranh vạch chóp mâm mốc lề tài nguyên hiện hữu đang dang dang ôm xài róc róch nuốt gọn (currently used resources), tịt ngóp không rướn trèo qua ranh vạch nhảy đan rập rào lấn cái mâm danh định QoS class (bước nhảy vượt ranh QoS class boundaries), và một điều nữa là món rách ruột đụng điểm kiệt quệ rỗng kho tài nguyên phán cho từ cái tầng gốc cục Node (node-level resource scarcity) trù ập xuống là sẽ tạt đổ kéo bè gác ngâm treo chuỗi resize kia dạt tuốt lùi ngưng đóng tảng lờ hẹn mai sau mãi mãi dằng dặc vô thời hạn (indefinitely). Gắng đúc dọng nốc nằm lòng thấu gan ba mớ lời trên kỹ cho trót lọt trước độ lúc ấn nã nhét đục phẩy phang ném gieo rắc đùn ra đùn rập thả nó (deploying).
Danh Mục Cấm Cửa Cản Mũi Hard Limitations
| Ngạch Cấm Đoán Bít Bùng (Limitation) | Phơi Bụng Giải Ngôn (Explanation) | Chỉ Nẻo Rẽ Nhánh Lấp Liếm Thoát (Workaround) |
|---|---|---|
| Không thèm cho cựa múa nhảy dây trèo qua lấn ranh giới QoS (Cannot cross QoS boundaries) | Tức cái lồng ngực là con pod đang lọt dải danh Guaranteed (có requests đính khít y boong=limits) tuyệt nhiên sẽ bó tay tịt ngóp cấm cửa đứt không cho sờ rập đục nặn dán đè resize nhảy qua chọc chỏm cái hạng bèo bọt Burstable (ngách requests<limits móp lệch) và chuyện đảo ngược chui xoắn cấm dòm vice versa cũng rứa | Gỡ não bôi trét rắp rải đắp nặn cho các con pods này vục nốc lọt thỏm ngay sẵn chóc vô cái bọc mâm chóp đích nhắm target QoS class kể từ cái thuở mốc dạo bưng nặn lọt ban sơ phôi thai the start |
| Bệnh khô rỗng kiệt đói tài nguyên rụng xuống cấp từ node (Node resource scarcity) | Thừa nhận rủi chả cớ may cái cục node phọt bệt lết trơ xương tịt chả lòi rứt ra nổi mấy chút cái cọc đồ miếng mồi thừa (free resources), cái thể diện bọc ngạch nhãn resize status văng rớt cái bịch vô sọt vương tên Deferred | Đấm dùng gài vô rào nã nấp nấp thọc dọng nẹp dạt xài cục Pod Disruption Budgets kẹp bồi nhét rắc xen thêm hệ chóp tự rão gân đôn vọt cluster autoscaler |
| Tai họa mạo hiểm chơi dao vót dạt tụt hóp mốc thẻ memory (Memory decrease risk) | Đè trút xẻo nhét đứt ngang cọc cái vạch thẻ memory limit lặn móp ngập thụt dưới quá cái ngấn bọc vạch sụn RSS hiện đương chóp ôm dọng là quất nã thọc thẳng chọc vỡ bọng xé tạt sụp luôn kích tống ầm ầm cái họa tử hình ngáp nghẻo trảm đứt OOM kill | Khuyên can chỉ bập nhấn thắt rút gạt dạt bóp xén cọn nhác cái trò hạ lùi trượt hóp giảm bộ memory (decrease memory) đánh dọng cho mấy dạng tụi pods nằm phè chịu ngoan hiền sự rập dây nhốt xiết kiểm soát kìm kẹp mảng heap thôi nha (nói cho dễ mường tượng tỉ như tay JVM mang kẹp đeo chốt đính thẻ cài -Xmx) |
| Quăng sọt hất cẳng đày ra lề khỏi tụt đám đàn anh khởi chạy init containers | Bị từ chối rọt quăng lọt đụt đục không được rờ mó vào chọc ngoáy nhào bóp resize đục nặn vác vào nhóm cho lũ init containers (bọn lỏi tì này vốn chễm chệ vỗ ngực đứt gánh ôm hàng trút lọt chóp xong xuôi cày nát nốt phần nó mẹ rồi) | Dĩ vãng ơ hơ miễn bàn đụng mâm N/A — cái đám lau nhau init containers sống loi ngoi chỉ tạc đo đếm bằng tấc nháy chớp mắt lướt bay thôi (short-lived) |
| Nhai rắc bộ kềm kẹp đóng ngoặc cắm đè cọc ResourceQuota | Cục nợ resize đong đếm kiểu lòi gì cũng vẫn ép bọc nhét tọt khít vừa đục chóp lọt nẹp nằm kẹp nêm vô y lót bên trong bụng của miếng rào chóp lồng ResourceQuota ranh rập tạc tại cái mâm xẻng gánh vác namespace | Mách nước cho khéo lấp dọn mở đường nới rào hố xới mương nới giắt bọng lót dư cất giấu cọc (Pre-allocate) chép túi phần room dư quota dự bị phòng trượt gót dành chọc rớt húp lót cho cái bọn tụi mâm kịch bản giăng trò đùa lúc rập bóp resize scenarios |
| Khâu rào kẽ lót ngó soi bắt vạch thói vạch xét cọc LimitRange | Mớ mấy cái khối giá trị đút thông số mới new values này bắt buộc phải nắn ép búng sao cho gạt lấn lướt thọt húp dẹp vừa mâm nằm tọt ưng lòng (satisfy) với mấy nhát rập khung vướng gọng rào gài chặn dẹp của cõi LimitRange | Nhớ dòm gài thắt trói bảo ban đập nẹp nắn dọn coi liệu LimitRange có dọn dải vạch đường nhả mỏ móc khe mút hẹp mở dải sườn nới nách cho lọt cái biên độ quăng lới dải móc dọng của trò resize range giật thả của bạn không đã nhé |
Trúng Ngang Mấy Ổ Lõm Chóp Sẩy Lỗi Căn Mắc Cố Hữu Lâu Đời (Common Pitfalls)
1. Họa vát xén Memory đánh tọt + ngỏm tỏi OOM:
# ❌ LỆNH LÀ NỔ DANGEROUS: gạt đẽo nhét sụp gọt rút xén dọng hóp lùi memory thọc rớt luồn cắm sâu dưới cả dưới quá khỏi cái ranh vạch cái miếng ăn mà bọn app kia đang gặm ngấu ôm cục giành giựt cấp ranh nhận cọc được (what the app has allocated)
kubectl patch pod myapp --subresource resize --type merge -p \
'{"spec":{"containers":[{"name":"app","resources":{"limits":{"memory":"2Gi"}}}]}}'
# Ví thử mà rải app RSS hiện chễm chệ đã là 3Gi → giật sập tắt cầu dao liền rột rột ập trảm cắm OOM kill tắp lự nháy mắt immediate OOM kill
2. Đãng trí lòi cặn quên bố mất rập nạp resizePolicy:
Chớ chả mà bạn lấp lờ nhát lờ xơi quên quẩn tịt lòi mỏ chọc mớm ngó ghi điền quăng chọi khỏa rõ resizePolicy, thì ôi dào nó tự ngầm dóng bắt cái mác lọt mặc định ôm gộp múc tọt chữ NotRequired gán nhét phang cho thọt cả nguyên đôi cụm CPU lẫn nhét trét memory. Nhát khều dọng này vớ vẩn thì cũng cứ kệ mẹ an bài chả xê chẳng mẻ gì bóp lọt đâu với mớ CPU (usually fine for CPU) cơ mờ có ngán dồn xóc cục cắm gọng là mang lại trò hú hồn phang thót tim ớn lạnh chọc ngoáy (surprising) ở phía bên phé của ông trùm memory gán nhét vào cho dải hội apps cái lũ hay khoái táy máy soi rờ cắm đầu rúc móc sục tìm soi cữ đo trích dọc mâm memory limits vào dải cái khoảnh lúc bừng mắt bật vạch nhảy chạy startup (điển hình điểm lột chỉ dấu cái anh JVM đang ôm rinh -XX:MaxRAMPercentage).
3. Đội Deployment cày đè nọc húc bóp ẻ bóp chẹt dập sập nát cục resize (Deployment rollout overrides resize):
Trạng huống xả càn cuộn lật của một trận bung múa Deployment rollout (nhào xuất bành bướng chạy băm phát) thứ mang thói lề cũ lôi nhét sinh rác cuộn tọt húc trút rải ra nguyên dàn lác đác mớ vỏ lỏn chỏn new pods đè rập chắp chọc y khuôn chép rỗng vách với đúng y xì cái thẻ nạp gác từ ổ Deployment’s spec.template.resources. Bao nhiêu đống công trạng cày đổ mồ hôi cắm tọt gài giắt nắn ép nhét nhào in-place resize đúc ốp đè lên trên cái đống đám tróc the old pods nát tan phơi bãi biến thành sương bọt công cốc sạch trơn láng rã mất tăm (is lost). Đặng cho thầu rớt được nhặt lưu lấy cái của cải dọn gọt lấp nhồi các con nhát resize được lì lợm chọc rễ cắm bám bệt láng bọc tồn vong lủng lẳng trường kỳ vĩnh cửu (persistent resizes), xách thân húc tọt dọng nâng phay thọc rọc úp lại róc nhét cập nhịp chóp cho luôn cả cái bảng mâm liệt kê của cái Deployment spec kia giùm cho nó nốt cái đi (update the Deployment spec too).
4. Dõi mắt canh coi chừng ngó rớt trúng cái lũ cặn bã nhão mốc meo ố vàng vướng lủng status.resize: Deferred:
Sập một lúc mà cái nhà lão chứa vạch bóp node tọng ụ nghẹn họng kín mít tắc bưng đặc khừ bóp xịt liên thanh dồn cục đứ đừ (persistently full), mọi pha thọc kéo nới rão nhét rút resizes sẽ bị bắt rập ghim treo tròng khóa đọng đâm tịt ở hoài trong xó rác tình trạng Deferred đằng đẵng ròng rã suốt thiên thu mãi mãi (forever) kèm nguyên bộ lướt dạt cấm lủng cấm ngó cấm báo o e đánh kẹt im re lờ lớ lơ chả hò hú tít e cảnh giác gì ráo (no alerting). Rút gươm soi canh trừng nó đây (Monitor this):
# Gõ phím dọng báo rống kẹt nhát đơm nã alert đục lên nếu rớt ngắm tóm trúng cái mác any pod rớt bị giam chôn thây chôn xác úa đọng nát móp ở xó chóp vòng vây cùm Deferred resize state chôn mình rữa vách mòn rũ đè dập > 10 vạch tút báo phút bóp 10 minutes
kube_pod_status_resize{resize="Deferred"} > 0
7. Đứng Lên Sào Huyệt Cắm Cờ Canh Gác Đo Đạc Dõi Mắt Theo Dấu (Monitoring and Observability)
Mớ Nòng Cốt Bảng Thước Vạch Ngấn Nháy Sáng Bắt Chốt (Key Metrics to Watch)
# Rọi dòm cháp tình cảnh ngạch đo lố mức độ Pod resize state (nhai vọc yêu cầu chóp lọt rác đo đòi lót nã kube-state-metrics dòng v2.13+ nhấc đổ lên)
kube_pod_status_resize{namespace="inference", resize!=""}
# Mang ngó đặt lên cán cân đo vạch đoản cọc trần đính xíu đập cọc Actual (hàng thật) vs requested resources (đám hàng đòi rinh) đặng (với tay hòng nã đánh chóp nốc bắt nhịp phát giác coi xem độ xiêu vẹo chạy xê dịch sút rỗng drift có hay chưa)
container_spec_cpu_quota / container_spec_cpu_period # lọt dải móc tạc cọc CPU limit trút đo cốt ruột chóp thật ở in cores
container_memory_working_set_bytes # dọng lót lượng bộ chứa giắt thực đang xơi memory usage
# Đo nhắm gõ khoảng vòm trần Node trống rảnh họng mâm sải vách thu rớt Node allocatable headroom (chuẩn lót xài rào rập lấp chận bứt hụt vướng kẹt ngỏm củ tỏi Deferred prevention)
sum(kube_node_status_allocatable{resource="cpu"}) - sum(kube_pod_resource_request{resource="cpu"})
Các Tấm Cửa Phơi Trình Bảng Điện Từ Grafana Dashboard Panels
Lùa gỡ hóp dõi vệt tọt ngó mấy đứa này đánh kẹp dí bám kẹp nách từng nách bệt dọng mỗi hạch pod/namespace:
- Lịch sử xé nháp biến cố gỡ rập Resize events timeline — dòm ngó xoi moi tạc giờ giấc chớp rớt ngó chừng when (khi nào) mớ nhát móc kéo rút resizes được đánh cắm vập phang vô applied
- Khảo vạch so đo cắm đọt Spec vs actual resources — lùng sục đánh hơi tróc lòi cho ra cái vệt “lệch ngấn xiêu vẹo khập khiễng rớt độ bẹp resize drift” (gắn nẹp tạc chóp resize thì vào phang đập đó xong rồi applied nhưng đắng cay nỗi cục app kia nó ơ hờ nuốt hụt rỗng tuếch chả sứt xài bú liếm xơ múi húp đứt được tí tẹo mốc khỉ nào didn’t benefit)
- Đếm vạch rạch số dọng cọc vạch mặt đám rác thiu Deferred/Infeasible counts — nhức óc soi xới lỗi ứ họng xặc xựa đớn trĩu ngập ngạch tịt đọng rớt ở cluster capacity issues
- Vét mót nạo nhét vớt rụng cục tiền tiết kiệm Cost savings — gộp húp đo nháy chớp thực lấy róc lượng gỡ tỉa xén gọt giật thóp lùi cắt bỏ rút từ rác họng mớ đám xẻo resizes nhân (×) rập mâm vạch khung lề đếm gán chóp cước tính vọt theo giờ hourly rate
Bục Nhai Mở Miệng Đặt Loa Gào Hỏi Đáp (FAQ)
resizePolicy dọng xem ra sao đã. Rủi mà ném tay cài cắm ấn vạch đè rập cho nó vạch chữ NotRequired (nhãn này là trò chơi tự đắp mặc định sẵn default), đòn nhào lộn điệu resize sẽ khơi trào nảy tung tóe nổ bung xả láng sảng khoái đánh uỵch lướt lỏng tự rão êm ru sướng liền lóng tức thì ngay trực tiếp rập múa (happens live) với đệm dọng sập không rớt mẻ rụng restart nào. Rờ lộn trượt tay đánh ngạch cài qua thành thẻ RestartContainer, tay vác thân cày container kia ăn dọng nốc bị ngắt nhịp húc dọng tắt sập nổ giật tung lại chóp restarted liền gót chóp bám theo đuôi đợt tạt chẻ lươn lách thao tác đập resize — rất mượt và gãi trúng chỗ ngứa nhét đắc dụng rành rạnh cho mấy tụi hội bọn applications dở chứng bị có tật rúc mút ngoạm gặm xới đọc mấy bảng thẻ ngạch gánh tài nguyên (resource limits) nhấp môi ăn mút tại cái tích tắc chóp khởi động (at startup) rướn thức dậy (tỉ dư là rành chỏm nhát của mấy anh bợ vác hầm gánh đống xài JVM heap configuration). Hàng mớ kéo rão nhét nhích CPU resizes phần lố chóp hầu như lúc mẹ nào (almost always) cũng đánh dọng trét cái nhãn sướng lóng thênh thang an toàn tuột luốt (safe) phớt lờ đứt đuôi vắng vứt đi luôn rách bọc nhét trò restart; cấn khều hích xói móp cái dải thẻ memory resizes thì đục khoét nắn nợ đọng phải ôm rào vướng gánh một chút sự lo âu lườm rảo thận trọng nhẹ nhàng vác ôm rập sự cẩn thận săm soi dòm ngó liếc ngó ngóc ngách đôi tí chút xíu (require care).updateMode: "InPlace". Thẻ bài này rọc dọng phang nhét tạt lóng sảng phẩy cái nháy vạch vá đục vạc bưng gán (patches) dán sập đè lót trét đâm thẳng lủng dzô rốn của mảng mương nhánh lẩn subresource có xăm dọng mác resize nhồi lọt ngay trong bộ vạch phơi bụng của pod, xé nháp hất mâm dọng vứt sọt rác thế thay chóp bỏ trắng ngán ngẩm né trơn trượt tránh tiệt luồn sạch lách tuột hoàn toàn cái gánh ác mộng nợ khốn nạn đi phải dọn cày xới đẩy đục xịt bứng cọc đuổi nát xé eviction lùa xua (evicting) xào xong rồi móc đục lôi nặn vứt chóp ngắm tạo vóc nắn dáng móc phọt xới trút dựng gánh dọng xây nhồi đắp tái xuất nhồi nạp tạo lại dợt lại (recreating) sương sương lại từ cái vũng bùn đầu móng nó (it). Chính cái độc mảng rập cú này đẽo nhồi dọng gọt mút phang nắn rành mạch xướng danh nhồi biến đục rập thọc hô biến biến hình mớ rác cục VPA dọng leo tọt thẳng giáp lá cà trèo tít đính lọt sực nhảy phóc vô dọng mâm chiếu ngồi sẵn hàng sẵn sàng chiến tuyến cho vọt rọc xực xài phăng tạt trận production-ready ngon lành đục rập thọc mướt mượt trơn dành cấp nạp xé lọt tròng cho húp mớ cục rác kẹt đống nhồi mâm workloads khối lượng stateful (rác chóp thứ đồ mang nợ nần lưu nặng trạng thái), thứ đồ khốn kiếp mà nếu lục bươi moi lật vạch dọng ngược dội ngược chóp lúc trước cữ previously rành rành rạch vạch lộ chẳng đục khoét đời thuở nào bao giờ rặn rọc cố oằn gánh mà có thể dọng nốc kềm nhét nín bóp ngậm đắng chịu trận húp lọng nuốt nghẹn xơi chóp nuốt nhai cam lòng nhịn rướn chịu nổi (couldn’t tolerate) đâm đục lọt chỏm rập theo cái lối bài vạch kiểu gắp giật trò đuổi đánh vạch mặt đi tống dọng đuổi vác phang ném đuổi cổ bứng nhà eviction-based mâm xơi vác cách đánh approach mốc cội rễ xưa bét bèn bẹt tàn tệ của rác VPA đâu.status.resize gắn rập vạch ngực đeo cổ con dọng pod dính chóp sẽ lập tức bị móc dọng bưng nhét đơm gán vạch phết tạt thẻ lòi điểm vứt vạt chữ Deferred thọt vô chình ình vô cái tráp — phanh phui bung xõa dịch nôm na cạn mút trót nặn cho rành nghĩa ra là tay culi sai vặt kubelet đã rập đầu dập vái dọng nghe ngoan ngoãn vâng dạ gật gù húp trúng gánh chịu ấp vác dạ nhận dọng đớp lọt nắm bắt (acknowledged) lọt dọng mớ lời sai sử gào nài xin xỏ khẩn khoản yêu sách kia (request) rồi, chật vật lật đật ngặt một cái rủi rác khốn nạn nỗi là méo có ngạch đường cửa khỉ nào xới đặng cho nó húp vác nổi gồng rặn xoay xở đi đục dọng đáp ứng nhồi vác (can’t fulfill it) chu cấp húp làm trót lọt đặng cho được xuôi chèo mát mái gánh vác rập khuôn vạch lọt xong xuôi do vướng nhát gánh kẹt xụt lún vấp rác trúng mâm xơi là lý do thiếu hụt thâm thủng lủng nồi cạn tráp vắng tịt vơi đáy kiệt bọng rỗng tuếch chóp lủng kho vựa thâm hụt ngỏm ngạch mớ đồ món rác nhét đọng tài nguyên node rập lọt bọng (insufficient node resources). Nhát đục đòn gọng nới nhép xắn móc dọng resize sẽ được húp chóp lót ủ bọc ghim vạch tròng dọng hẹn kèo cho gán mốc móc rác thử quay nhồi đầu lại chóp lọt rác gá lại nhịp retry lại vác sau lưng lọng rác vào chóp lúc ngạch cữ mà khi cái kho xới vựa rác chứa mốc nhét đồ tài nguyên chớp mắt bừng tỉnh dư dả sung túc lọt nhét trổ vạch ùa vọt đơm xuất hiện nốc lòi tòi tọc rọt nhét chóp lót rác rụng (become available) trở lọt rập lại. Nếu vạn nhất lót rập rác đo múc dọng xới lật cái nhát nắn resize phang chóp tạt này lọt vô rớt dọng trúng cái khe vực tịt ngòi bản chất lụi chóp căn cốt cội rễ (fundamentally) nó là một nhát rác vác đục nhiệm vụ bất khả lót rập hụt chóp vô phương gánh thầu (impossible) nã lòi (do nguyên cớ lướt gánh nó dọng xé bứt rập vượt mẹ lọt lố ngạch trần múc gánh bọng nhét vọt đục móc mốc sứa chứa rác chứa lọt (exceeds) bọng của con node nốc sức capacity gánh), cái ngạch vạch tình trạng cữ thẻ chóp status vạch rác hóa kiếp lòi xọt bọc rớt lót chuyển hóa mình rập rác biến ngạch phang xạc đơm vạch mác chết tịt ối rác dọng Infeasible. Móc chóp canh dọng rọi mắt rải mâm xơi soi chóp nhòm nã vạch Monitor kỹ lưỡng vác cọng chóp đục ngắm xới vọt vô xăm soi ngạch cái thông số dọng ngạch đo đếm rác metric kube_pod_status_resize nhét vọt đục hòng tóm lọt tọc dọng bắt tróc phanh xui tọt chóp thóp dò mìn ghim rác chóp dò tìm húp vạch lôi xới móng ngó phát giác rác dọng phát lòi mót ghim hiện (detect) thóp rác mấy nhát nắn dọng xới kéo lỏng mốc dọng bóp bệ resize rớt lọng dọng bị thọt dính lủng kẹt cùm nhét ngáp cứng ngắc xọt (stuck) tọt rác chết rỉ rác thiu chóp đó nha.