Kubernetes v1.36: Workload-Aware Scheduling — AI/ML Workloads Finally được đối xử công bằng
Pod-by-Pod scheduling đã hết thời
Nếu bạn đang chạy AI/ML training trên Kubernetes, chắc hẳn bạn đã gặp tình huống này: 10 Pod cần chạy cùng lúc để train model, nhưng scheduler chỉ schedule được 8 Pod. 2 Pod còn lại chờ resource, trong khi 8 Pod kia đã consume resource mà không làm được gì hữu ích. Đó là resource waste kinh điển.
Kubernetes từ xưa đến nay dùng Pod-by-Pod scheduling — scheduler đánh giá từng Pod một, tìm Node phù hợp, rồi bind. Cách này OK cho microservices thông thường, nhưng hoàn toàn sai cho batch/AI workloads nơi mà một nhóm Pod phải chạy cùng nhau hoặc không chạy gì cả.
Kubernetes v1.36, ra mắt ngày 13/05/2026, giải quyết bài toán này bằng cách introduce Workload-Aware Scheduling — scheduler hiểu được mối quan hệ giữa các Pod trong cùng một workload.
PodGroup API: Tách template khỏi runtime
Thay đổi kiến trúc lớn nhất trong v1.36 là việc tách biệt Workload API và PodGroup API.
Ở v1.35, cả template và runtime state đều nằm trong cùng một Workload resource. Điều này tạo ra vấn đề: scheduler phải watch và parse cả Workload object dù chỉ cần thông tin scheduling.
V1.36 giải quyết bằng cách:
- Workload API → chỉ là static template (định nghĩa nhóm Pod trông như thế nào)
- PodGroup API → quản lý runtime state (trạng thái scheduling thực tế)
# Workload — static template
apiVersion: scheduling.k8s.io/v1alpha2
kind: Workload
metadata:
name: training-job-workload
spec:
podGroupTemplates:
- name: workers
schedulingPolicy:
gang:
minCount: 4 # Cần ít nhất 4 Pod chạy cùng lúc
# PodGroup — runtime state
apiVersion: scheduling.k8s.io/v1alpha2
kind: PodGroup
metadata:
name: training-job-workers-pg
spec:
podGroupTemplateRef:
workload:
workloadName: training-job-workload
podGroupTemplateName: workers
schedulingPolicy:
gang:
minCount: 4
Tách biệt như vậy giúp scheduler chỉ cần đọc PodGroup, không cần parse Workload. Performance tốt hơn, especially ở scale lớn.
Gang scheduling: Tất cả hoặc không gì cả
Đây là tính năng được mong chờ nhất. Gang scheduling đảm bảo rằng hoặc tất cả Pod trong group được schedule, hoặc không Pod nào được schedule.
Trước đây, nếu bạn cần 8 GPU Pod cho distributed training:
- Scheduler có thể schedule 5 Pod → 5 Pod consume GPU nhưng training không chạy được
- 3 Pod còn lại chờ → resource bị lãng phí
Với gang scheduling trong v1.36:
- Scheduler đánh giá toàn bộ group trong một cycle nguyên tử
- Nếu không đủ resource cho
minCountPod → tất cả chờ - Nếu đủ → tất cả được bind cùng lúc
Quá trình hoạt động:
- Scheduler lấy snapshot cluster state (tránh race condition)
- Chạy PodGroup scheduling algorithm — tìm Node placement cho tất cả Pod
- Áp dụng quyết định nguyên tử: thành công → bind tất cả; thất bại → trả về queue
Điểm hay: nếu Pod mới được thêm vào group sau khi một số Pod đã chạy, scheduler evaluate Pod mới mà không evict Pod đã chạy sẵn.
Topology-aware scheduling: Pod cùng nhau, không phân tán
Distributed training nhạy cảm với network latency. Nếu 8 GPU Pod bị phân tán khắp cluster, mỗi Pod ở một rack khác nhau, bandwidth giữa các Pod sẽ rất thấp → training chậm.
Topology-aware scheduling cho phép bạn ràng buộc PodGroup vào một topology domain cụ thể:
apiVersion: scheduling.k8s.io/v1alpha2
kind: PodGroup
metadata:
name: topology-aware-workers-pg
spec:
schedulingPolicy:
gang:
minCount: 4
schedulingConstraints:
topology:
- key: topology.kubernetes.io/rack
Scheduler sẽ tìm tổ hợp Node trong cùng rack, evaluate xem toàn bộ PodGroup có fit không, rồi chọn placement tối ưu dựa trên resource efficiency.
Hiện tại, topology-aware scheduling chưa trigger preemption (để đuổi Pod khác lấy chỗ). Tính năng này dự kiến có trong v1.37.
Workload-aware preemption: Ưu tiên đúng người
Preemption trong K8s không mới — Pod priority cao có thể đuổi Pod priority thấp. Nhưng preemption cũ chỉ hoạt động trên từng Node một.
Workload-aware preemption trong v1.36 xử lý toàn bộ PodGroup như một đơn vị preemptor. Thay vì tìm victim trên từng Node riêng biệt, scheduler search across toàn bộ cluster, preempt Pod từ nhiều Node cùng lúc để tạo đủ chỗ cho PodGroup.
Hai khái niệm mới:
- PodGroup priority — override priority của individual Pod
- PodGroup disruptionMode — quyết định hành vi khi PodGroup bị preempt
ResourceClaim cho PodGroup: GPU allocation thông minh
V1.36 mở rộng Dynamic Resource Allocation (DRA) cho PodGroup. Bạn có thể yêu cầu GPU, FPGA, hay specialized hardware cho cả nhóm Pod thay vì từng Pod một.
Điều này đặc biệt hữu ích cho AI training khi bạn cần allocate cùng loại GPU cho tất cả worker nodes.
Đánh giá cá nhân: Đây là bản cập nhật cần thiết
Đã chạy K8s cho AI workloads hơn 2 năm. Bài toán gang scheduling là pain point lớn nhất — đặc biệt khi dùng Kubeflow hoặc Ray trên K8s.
Trước v1.36, workaround phổ biến là dùng custom scheduler (như Volcano hoặc Coscheduling plugin). Không terrible, nhưng maintenance burden cao và không integrate tốt với upstream features.
V1.36 đưa gang scheduling thành first-class citizen. Không cần custom scheduler nữa. Không cần workaround.
Tuy nhiên, có vài giới hạn cần lưu ý:
- Hỗ trợ tốt cho homogeneous Pod groups (Pod giống nhau)
- Heterogeneous Pod groups và inter-Pod dependencies chưa guaranteed tìm được placement
- API vẫn ở v1alpha2 — chưa stable, có thể thay đổi trong bản sau
Nếu bạn đang dùng Volcano hoặc Coscheduling plugin, chưa cần migrate ngay. Nhưng nên bắt đầu test v1.36 trên staging cluster để sẵn sàng khi API stable.
Tóm tắt: Tác động thực tế
| Feature | Trước v1.36 | Sau v1.36 |
|---|---|---|
| Gang scheduling | Custom scheduler (Volcano) | Built-in, first-class |
| Pod group state | Trộn lẫn trong Workload | Tách biệt qua PodGroup API |
| Topology constraints | Manual affinity rules | Declarative trên PodGroup |
| Preemption | Per-Node | Per-PodGroup, cluster-wide |
| DRA cho groups | Không | ResourceClaim support |
Nếu bạn đang chạy AI/ML training trên K8s, v1.36 là bản cập nhật đáng upgrade. Nếu chỉ chạy microservices thông thường, bạn có thể đợi bản stable tiếp theo.
Tham khảo: