Mở đầu
Trong suốt nhiều năm, Khi bạn muốn scale theo chiều dọc (vertical scaling) cho ứng dụng trên Kubernetes bạn sẽ buộc phải khởi động lại ứng dụng thì mới có thể nhận cấu hình mới — một điều không mấy dễ chịu với các ứng dụng cần uptime cao. Điều này đặc biệt bất tiện với các ứng dụng stateful hoặc các workload mất nhiều thời gian để khởi động lại và có thể gây gián đoạn cho người dùng hệ thống.
Tin vui là với Kubernetes v1.33, tính năng Resize container resources in-place đã cho phép scale CPU và memory của container trong pod mà không cần khởi động lại, tuỳ thuộc vào policy cấu hình. Đây là bước tiến lớn giúp việc tối ưu tài nguyên hiệu quả hơn và giảm downtime cho ứng dụng. Đặc biệt hữu ích trong việc chữa cháy khi có "hỏa hoạn" trên môi trường production 🤣.
⚙️ Cách thức hoạt động
Tính năng Pod Resize cho phép bạn cập nhật lại resources.requests
và resources.limits
mà không cần xóa pod. Điều này được điều phối bởi kubelet và phải được bật qua feature gate InPlacePodVerticalScaling
.
Cách thức để resize resource cho container rất đơn giản:
- Bạn cập nhật Pod hoặc Deployment với cấu hình CPU/Memory mới.
- Nếu Pod và container hỗ trợ resize in-place (không cần khởi động lại), kubelet sẽ cố gắng áp dụng thay đổi trực tiếp.
- Trạng thái resize sẽ được cập nhật trong
status.resize.status
của Pod.
Trạng thái Resize
Trong quá trình resizing container, container trong pod có thể ở một trong các trạng thái resize sau:
-
PodResizePending
: Quá trình resize đang bị hoãn hoặc lỗi. Trong trườngmessage
vàreason
phía dưới sẽ cung cấp chi tiết thông tin lỗi. Dưới đây là 1 vài lỗi phổ biếnreason: Infeasible:
Cấu hình sau resize có thể lớn hơn lượng tài nguyên còn lại trong node.reason: Deferred:
Cấu hình sau resize hiện đang không khả dụng, Kubelet sẽ thực hiện thử lại sau 1 khoảng thời gian.
-
PodResizeInProgress
: Yêu cầu thay đổi tài nguyên được chấp nhận, đang trong quá trình áp dụng.
Resize Policy
Resize policy cho phép bạn cấu hình cách container sẽ ứng xử khi có yêu cầu thay đổi cấu hình tài nguyên.
resources: resizePolicy: - resourceName: cpu policy: NoRestart - resourceName: memory policy: RestartContainer
NoRestart:
Resize trực tiếp không khởi động lại container.RestartContainer:
Container sẽ bị restart khi resize (như behavior cũ).
Với cấu hình một container như trên:
- Khi chỉ thay đổi cấu hình tài nguyên CPU => Container sẽ resize mà không cần restart
- Khi chỉ thay đổi cấu hình tài nguyên Memory => Container sẽ resize và restart
- Nếu thay đổi cả 2 loại tài nguyên => Container sẽ restart vì policy của memory
Lưu ý: Nếu pod có cấu hình
restartPolicy
là Never, thì containerresizePolicy
phải được cấu hình NotRequired cho cả CPU và Memory. Bạn không thể sử dụng policyRestartContainer
trong những Pod thế này .
Hạn chế
Dù tính năng mới này đã khắc phục điểm chí mạng của vertical scaling trong K8s nhưng vẫn còn nhưng hạn chế nhất định:
- Hiện tại chỉ resize được 2 loại tài nguyên là CPU và memory
- Không thể giảm cấu hình memory nếu
resizePolicy
làNoRestart
. Giảm memory hiện vẫn yêu cầu restart container. - QoS (Quality of Service) Class phải được giữ nguyên sau resize
- Các container như init-container hay ephemeral container không cho phép resize.
- Không thể gỡ bỏ cấu hình CPU và memory (BestEffort QoS), chỉ có thể thay đổi thành một con số khác.
- Windows Pods hiện không được hỗ trợ tính năng resize này
- Pod sử dụng swap memory chỉ có thể cập nhật khi restart container.
- Một số ứng dụng sử dụng ngôn ngữ như Java có thể không thể resize Heap memory in-place sau khi resize container memory, yêu cầu phải restart container.
Demo
Dông dài lý thuyết vậy đủ rồi, hãy cùng thử resize một vài trường hợp xem thực sự tính năng này hoạt động thế nào nhé
Trường hợp resize thành công
Trước hết bạn cần phải có một cụm cluster K8s chạy version 1.33 nhé
Tạo pod với cấu hình như sau:
apiVersion: v1
kind: Pod
metadata: name: demo-resize-success
spec: containers: - name: nginx image: nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "64Mi" cpu: "250m" resizePolicy: - resourceName: cpu restartPolicy: NotRequired - resourceName: memory restartPolicy: NotRequired
Thực hiện cập nhật lại file manifest để cập nhật tăng cả CPU và memory thành như sau và cập nhật với command
apiVersion: v1
kind: Pod
metadata: name: demo-resize-success
spec: containers: - name: nginx image: nginx resources: requests: memory: "600Mi" cpu: "500m" limits: memory: "600Mi" cpu: "500m" resizePolicy: - resourceName: cpu restartPolicy: NotRequired - resourceName: memory restartPolicy: NotRequired
kubectl apply -f pod-resize-1.yaml --subresource resize --force-conflicts --server-side
KIểm tra lại pod bạn sẽ thấy pod đã được resize mà không cần restart
Trường hợp resize thất bại
Tạo pod mới với cấu hình như sau:
apiVersion: v1
kind: Pod
metadata: name: demo-resize-fail
spec: containers: - name: nginx image: nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "64Mi" cpu: "250m" resizePolicy: - resourceName: memory restartPolicy: NotRequired
Ta sẽ thực hiện scale down memory và kỳ vọng việc scale này sẽ thất bại do scale down memory sẽ yêu cầu restart container. Scale down pod xuống 50MB memory và xem thử
Ngoài ra các bạn có thể thử với các trường hợp khác như: size pod lớn hơn lượng tài nguyên node hiện có,...
Kết
Tính năng in-place pod vertical scaling mở ra nhiều khả năng tối ưu tài nguyên linh hoạt hơn mà không ảnh hưởng đến tính sẵn sàng của ứng dụng. Đây là một tính năng đáng quan tâm cho các team DevOps/SRE muốn giảm downtime trong các môi trường production.
Trong tương lai gần mình tin rằng sẽ có các controller mới giám sát lượng tài nguyên pod liên tục và thực hiện việc scale vertical này tự động thay vì phải thực hiện sửa manual như hiện tại.
Cám ơn các bạn đã đọc đến tận đây, hy vọng bài viết có đem lại giá trị cho bạn.
Nếu thấy bài viết hay hãy Upvote và Follow mình để theo dõi thêm các bài viết khác nữa nhé 😄
Nếu như bạn đang gặp khó khăn trong vấn đề chuyên môn, cần người hỗ trợ về mặt hệ thống, DevOps tools hay cần định hướng trong công việc thì mình tự tin có thể hỗ trợ được bạn. Liên hệ với mình để trao đổi thêm nhé https://hoangviet.io.vn/
Tham khảo thêm: https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/