

Kubernetes 1.35 khép lại hành trình 8 năm của một tính năng nhỏ nhưng ảnh hưởng lớn: đổi resource cho container đang chạy mà không cần xoá-tạo lại Pod.
Trong phần lớn lịch sử Kubernetes, spec.containers[*].resources là bất biến sau khi Pod được tạo. Muốn tăng CPU limit hay giảm memory request? Không có chuyện "sửa tại chỗ" - cách duy nhất là sửa spec (trực tiếp hoặc qua Deployment/StatefulSet), và Kubernetes sẽ xoá Pod cũ, tạo Pod mới với resource mới.
Với Deployment stateless, chuyện này thường chỉ gây gián đoạn nhẹ nhờ rolling update. Nhưng với StatefulSet chạy database, message queue, hay batch/training job chạy nhiều giờ, recreate Pod đồng nghĩa với:
Đây cũng là lý do Vertical Pod Autoscaler (VPA) - công cụ tự động đề xuất và áp resource - trước đây chỉ chạy ở chế độ Recreate: mỗi lần áp khuyến nghị là một lần Pod bị tạo lại. Nhiều team vì vậy ngại bật auto-scaling chiều dọc cho workload quan trọng.
Về bản chất, In-Place Pod Resize thay đổi ba thứ:
1. spec.containers[*].resources trở thành mutable — nhưng chỉ cho CPU và memory. Các resource khác (GPU, custom resource qua DRA...) vẫn không đổi được tại chỗ.
2. Subresource /resize mới — thay vì PATCH thẳng vào Pod, bạn PATCH vào Pod/resize. Đây là cổng riêng cho yêu cầu đổi resource, tách biệt khỏi các thay đổi spec khác.
3. status.containerStatuses[*].resources phản ánh resource thực tế container đang có — khác với spec.resources là resource mong muốn. Hai giá trị này có thể lệch nhau tạm thời trong lúc kubelet xử lý.
Luồng xử lý một yêu cầu resize:

Lưu ý: Resize diễn ra ở cấp Node hiện tại — Kubernetes không tự di chuyển Pod sang Node khác để nhường chỗ. Node không đủ tài nguyên → resize bị treo ở PodResizePending.
Các trạng thái resize chi tiết (từ 1.33+):
Pod có thêm hai loại điều kiện (condition) riêng để theo dõi tiến trình resize:
Vài tình huống thực tế mà tính năng này phát huy tác dụng rõ nhất:
Giả sử bạn có Pod chạy CPU limit 500m, muốn tăng lên 800m:
kubectl edit pod resize-demo
# Sửa resources.limits.cpu từ 500m thành 800m rồi lưu
# => Nếu là Pod trần: lỗi "field is immutable"
# => Nếu quản lý qua Deployment: pod cũ Terminating,
# pod mới được tạo ra để thay thếKết quả: container cũ nhận SIGTERM, mọi state trong bộ nhớ mất sạch, container mới khởi động lại từ đầu — chỉ để đổi đúng một con số.
Bước 1: Khai báo resizePolicy khi tạo Pod, chỉ định resource nào được đổi mà không restart:
apiVersion: v1
kind: Pod
metadata:
name: resize-demo
spec:
containers:
- name: app
image: myapp:latest
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired # CPU: đổi nóng, không restart
- resourceName: memory
restartPolicy: RestartContainer # Memory: restart để an toàn
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"Bước 2: Resize CPU tại chỗ bằng cách PATCH vào subresource resize:
kubectl patch pod resize-demo --subresource resize --type='merge' -p '{
"spec": {
"containers": [{
"name": "app",
"resources": {
"requests": {"cpu": "800m"},
"limits": {"cpu": "800m"}
}
}]
}
}'Bước 3: Kiểm tra kết quả:
kubectl get pod resize-demo -o jsonpath='{.status.containerStatuses[0].resources}'
# => {"limits":{"cpu":"800m",...}, "requests":{"cpu":"800m",...}}
kubectl get pod resize-demo -o jsonpath='{.status.containerStatuses[0].restartCount}'
# => 0 (KHÔNG restart, vì resizePolicy cpu = NotRequired)Nếu bạn PATCH memory thay vì CPU, restartCount sẽ tăng lên 1 — vì resizePolicy của memory là RestartContainer. Điểm mấu chốt: In-Place Resize không có nghĩa là không bao giờ restart, mà là bạn được chọn resource nào cần restart và resource nào không.
| Khía cạnh | Trước 1.35 | Sau khi GA ở 1.35 |
| Cách đổi CPU/Memory | Sửa spec.resources → xoá Pod cũ, tạo Pod mới | PATCH vào /resize subresource, Pod giữ nguyên định danh |
| Container có restart? | Luôn luôn — toàn bộ container trong Pod | Tuỳ resizePolicy — CPU thường không, memory có thể có |
| Kết nối / state trong process | Mất sạch | Giữ nguyên (khi không restart) |
| Lập lịch lại | Có — scheduler tìm Node mới | Không — Pod ở nguyên Node, chỉ cgroup đổi |
| Tốc độ áp dụng | Chậm — phụ thuộc pull image, khởi động app | Nhanh — thường vài giây, kubelet gọi thẳng CRI |
| VPA | Chỉ chạy chế độ Recreate | Có thể chạy InPlaceOrRecreate |
CPU là tài nguyên co giãn tức thời — cgroup chỉ cần đổi quota, container vẫn chạy bình thường. Memory thì khác: giảm memory limit xuống dưới mức đang dùng thực tế → container bị OOM-kill ngay lập tức. Ngược lại, nhiều runtime (đặc biệt JVM) đã cấp phát heap dựa trên giới hạn memory đọc lúc khởi động — tăng limit tại chỗ không tự khiến ứng dụng dùng được phần bộ nhớ mới, trừ khi restart để đọc lại giới hạn.
Vì vậy khuyến nghị phổ biến: đặt resizePolicy cho memory là RestartContainer để an toàn, còn CPU để NotRequired vì rủi ro thấp hơn nhiều.
Rất hữu ích nếu bạn muốn dựng dashboard theo dõi hiệu quả resize trên cluster.
In-Place Pod Resize đạt GA ở Kubernetes 1.35 giải quyết một trong những điểm bất tiện tồn tại lâu nhất của Kubernetes: bạn không còn phải đánh đổi giữa right-sizing tài nguyên và gây gián đoạn service. Với workload stateful, batch job chạy dài, hay kết hợp VPA ở chế độ InPlaceOrRecreate, tính năng này giúp tối ưu chi phí (giảm over-provisioning) khả thi hơn nhiều mà không đánh đổi độ ổn định.
