- vừa được xem lúc

Vertical scaling trên Kubernetes không còn phải restart pod? Tính năng mới nhất trong version 1.33

0 0 2

Người đăng: Hoàng Việt

Theo Viblo Asia

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 🤣.

image.png


⚙️ 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.requestsresources.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:

  1. Bạn cập nhật Pod hoặc Deployment với cấu hình CPU/Memory mới.
  2. 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.
  3. 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ường messagereason 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ến

    • reason: 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 restartPolicyNever, thì container resizePolicy phải được cấu hình NotRequired cho cả CPU và Memory. Bạn không thể sử dụng policy RestartContainer 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 resizePolicyNoRestart. 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ử

image.png

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/

Bình luận

Bài viết tương tự

- vừa được xem lúc

Phần 1: Giới thiệu về Kubernetes

Kubernetes là gì. Trang chủ: https://kubernetes.io/. Ai cần Kubernetes.

0 0 115

- vừa được xem lúc

Thực hành K8S trên Google Cloud

Kubernetes (K8S) trở nên quá phổ biến ở thời điểm hiện tại, ai cũng nói về nó. Trong bài hôm nay mình sẽ không đi quá nhiều vào các định nghĩa, mà đi thẳng vào thực tế để mọi người dễ hình dung.

0 0 50

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 66

- vừa được xem lúc

Kubernetes - deployment.yaml explained

Trong bài trước, mình có giới thiệu chạy các câu lệnh K8S bằng Command Line. Để tạo 1 deloyment đơn giản chỉ cần chạy lệnh.

0 0 98

- vừa được xem lúc

Tìm hiểu cơ bản về Kubernetes - K8s (Part 2): Minikube

Lời mở đầu. .

0 0 55

- vừa được xem lúc

ETCD - Bộ não của Kubernetes và cách cài đặt cụm ETCD Cluster (High Availability)

Hello anh em, sau vài ngày nghiên cứu đọc lại liệu cũng như cài cắm thủ công đủ thể loại, với vô số lỗi fail thì mình cũng cài đặt thành công cụm etcd cluster một cách thủ công. Trước giờ chuyên tạo c

0 0 55