Repository: kubernetes-sigs/kueue

Issue:
FlavorFungability: update documentation for FlavorFungibilityImplicitPreferenceDefault
Update documentation for FlavorFungablility to reflect the new feature gate.

The PR: https://github.com/kubernetes-sigs/kueue/pull/6132

Discussion:
@mimowo: cc @pajakd @tenzen-y @mimowo: /kind documentation@pajakd: /assign

Solution patch:
diff --git a/apis/config/v1beta1/configuration_types.go b/apis/config/v1beta1/configuration_types.go
index bbd083f39..9ec6ff633 100644
--- a/apis/config/v1beta1/configuration_types.go
+++ b/apis/config/v1beta1/configuration_types.go
@@ -366,6 +366,8 @@ type InternalCertManagement struct {
 type ClientConnection struct {
 	// QPS controls the number of queries per second allowed for K8S api server
 	// connection.
+	//
+	// Setting this to a negative value will disable client-side ratelimiting.
 	QPS *float32 `json:"qps,omitempty"`
 
 	// Burst allows extra queries to accumulate when a client is exceeding its rate.
diff --git a/cmd/kueue/main.go b/cmd/kueue/main.go
index 1d96477e6..9ace605f4 100644
--- a/cmd/kueue/main.go
+++ b/cmd/kueue/main.go
@@ -188,7 +188,11 @@ func main() {
 
 	// Set the RateLimiter here, otherwise the controller-runtime's typedClient will use a different RateLimiter
 	// for each API type.
-	kubeConfig.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(*cfg.ClientConnection.QPS, int(*cfg.ClientConnection.Burst))
+	// When the controller-runtime > 0.21, the client-side ratelimiting will be disabled by default.
+	// The following QPS negative value chack allows us to disable the client-side ratelimiting.
+	if *cfg.ClientConnection.QPS >= 0.0 {
+		kubeConfig.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(*cfg.ClientConnection.QPS, int(*cfg.ClientConnection.Burst))
+	}
 	setupLog.V(2).Info("K8S Client", "qps", *cfg.ClientConnection.QPS, "burst", *cfg.ClientConnection.Burst)
 	mgr, err := ctrl.NewManager(kubeConfig, options)
 	if err != nil {
diff --git a/config/components/certmanager/certificate-metrics.yaml b/config/components/certmanager/certificate-metrics.yaml
index 2fab4da27..198748382 100644
--- a/config/components/certmanager/certificate-metrics.yaml
+++ b/config/components/certmanager/certificate-metrics.yaml
@@ -3,10 +3,10 @@
 apiVersion: cert-manager.io/v1
 kind: Certificate
 metadata:
-  name: metrics-certs  # this name should match the one appeared in kustomizeconfig.yaml
+  name: metrics-cert  # this name should match the one appeared in kustomizeconfig.yaml
   namespace: system
 spec:
-  commonName: kueue-metrics
+  commonName: metrics
   dnsNames:
   # METRICS_SERVICE_NAME and METRICS_SERVICE_NAMESPACE will be substituted by kustomize
   # replacements in the config/default/kustomization.yaml file.
diff --git a/config/components/certmanager/common_name_transformer.yaml b/config/components/certmanager/common_name_transformer.yaml
new file mode 100644
index 000000000..549850126
--- /dev/null
+++ b/config/components/certmanager/common_name_transformer.yaml
@@ -0,0 +1,9 @@
+apiVersion: builtin
+kind: PrefixSuffixTransformer
+metadata:
+  name: add-prefix-to-common-name
+prefix: kueue-
+fieldSpecs:
+  - kind: Certificate
+    group: cert-manager.io
+    path: spec/commonName
diff --git a/config/components/certmanager/kustomization.yaml b/config/components/certmanager/kustomization.yaml
index fc1018507..7a4276d21 100644
--- a/config/components/certmanager/kustomization.yaml
+++ b/config/components/certmanager/kustomization.yaml
@@ -2,6 +2,9 @@ resources:
 - certificate.yaml
 - certificate-metrics.yaml
 
-
 configurations:
 - kustomizeconfig.yaml
+
+transformers:
+- common_name_transformer.yaml
+- secret_name_transformer.yaml
diff --git a/config/components/certmanager/secret_name_transformer.yaml b/config/components/certmanager/secret_name_transformer.yaml
new file mode 100644
index 000000000..b320ed302
--- /dev/null
+++ b/config/components/certmanager/secret_name_transformer.yaml
@@ -0,0 +1,9 @@
+apiVersion: builtin
+kind: PrefixSuffixTransformer
+metadata:
+  name: add-prefix-to-secret-name
+prefix: kueue-
+fieldSpecs:
+  - kind: Certificate
+    group: cert-manager.io
+    path: spec/secretName
diff --git a/config/default/cert_metrics_manager_patch.yaml b/config/default/cert_metrics_manager_patch.yaml
index 78fc5929f..d0082d114 100644
--- a/config/default/cert_metrics_manager_patch.yaml
+++ b/config/default/cert_metrics_manager_patch.yaml
@@ -14,7 +14,7 @@
   value:
     name: metrics-certs
     secret:
-      secretName: metrics-server-cert
+      secretName: kueue-metrics-server-cert
       optional: false
       items:
         - key: ca.crt
diff --git a/config/default/manager_webhook_patch.yaml b/config/default/manager_webhook_patch.yaml
index 738de350b..e8880dde0 100644
--- a/config/default/manager_webhook_patch.yaml
+++ b/config/default/manager_webhook_patch.yaml
@@ -20,4 +20,4 @@ spec:
       - name: cert
         secret:
           defaultMode: 420
-          secretName: webhook-server-cert
+          secretName: kueue-webhook-server-cert
diff --git a/pkg/cache/snapshot.go b/pkg/cache/snapshot.go
index 433a400d2..4cd01c3a4 100644
--- a/pkg/cache/snapshot.go
+++ b/pkg/cache/snapshot.go
@@ -27,6 +27,7 @@ import (
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/klog/v2"
 	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/features"
@@ -182,6 +183,7 @@ func (c *Cache) Snapshot(ctx context.Context, options ...SnapshotOption) (*Snaps
 // snapshotClusterQueue creates a copy of ClusterQueue that includes
 // references to immutable objects and deep copies of changing ones.
 func (c *Cache) snapshotClusterQueue(ctx context.Context, cq *clusterQueue, afsEntryPenalties *utilmaps.SyncMap[utilqueue.LocalQueueReference, corev1.ResourceList]) (*ClusterQueueSnapshot, error) {
+	log := log.FromContext(ctx)
 	cc := &ClusterQueueSnapshot{
 		Name:                          cq.Name,
 		ResourceGroups:                make([]ResourceGroup, len(cq.ResourceGroups)),
@@ -215,6 +217,7 @@ func (c *Cache) snapshotClusterQueue(ctx context.Context, cq *clusterQueue, afsE
 				return nil, fmt.Errorf("failed to calculate LocalQueue FS usage for LocalQueue %v", client.ObjectKey{Namespace: wl.Obj.Namespace, Name: string(wl.Obj.Spec.QueueName)})
 			}
 			wl.LocalQueueFSUsage = &usage
+			log.V(3).Info("Calculated LocalQueueFSUsage for workload", "workload", klog.KObj(wl.Obj), "queue", wl.Obj.Spec.QueueName, "usage", usage)
 		}
 	}
 	return cc, nil
diff --git a/pkg/controller/admissionchecks/multikueue/workload.go b/pkg/controller/admissionchecks/multikueue/workload.go
index b0e617dd6..71f3245dd 100644
--- a/pkg/controller/admissionchecks/multikueue/workload.go
+++ b/pkg/controller/admissionchecks/multikueue/workload.go
@@ -248,7 +248,7 @@ func (w *wlReconciler) updateACS(ctx context.Context, wl *kueue.Workload, acs *k
 	acs.State = status
 	acs.Message = message
 	acs.LastTransitionTime = metav1.NewTime(w.clock.Now())
-	wlPatch := workload.BaseSSAWorkload(wl)
+	wlPatch := workload.BaseSSAWorkload(wl, true)
 	workload.SetAdmissionCheckState(&wlPatch.Status.AdmissionChecks, *acs, w.clock)
 	return w.client.Status().Patch(ctx, wlPatch, client.Apply, client.FieldOwner(kueue.MultiKueueControllerName), client.ForceOwnership)
 }
@@ -360,7 +360,7 @@ func (w *wlReconciler) reconcileGroup(ctx context.Context, group *wlGroup) (reco
 		}
 
 		// copy the status to the local one
-		wlPatch := workload.BaseSSAWorkload(group.local)
+		wlPatch := workload.BaseSSAWorkload(group.local, false)
 		apimeta.SetStatusCondition(&wlPatch.Status.Conditions, metav1.Condition{
 			Type:    kueue.WorkloadFinished,
 			Status:  metav1.ConditionTrue,
@@ -436,7 +436,7 @@ func (w *wlReconciler) reconcileGroup(ctx context.Context, group *wlGroup) (reco
 			acs.State = kueue.CheckStateRetry
 			acs.Message = "Reserving remote lost"
 			acs.LastTransitionTime = metav1.NewTime(w.clock.Now())
-			wlPatch := workload.BaseSSAWorkload(group.local)
+			wlPatch := workload.BaseSSAWorkload(group.local, true)
 			workload.SetAdmissionCheckState(&wlPatch.Status.AdmissionChecks, *acs, w.clock)
 			return reconcile.Result{}, w.client.Status().Patch(ctx, wlPatch, client.Apply, client.FieldOwner(kueue.MultiKueueControllerName), client.ForceOwnership)
 		}
diff --git a/pkg/controller/admissionchecks/provisioning/controller.go b/pkg/controller/admissionchecks/provisioning/controller.go
index 7fb335568..7feca94b8 100644
--- a/pkg/controller/admissionchecks/provisioning/controller.go
+++ b/pkg/controller/admissionchecks/provisioning/controller.go
@@ -327,7 +327,7 @@ func (c *Controller) handleError(ctx context.Context, wl *kueue.Workload, ac *ku
 	c.record.Eventf(wl, corev1.EventTypeWarning, "FailedCreate", api.TruncateEventMessage(msg))
 
 	ac.Message = api.TruncateConditionMessage(msg)
-	wlPatch := workload.BaseSSAWorkload(wl)
+	wlPatch := workload.BaseSSAWorkload(wl, true)
 	workload.SetAdmissionCheckState(&wlPatch.Status.AdmissionChecks, *ac, c.clock)
 
 	patchErr := c.client.Status().Patch(
@@ -498,7 +498,8 @@ func (c *Controller) syncCheckStates(
 	log := ctrl.LoggerFrom(ctx)
 	wlInfo.update(wl, c.clock)
 	checksMap := slices.ToRefMap(wl.Status.AdmissionChecks, func(c *kueue.AdmissionCheckState) kueue.AdmissionCheckReference { return c.Name })
-	wlPatch := workload.BaseSSAWorkload(wl)
+	wlPatch := workload.BaseSSAWorkload(wl, true)
+	wlPatch.Status.RequeueState = wl.Status.RequeueState.DeepCopy()
 	recorderMessages := make([]string, 0, len(checkConfig))
 	updated := false
 	for check, prc := range checkConfig {
diff --git a/pkg/controller/core/localqueue_controller.go b/pkg/controller/core/localqueue_controller.go
index 8f8eab6fc..2eb7c5e51 100644
--- a/pkg/controller/core/localqueue_controller.go
+++ b/pkg/controller/core/localqueue_controller.go
@@ -182,7 +182,7 @@ func (r *LocalQueueReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 		if err := r.reconcileConsumedUsage(ctx, &queueObj); err != nil {
 			return ctrl.Result{}, client.IgnoreNotFound(err)
 		}
-		if err := r.queues.HeapifyClusterQueue(&cq, queueObj.Name); err != nil {
+		if err := r.queues.RebuildClusterQueue(&cq, queueObj.Name); err != nil {
 			return ctrl.Result{}, err
 		}
 		return ctrl.Result{RequeueAfter: r.admissionFSConfig.UsageSamplingInterval.Duration}, nil
@@ -307,6 +307,7 @@ func (r *LocalQueueReconciler) reconcileConsumedUsage(ctx context.Context, lq *k
 func (r *LocalQueueReconciler) updateAdmissionFsStatus(ctx context.Context, lq *kueue.LocalQueue, consumedResources corev1.ResourceList) error {
 	lq.Status.FairSharing.AdmissionFairSharingStatus.ConsumedResources = consumedResources
 	lq.Status.FairSharing.AdmissionFairSharingStatus.LastUpdate = metav1.NewTime(r.clock.Now())
+	r.log.V(3).Info("Updated LocalQueue fair sharing status", "namespace", lq.Namespace, "name", lq.Name, "consumedResources", consumedResources)
 	return r.client.Status().Update(ctx, lq)
 }
 
diff --git a/pkg/controller/core/workload_controller.go b/pkg/controller/core/workload_controller.go
index 639cbc443..d7ab5f4bd 100644
--- a/pkg/controller/core/workload_controller.go
+++ b/pkg/controller/core/workload_controller.go
@@ -255,7 +255,7 @@ func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
 		// exception due to complicated logic, not using PrepareForEviction (temporarily)
 		workload.ResetClusterNomination(&wl)
 		updated = workload.ResetChecksOnEviction(&wl, r.clock.Now()) || updated
-		reportWorkloadEvictedOnce := workload.WorkloadEvictionStateInc(&wl, kueue.WorkloadDeactivated, "")
+		reportWorkloadEvictedOnce := workload.WorkloadEvictionStateInc(&wl, reason, "")
 		if updated {
 			if err := workload.ApplyAdmissionStatus(ctx, r.client, &wl, true, r.clock); err != nil {
 				if apierrors.IsNotFound(err) {
@@ -266,7 +266,7 @@ func (r *WorkloadReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
 			if evicted && wl.Status.Admission != nil {
 				workload.ReportEvictedWorkload(r.recorder, &wl, wl.Status.Admission.ClusterQueue, reason, message)
 				if reportWorkloadEvictedOnce {
-					metrics.ReportEvictedWorkloadsOnce(wl.Status.Admission.ClusterQueue, kueue.WorkloadDeactivated, "")
+					metrics.ReportEvictedWorkloadsOnce(wl.Status.Admission.ClusterQueue, reason, "")
 				}
 			}
 			return ctrl.Result{}, nil
@@ -488,12 +488,16 @@ func (r *WorkloadReconciler) reconcileOnLocalQueueActiveState(ctx context.Contex
 		}
 		log.V(3).Info("Workload is evicted because the LocalQueue is stopped", "localQueue", klog.KRef(wl.Namespace, string(wl.Spec.QueueName)))
 		workload.PrepareForEviction(wl, r.clock.Now(), kueue.WorkloadEvictedByLocalQueueStopped, "The LocalQueue is stopped")
+		reportWorkloadEvictedOnce := workload.WorkloadEvictionStateInc(wl, kueue.WorkloadEvictedByLocalQueueStopped, "")
 		err := workload.ApplyAdmissionStatus(ctx, r.client, wl, true, r.clock)
 		if err == nil {
 			cqName := lq.Spec.ClusterQueue
 			if slices.Contains(r.queues.GetClusterQueueNames(), cqName) {
 				workload.ReportEvictedWorkload(r.recorder, wl, cqName, kueue.WorkloadEvictedByLocalQueueStopped, "The LocalQueue is stopped")
 			}
+			if reportWorkloadEvictedOnce {
+				metrics.ReportEvictedWorkloadsOnce(cqName, kueue.WorkloadEvictedByLocalQueueStopped, "")
+			}
 		}
 		return true, err
 	}
diff --git a/pkg/controller/jobframework/reconciler.go b/pkg/controller/jobframework/reconciler.go
index f5f94ae94..8231cd7d6 100644
--- a/pkg/controller/jobframework/reconciler.go
+++ b/pkg/controller/jobframework/reconciler.go
@@ -404,7 +404,7 @@ func (r *JobReconciler) ReconcileGenericJob(ctx context.Context, req ctrl.Reques
 	// Update workload conditions if implemented JobWithCustomWorkloadConditions interface.
 	if jobCond, ok := job.(JobWithCustomWorkloadConditions); wl != nil && ok {
 		if conditions, updated := jobCond.CustomWorkloadConditions(wl); updated {
-			wlPatch := workload.BaseSSAWorkload(wl)
+			wlPatch := workload.BaseSSAWorkload(wl, false)
 			wlPatch.Status.Conditions = conditions
 			return reconcile.Result{}, r.client.Status().Patch(ctx, wlPatch, client.Apply,
 				client.FieldOwner(fmt.Sprintf("%s-%s-controller", constants.KueueName, strings.ToLower(job.GVK().Kind))))
diff --git a/pkg/controller/tas/node_failure_controller.go b/pkg/controller/tas/node_failure_controller.go
index 5ec8513a4..fbbcfb61e 100644
--- a/pkg/controller/tas/node_failure_controller.go
+++ b/pkg/controller/tas/node_failure_controller.go
@@ -87,7 +87,11 @@ func (r *nodeFailureReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 	}
 	readyCondition := utiltas.GetNodeCondition(&node, corev1.NodeReady)
 	if readyCondition.Status == corev1.ConditionTrue {
-		return ctrl.Result{}, nil
+		affectedWorkloads, err = r.getWorkloadsOnNode(ctx, req.Name)
+		if err != nil {
+			return ctrl.Result{}, err
+		}
+		return ctrl.Result{}, r.removeNodeToReplaceAnnotation(ctx, req.Name, affectedWorkloads)
 	}
 	if features.Enabled(features.TASReplaceNodeOnPodTermination) {
 		return r.reconcileForReplaceNodeOnPodTermination(ctx, req.Name)
@@ -113,22 +117,16 @@ func (r *nodeFailureReconciler) Generic(event.TypedGenericEvent[*corev1.Node]) b
 }
 
 func (r *nodeFailureReconciler) Create(e event.TypedCreateEvent[*corev1.Node]) bool {
-	newNode := e.Object
-	if !utiltas.IsNodeStatusConditionTrue(newNode.Status.Conditions, corev1.NodeReady) {
-		r.log.V(4).Info("NodeReady is not true", "node", klog.KObj(newNode))
-		return true
-	}
-	r.log.V(5).Info("Node creation does not warrant reconcile for failure detection", "node", klog.KObj(newNode))
-	return false
+	return true
 }
 
 func (r *nodeFailureReconciler) Update(e event.TypedUpdateEvent[*corev1.Node]) bool {
-	newNode := e.ObjectNew
-	if !utiltas.IsNodeStatusConditionTrue(newNode.Status.Conditions, corev1.NodeReady) {
-		r.log.V(4).Info("NodeReady is not true", "node", klog.KObj(newNode))
+	newReady := utiltas.IsNodeStatusConditionTrue(e.ObjectNew.Status.Conditions, corev1.NodeReady)
+	oldReady := utiltas.IsNodeStatusConditionTrue(e.ObjectOld.Status.Conditions, corev1.NodeReady)
+	if oldReady != newReady {
+		r.log.V(4).Info("Node Ready status changed, triggering reconcile", "node", klog.KObj(e.ObjectNew), "oldReady", oldReady, "newReady", newReady)
 		return true
 	}
-	r.log.V(5).Info("Node update does not warrant reconcile for failure detection", "node", klog.KObj(newNode))
 	return false
 }
 
@@ -302,12 +300,7 @@ func (r *nodeFailureReconciler) patchWorkloadsForNodeToReplace(ctx context.Conte
 }
 
 func (r *nodeFailureReconciler) startEviction(ctx context.Context, wl *kueue.Workload, evictionMessage string) error {
-	workload.PrepareForEviction(wl, r.clock.Now(), kueue.WorkloadEvictedDueToNodeFailures, evictionMessage)
-	if err := workload.ApplyAdmissionStatus(ctx, r.client, wl, true, r.clock); err != nil {
-		return err
-	}
-	workload.ReportEvictedWorkload(r.recorder, wl, wl.Status.Admission.ClusterQueue, kueue.WorkloadEvictedDueToNodeFailures, evictionMessage)
-	return nil
+	return workload.EvictWorkload(ctx, r.client, r.recorder, wl, kueue.WorkloadEvictedDueToNodeFailures, evictionMessage, r.clock)
 }
 
 func (r *nodeFailureReconciler) reconcileForReplaceNodeOnPodTermination(ctx context.Context, nodeName string) (ctrl.Result, error) {
@@ -323,3 +316,44 @@ func (r *nodeFailureReconciler) reconcileForReplaceNodeOnPodTermination(ctx cont
 		return ctrl.Result{}, patchErr
 	}
 }
+
+// removeNodeToReplaceAnnotation finds workloads with the specified node in the NodeToReplaceAnnotation
+// and removes the annotation
+func (r *nodeFailureReconciler) removeNodeToReplaceAnnotation(ctx context.Context, nodeName string, affectedWorkloads sets.Set[types.NamespacedName]) error {
+	var workloadProcessingErrors []error
+	log := ctrl.LoggerFrom(ctx)
+	for wlKey := range affectedWorkloads {
+		log = log.WithValues("workload", wlKey)
+		// fetch workload.
+		var wl kueue.Workload
+		if err := r.client.Get(ctx, wlKey, &wl); err != nil {
+			if apierrors.IsNotFound(err) {
+				log.V(4).Info("Workload not found, skipping")
+			} else {
+				log.Error(err, "Failed to get workload")
+				workloadProcessingErrors = append(workloadProcessingErrors, err)
+			}
+			continue
+		}
+
+		if wl.Annotations != nil && wl.Annotations[kueuealpha.NodeToReplaceAnnotation] != nodeName {
+			continue
+		}
+
+		err := clientutil.Patch(ctx, r.client, &wl, true, func() (bool, error) {
+			log.V(4).Info(fmt.Sprintf("Removing node from %s annotation", kueuealpha.NodeToReplaceAnnotation), "failedNode", nodeName)
+			delete(wl.Annotations, kueuealpha.NodeToReplaceAnnotation)
+			return true, nil
+		})
+		if err != nil {
+			log.Error(err, "Failed to patch workload annotation")
+			workloadProcessingErrors = append(workloadProcessingErrors, err)
+			continue
+		}
+		log.V(3).Info("Successfully cleared the NodeToReplace annotation")
+	}
+	if len(workloadProcessingErrors) > 0 {
+		return errors.Join(workloadProcessingErrors...)
+	}
+	return nil
+}
diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go
index 948de6a87..9e16e9087 100644
--- a/pkg/metrics/metrics.go
+++ b/pkg/metrics/metrics.go
@@ -164,7 +164,12 @@ The label 'reason' can have the following values:
 - "PodsReadyTimeout" means that the eviction took place due to a PodsReady timeout.
 - "AdmissionCheck" means that the workload was evicted because at least one admission check transitioned to False.
 - "ClusterQueueStopped" means that the workload was evicted because the ClusterQueue is stopped.
-- "Deactivated" means that the workload was evicted because spec.active is set to false`,
+- "LocalQueueStopped" means that the workload was evicted because the LocalQueue is stopped.
+- "NodeFailures" means that the workload was evicted due to node failures when using TopologyAwareScheduling.
+- "Deactivated" means that the workload was evicted because spec.active is set to false.
+- "DeactivatedDueToAdmissionCheck" means that the workload was evicted and deactivated by Kueue due to a rejected admission check.
+- "DeactivatedDueToMaximumExecutionTimeExceeded" means that the workload was evicted and deactivated by Kueue due to maximum execution time exceeded.
+- "DeactivatedDueToRequeuingLimitExceeded" means that the workload was evicted and deactivated by Kueue due to requeuing limit exceeded.`,
 			Buckets: generateExponentialBuckets(14),
 		}, []string{"cluster_queue", "reason"},
 	)
@@ -276,7 +281,12 @@ The label 'reason' can have the following values:
 - "PodsReadyTimeout" means that the eviction took place due to a PodsReady timeout.
 - "AdmissionCheck" means that the workload was evicted because at least one admission check transitioned to False.
 - "ClusterQueueStopped" means that the workload was evicted because the ClusterQueue is stopped.
-- "Deactivated" means that the workload was evicted because spec.active is set to false`,
+- "LocalQueueStopped" means that the workload was evicted because the LocalQueue is stopped.
+- "NodeFailures" means that the workload was evicted due to node failures when using TopologyAwareScheduling.
+- "Deactivated" means that the workload was evicted because spec.active is set to false.
+- "DeactivatedDueToAdmissionCheck" means that the workload was evicted and deactivated by Kueue due to a rejected admission check.
+- "DeactivatedDueToMaximumExecutionTimeExceeded" means that the workload was evicted and deactivated by Kueue due to maximum execution time exceeded.
+- "DeactivatedDueToRequeuingLimitExceeded" means that the workload was evicted and deactivated by Kueue due to requeuing limit exceeded.`,
 		}, []string{"cluster_queue", "reason"},
 	)
 
@@ -298,7 +308,12 @@ The label 'reason' can have the following values:
 - "PodsReadyTimeout" means that the eviction took place due to a PodsReady timeout.
 - "AdmissionCheck" means that the workload was evicted because at least one admission check transitioned to False.
 - "ClusterQueueStopped" means that the workload was evicted because the ClusterQueue is stopped.
-- "Deactivated" means that the workload was evicted because spec.active is set to false`,
+- "LocalQueueStopped" means that the workload was evicted because the LocalQueue is stopped.
+- "NodeFailures" means that the workload was evicted due to node failures when using TopologyAwareScheduling.
+- "Deactivated" means that the workload was evicted because spec.active is set to false.
+- "DeactivatedDueToAdmissionCheck" means that the workload was evicted and deactivated by Kueue due to a rejected admission check.
+- "DeactivatedDueToMaximumExecutionTimeExceeded" means that the workload was evicted and deactivated by Kueue due to maximum execution time exceeded.
+- "DeactivatedDueToRequeuingLimitExceeded" means that the workload was evicted and deactivated by Kueue due to requeuing limit exceeded.`,
 		}, []string{"name", "namespace", "reason"},
 	)
 
@@ -312,7 +327,12 @@ The label 'reason' can have the following values:
 - "PodsReadyTimeout" means that the eviction took place due to a PodsReady timeout.
 - "AdmissionCheck" means that the workload was evicted because at least one admission check transitioned to False.
 - "ClusterQueueStopped" means that the workload was evicted because the ClusterQueue is stopped.
-- "Deactivated" means that the workload was evicted because spec.active is set to false`,
+- "LocalQueueStopped" means that the workload was evicted because the LocalQueue is stopped.
+- "NodeFailures" means that the workload was evicted due to node failures when using TopologyAwareScheduling.
+- "Deactivated" means that the workload was evicted because spec.active is set to false.
+- "DeactivatedDueToAdmissionCheck" means that the workload was evicted and deactivated by Kueue due to a rejected admission check.
+- "DeactivatedDueToMaximumExecutionTimeExceeded" means that the workload was evicted and deactivated by Kueue due to maximum execution time exceeded.
+- "DeactivatedDueToRequeuingLimitExceeded" means that the workload was evicted and deactivated by Kueue due to requeuing limit exceeded.`,
 		}, []string{"cluster_queue", "reason", "detailed_reason"},
 	)
 
@@ -443,8 +463,8 @@ For a LocalQueue, the metric only reports a value of 1 for one of the statuses.`
 		prometheus.GaugeOpts{
 			Subsystem: constants.KueueName,
 			Name:      "cluster_queue_weighted_share",
-			Help: `Reports a value that representing the maximum of the ratios of usage above nominal 
-quota to the lendable resources in the cohort, among all the resources provided by 
+			Help: `Reports a value that representing the maximum of the ratios of usage above nominal
+quota to the lendable resources in the cohort, among all the resources provided by
 the ClusterQueue, and divided by the weight.
 If zero, it means that the usage of the ClusterQueue is below the nominal quota.
 If the ClusterQueue has a weight of zero and is borrowing, this will return 9223372036854775807,
@@ -456,8 +476,8 @@ the maximum possible share value.`,
 		prometheus.GaugeOpts{
 			Subsystem: constants.KueueName,
 			Name:      "cohort_weighted_share",
-			Help: `Reports a value that representing the maximum of the ratios of usage above nominal 
-quota to the lendable resources in the Cohort, among all the resources provided by 
+			Help: `Reports a value that representing the maximum of the ratios of usage above nominal
+quota to the lendable resources in the Cohort, among all the resources provided by
 the Cohort, and divided by the weight.
 If zero, it means that the usage of the Cohort is below the nominal quota.
 If the Cohort has a weight of zero and is borrowing, this will return 9223372036854775807,
diff --git a/pkg/queue/afs_entry_penalties.go b/pkg/queue/afs_entry_penalties.go
index 82254ec39..ffa3558d6 100644
--- a/pkg/queue/afs_entry_penalties.go
+++ b/pkg/queue/afs_entry_penalties.go
@@ -92,3 +92,10 @@ func (m *AfsEntryPenalties) HasAny() bool {
 func (m *AfsEntryPenalties) GetPenalties() *utilmaps.SyncMap[utilqueue.LocalQueueReference, corev1.ResourceList] {
 	return m.penalties
 }
+
+func (m *AfsEntryPenalties) GetLocalQueueKeysWithPenalties() []utilqueue.LocalQueueReference {
+	m.RLock()
+	defer m.RUnlock()
+
+	return m.penalties.Keys()
+}
diff --git a/pkg/queue/cluster_queue.go b/pkg/queue/cluster_queue.go
index bbf70d54d..e4562087d 100644
--- a/pkg/queue/cluster_queue.go
+++ b/pkg/queue/cluster_queue.go
@@ -179,7 +179,7 @@ func (c *ClusterQueue) PushOrUpdate(wInfo *workload.Info) {
 	c.heap.PushOrUpdate(wInfo)
 }
 
-func (c *ClusterQueue) Heapify(lqName string) {
+func (c *ClusterQueue) RebuildLocalQueue(lqName string) {
 	c.rwm.Lock()
 	defer c.rwm.Unlock()
 	for _, wl := range c.heap.List() {
@@ -460,7 +460,7 @@ func queueOrderingFunc(ctx context.Context, c client.Client, wo workload.Orderin
 	}
 }
 
-func (c *ClusterQueue) HeapifyAll() {
+func (c *ClusterQueue) RebuildAll() {
 	c.rwm.Lock()
 	defer c.rwm.Unlock()
 	for _, wl := range c.heap.List() {
diff --git a/pkg/queue/manager.go b/pkg/queue/manager.go
index 709cf55f7..2405541a9 100644
--- a/pkg/queue/manager.go
+++ b/pkg/queue/manager.go
@@ -259,14 +259,14 @@ func (m *Manager) UpdateClusterQueue(ctx context.Context, cq *kueue.ClusterQueue
 	return nil
 }
 
-func (m *Manager) HeapifyClusterQueue(cq *kueue.ClusterQueue, lqName string) error {
+func (m *Manager) RebuildClusterQueue(cq *kueue.ClusterQueue, lqName string) error {
 	m.Lock()
 	defer m.Unlock()
 	cqImpl := m.hm.ClusterQueue(kueue.ClusterQueueReference(cq.Name))
 	if cqImpl == nil {
 		return ErrClusterQueueDoesNotExist
 	}
-	cqImpl.Heapify(lqName)
+	cqImpl.RebuildLocalQueue(lqName)
 	return nil
 }
 
@@ -808,12 +808,20 @@ func (m *Manager) queueSecondPass(ctx context.Context, w *kueue.Workload) {
 	}
 }
 
-func (m *Manager) HeapifyAllClusterQueues() {
+func (m *Manager) RebuildClusterQueuesWithEntryPenalties() {
 	m.Lock()
 	defer m.Unlock()
-	for _, cq := range m.hm.ClusterQueues() {
-		if cq != nil {
-			cq.HeapifyAll()
+
+	clusterQueuesWithPenalties := sets.New[kueue.ClusterQueueReference]()
+	for _, lqKey := range m.afsEntryPenalties.GetLocalQueueKeysWithPenalties() {
+		if lq, exists := m.localQueues[lqKey]; exists {
+			clusterQueuesWithPenalties.Insert(lq.ClusterQueue)
+		}
+	}
+
+	for cqName := range clusterQueuesWithPenalties {
+		if cq := m.hm.ClusterQueue(cqName); cq != nil {
+			cq.RebuildAll()
 		}
 	}
 }
diff --git a/pkg/scheduler/preemption/classical/candidate_generator.go b/pkg/scheduler/preemption/classical/candidate_generator.go
index 11ce99e4e..0e6a4fe66 100644
--- a/pkg/scheduler/preemption/classical/candidate_generator.go
+++ b/pkg/scheduler/preemption/classical/candidate_generator.go
@@ -20,6 +20,7 @@ import (
 	"sort"
 	"time"
 
+	"github.com/go-logr/logr"
 	"k8s.io/apimachinery/pkg/api/meta"
 	"k8s.io/apimachinery/pkg/util/sets"
 	"k8s.io/utils/clock"
@@ -73,17 +74,17 @@ func splitEvicted(workloads []*candidateElem) ([]*candidateElem, []*candidateEle
 // with and without borrowing. The runs are independent which means that the same candidates
 // might be returned for both, but note that the candidates with borrrowing are a subset of
 // candidates without borrowing.
-func NewCandidateIterator(hierarchicalReclaimCtx *HierarchicalPreemptionCtx, frsNeedPreemption sets.Set[resources.FlavorResource], snapshot *cache.Snapshot, clock clock.Clock, ordering func(*workload.Info, *workload.Info, kueue.ClusterQueueReference, time.Time) bool) *candidateIterator {
+func NewCandidateIterator(hierarchicalReclaimCtx *HierarchicalPreemptionCtx, frsNeedPreemption sets.Set[resources.FlavorResource], snapshot *cache.Snapshot, clock clock.Clock, ordering func(logr.Logger, *workload.Info, *workload.Info, kueue.ClusterQueueReference, time.Time) bool) *candidateIterator {
 	sameQueueCandidates := collectSameQueueCandidates(hierarchicalReclaimCtx)
 	hierarchyCandidates, priorityCandidates := collectCandidatesForHierarchicalReclaim(hierarchicalReclaimCtx)
 	sort.Slice(sameQueueCandidates, func(i, j int) bool {
-		return ordering(sameQueueCandidates[i].wl, sameQueueCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
+		return ordering(hierarchicalReclaimCtx.Log, sameQueueCandidates[i].wl, sameQueueCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
 	})
 	sort.Slice(priorityCandidates, func(i, j int) bool {
-		return ordering(priorityCandidates[i].wl, priorityCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
+		return ordering(hierarchicalReclaimCtx.Log, priorityCandidates[i].wl, priorityCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
 	})
 	sort.Slice(hierarchyCandidates, func(i, j int) bool {
-		return ordering(hierarchyCandidates[i].wl, hierarchyCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
+		return ordering(hierarchicalReclaimCtx.Log, hierarchyCandidates[i].wl, hierarchyCandidates[j].wl, hierarchicalReclaimCtx.Cq.Name, clock.Now())
 	})
 
 	evictedHierarchicalReclaimCandidates, nonEvictedHierarchicalReclaimCandidates := splitEvicted(hierarchyCandidates)
diff --git a/pkg/scheduler/preemption/classical/hierarchical_preemption.go b/pkg/scheduler/preemption/classical/hierarchical_preemption.go
index ca3159146..5f8fb87d8 100644
--- a/pkg/scheduler/preemption/classical/hierarchical_preemption.go
+++ b/pkg/scheduler/preemption/classical/hierarchical_preemption.go
@@ -17,6 +17,7 @@ limitations under the License.
 package classical
 
 import (
+	"github.com/go-logr/logr"
 	"k8s.io/apimachinery/pkg/util/sets"
 
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
@@ -58,6 +59,7 @@ func (m preemptionVariant) PreemptionReason() string {
 }
 
 type HierarchicalPreemptionCtx struct {
+	Log               logr.Logger
 	Wl                *kueue.Workload
 	Cq                *cache.ClusterQueueSnapshot
 	FrsNeedPreemption sets.Set[resources.FlavorResource]
diff --git a/pkg/scheduler/preemption/preemption.go b/pkg/scheduler/preemption/preemption.go
index 5a3eee051..ef92ed7c3 100644
--- a/pkg/scheduler/preemption/preemption.go
+++ b/pkg/scheduler/preemption/preemption.go
@@ -188,10 +188,13 @@ func (p *Preemptor) applyPreemptionWithSSA(ctx context.Context, w *kueue.Workloa
 	workload.PrepareForEviction(w, p.clock.Now(), kueue.WorkloadEvictedByPreemption, message)
 	reportWorkloadEvictedOnce := workload.WorkloadEvictionStateInc(w, kueue.WorkloadEvictedByPreemption, "")
 	workload.SetPreemptedCondition(w, reason, message)
-	if reportWorkloadEvictedOnce {
-		metrics.ReportEvictedWorkloadsOnce(w.Status.Admission.ClusterQueue, kueue.WorkloadEvictedByPreemption, "")
+	err := workload.ApplyAdmissionStatus(ctx, p.client, w, true, p.clock)
+	if err == nil {
+		if reportWorkloadEvictedOnce {
+			metrics.ReportEvictedWorkloadsOnce(w.Status.Admission.ClusterQueue, kueue.WorkloadEvictedByPreemption, "")
+		}
 	}
-	return workload.ApplyAdmissionStatus(ctx, p.client, w, true, p.clock)
+	return err
 }
 
 type preemptionAttemptOpts struct {
@@ -208,6 +211,7 @@ type preemptionAttemptOpts struct {
 // fits
 func (p *Preemptor) classicalPreemptions(preemptionCtx *preemptionCtx) []*Target {
 	hierarchicalReclaimCtx := &classical.HierarchicalPreemptionCtx{
+		Log:               preemptionCtx.log,
 		Wl:                preemptionCtx.preemptor.Obj,
 		Cq:                preemptionCtx.preemptorCQ,
 		FrsNeedPreemption: preemptionCtx.frsNeedPreemption,
@@ -380,7 +384,7 @@ func (p *Preemptor) fairPreemptions(preemptionCtx *preemptionCtx, strategies []f
 		return nil
 	}
 	sort.Slice(candidates, func(i, j int) bool {
-		return CandidatesOrdering(candidates[i], candidates[j], preemptionCtx.preemptorCQ.Name, p.clock.Now())
+		return CandidatesOrdering(preemptionCtx.log, candidates[i], candidates[j], preemptionCtx.preemptorCQ.Name, p.clock.Now())
 	})
 	if logV := preemptionCtx.log.V(5); logV.Enabled() {
 		logV.Info("Simulating fair preemption", "candidates", workload.References(candidates), "resourcesRequiringPreemption", preemptionCtx.frsNeedPreemption.UnsortedList(), "preemptingWorkload", klog.KObj(preemptionCtx.preemptor.Obj))
@@ -542,7 +546,7 @@ func resourceUsagePreemptionEnabled(a, b *workload.Info) bool {
 // 2. (AdmissionFairSharing only) Workloads with lower LocalQueue's usage first
 // 3. Workloads with lower priority first.
 // 4. Workloads admitted more recently first.
-func CandidatesOrdering(a, b *workload.Info, cq kueue.ClusterQueueReference, now time.Time) bool {
+func CandidatesOrdering(log logr.Logger, a, b *workload.Info, cq kueue.ClusterQueueReference, now time.Time) bool {
 	aEvicted := meta.IsStatusConditionTrue(a.Obj.Status.Conditions, kueue.WorkloadEvicted)
 	bEvicted := meta.IsStatusConditionTrue(b.Obj.Status.Conditions, kueue.WorkloadEvicted)
 	if aEvicted != bEvicted {
@@ -556,6 +560,9 @@ func CandidatesOrdering(a, b *workload.Info, cq kueue.ClusterQueueReference, now
 
 	if features.Enabled(features.AdmissionFairSharing) && resourceUsagePreemptionEnabled(a, b) {
 		if a.LocalQueueFSUsage != b.LocalQueueFSUsage {
+			log.V(3).Info("Comparing workloads by LocalQueue fair sharing usage",
+				"workloadA", klog.KObj(a.Obj), "queueA", a.Obj.Spec.QueueName, "usageA", a.LocalQueueFSUsage,
+				"workloadB", klog.KObj(b.Obj), "queueB", b.Obj.Spec.QueueName, "usageB", b.LocalQueueFSUsage)
 			return *a.LocalQueueFSUsage > *b.LocalQueueFSUsage
 		}
 	}
diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go
index ef258518d..51e3a5dae 100644
--- a/pkg/scheduler/scheduler.go
+++ b/pkg/scheduler/scheduler.go
@@ -195,8 +195,8 @@ func (s *Scheduler) schedule(ctx context.Context) wait.SpeedSignal {
 	ctx = ctrl.LoggerInto(ctx, log)
 
 	var snapshotOpts []cache.SnapshotOption
-	if features.Enabled(features.AdmissionFairSharing) && s.queues.HasAnyEntryPenalty() {
-		s.queues.HeapifyAllClusterQueues()
+	if features.Enabled(features.AdmissionFairSharing) {
+		s.queues.RebuildClusterQueuesWithEntryPenalties()
 		snapshotOpts = append(snapshotOpts, cache.WithAfsEntryPenalties(s.queues.GetAfsEntryPenalties()))
 	}
 
diff --git a/pkg/util/maps/maps.go b/pkg/util/maps/maps.go
index 576f20c1e..831ea7cd9 100644
--- a/pkg/util/maps/maps.go
+++ b/pkg/util/maps/maps.go
@@ -19,6 +19,7 @@ package maps
 import (
 	"fmt"
 	"maps"
+	"slices"
 	"sync"
 
 	"k8s.io/apimachinery/pkg/util/sets"
@@ -126,3 +127,9 @@ func (dwc *SyncMap[K, V]) Delete(k K) {
 	defer dwc.lock.Unlock()
 	delete(dwc.m, k)
 }
+
+func (dwc *SyncMap[K, V]) Keys() []K {
+	dwc.lock.RLock()
+	defer dwc.lock.RUnlock()
+	return slices.Collect(maps.Keys(dwc.m))
+}
diff --git a/pkg/workload/workload.go b/pkg/workload/workload.go
index a875507d4..6dc00e2f9 100644
--- a/pkg/workload/workload.go
+++ b/pkg/workload/workload.go
@@ -546,7 +546,7 @@ func UpdateStatus(ctx context.Context,
 		ObservedGeneration: wl.Generation,
 	}
 
-	newWl := BaseSSAWorkload(wl)
+	newWl := BaseSSAWorkload(wl, false)
 	newWl.Status.Conditions = []metav1.Condition{condition}
 	return c.Status().Patch(ctx, newWl, client.Apply, client.FieldOwner(managerPrefix+"-"+condition.Type))
 }
@@ -650,7 +650,7 @@ func workloadsWithPodsReadyToEvictedTime(wl *kueue.Workload) *time.Duration {
 // BaseSSAWorkload creates a new object based on the input workload that
 // only contains the fields necessary to identify the original object.
 // The object can be used in as a base for Server-Side-Apply.
-func BaseSSAWorkload(w *kueue.Workload) *kueue.Workload {
+func BaseSSAWorkload(w *kueue.Workload, strict bool) *kueue.Workload {
 	wlCopy := &kueue.Workload{
 		ObjectMeta: metav1.ObjectMeta{
 			UID:         w.UID,
@@ -668,6 +668,9 @@ func BaseSSAWorkload(w *kueue.Workload) *kueue.Workload {
 	if wlCopy.Kind == "" {
 		wlCopy.Kind = "Workload"
 	}
+	if strict {
+		wlCopy.ResourceVersion = w.ResourceVersion
+	}
 	return wlCopy
 }
 
@@ -794,10 +797,10 @@ func PropagateResourceRequests(w *kueue.Workload, info *Info) bool {
 	return true
 }
 
-// AdmissionStatusPatch creates a new object based on the input workload that contains
+// admissionStatusPatch creates a new object based on the input workload that contains
 // the admission and related conditions. The object can be used in Server-Side-Apply.
 // If strict is true, resourceVersion will be part of the patch.
-func AdmissionStatusPatch(w *kueue.Workload, wlCopy *kueue.Workload, strict bool) {
+func admissionStatusPatch(w *kueue.Workload, wlCopy *kueue.Workload) {
 	wlCopy.Status.Admission = w.Status.Admission.DeepCopy()
 	wlCopy.Status.RequeueState = w.Status.RequeueState.DeepCopy()
 	if wlCopy.Status.Admission != nil {
@@ -813,9 +816,6 @@ func AdmissionStatusPatch(w *kueue.Workload, wlCopy *kueue.Workload, strict bool
 			wlCopy.Status.Conditions = append(wlCopy.Status.Conditions, *existing.DeepCopy())
 		}
 	}
-	if strict {
-		wlCopy.ResourceVersion = w.ResourceVersion
-	}
 	wlCopy.Status.AccumulatedPastExexcutionTimeSeconds = w.Status.AccumulatedPastExexcutionTimeSeconds
 	if w.Status.SchedulingStats != nil {
 		if wlCopy.Status.SchedulingStats == nil {
@@ -845,8 +845,8 @@ func ApplyAdmissionStatus(ctx context.Context, c client.Client, w *kueue.Workloa
 }
 
 func PrepareWorkloadPatch(w *kueue.Workload, strict bool, clk clock.Clock) *kueue.Workload {
-	wlCopy := BaseSSAWorkload(w)
-	AdmissionStatusPatch(w, wlCopy, strict)
+	wlCopy := BaseSSAWorkload(w, strict)
+	admissionStatusPatch(w, wlCopy)
 	AdmissionChecksStatusPatch(w, wlCopy, clk)
 	return wlCopy
 }
@@ -890,7 +890,7 @@ func HasQuotaReservation(w *kueue.Workload) bool {
 
 // UpdateReclaimablePods updates the ReclaimablePods list for the workload with SSA.
 func UpdateReclaimablePods(ctx context.Context, c client.Client, w *kueue.Workload, reclaimablePods []kueue.ReclaimablePod) error {
-	patch := BaseSSAWorkload(w)
+	patch := BaseSSAWorkload(w, false)
 	patch.Status.ReclaimablePods = reclaimablePods
 	return c.Status().Patch(ctx, patch, client.Apply, client.FieldOwner(constants.ReclaimablePodsMgr))
 }
diff --git a/site/content/en/docs/concepts/admission_fair_sharing.md b/site/content/en/docs/concepts/admission_fair_sharing.md
index 7b8d2f23c..b72e82929 100644
--- a/site/content/en/docs/concepts/admission_fair_sharing.md
+++ b/site/content/en/docs/concepts/admission_fair_sharing.md
@@ -27,6 +27,16 @@ When multiple workloads compete for resources within a ClusterQueue:
 2. Workloads from LocalQueues with lower historical usage get admitted before those from high-usage queues
 3. Usage values decay over time based on configurable parameters
 
+### Entry Penalty
+
+{{% alert title="Note" color="primary" %}}
+Entry Penalty is available since Kueue v0.13.0.
+{{% /alert %}}
+
+To prevent exploitation where tenants could submit many workloads quickly before usage statistics are updated, Kueue applies an entry penalty to each admitted workload. This penalty is immediately added to the LocalQueue's usage statistics. This ensures that even if a tenant submits multiple workloads rapidly, subsequent workloads will be properly prioritized based on the updated usage including the penalty.
+
+For example, if Tenant A has low historical usage and Tenant B has high usage, but Tenant B submits 100 workloads simultaneously, without the entry penalty all 100 workloads might be admitted before the usage statistics update. With the entry penalty, each admitted workload immediately increases Tenant B's usage statistics, so subsequent workloads from Tenant B will be properly deprioritized in favor of workloads from Tenant A.
+
 ## Configuration
 
 ### Kueue's configuration
diff --git a/site/content/en/docs/concepts/cluster_queue.md b/site/content/en/docs/concepts/cluster_queue.md
index 4be5b3c1f..75360301a 100644
--- a/site/content/en/docs/concepts/cluster_queue.md
+++ b/site/content/en/docs/concepts/cluster_queue.md
@@ -475,12 +475,14 @@ the heuristics that Kueue implements to preempt as few Workloads as possible.
 
 ## FlavorFungibility
 
-When there is not enough nominal quota of resources in a ResourceFlavor, the incoming Workload can borrow
-quota or preempt running Workloads in the ClusterQueue or Cohort.
-
-Kueue evaluates the flavors in a ClusterQueue in order. You can influence whether to prioritize
-preemptions or borrowing in a flavor before trying to accommodate the Workload in the next flavor, by
-setting the `flavorFungibility` field.
+When there is not enough nominal quota of resources in a ResourceFlavor, the
+incoming Workload can borrow quota or preempt running Workloads in the
+ClusterQueue or Cohort. In the ClusterQueue, there can be multiple Flavors
+for each resource, with potentially different amounts of quota available in each.
+Kueue evaluates the Flavors in a ClusterQueue in order and for each it
+checks if the required resource of the workload fits in this ResourceFlavor and
+if borrowing or preemption is required. You can influence the Flavor selection
+process by configuring the `flavorFungibility` field.
 
 A configuration for a ClusterQueue that configures this behavior looks like the following:
 
@@ -497,17 +499,40 @@ spec:
 
 The fields above do the following:
 
-- `whenCanBorrow` determines whether a workload should stop finding a better assignment if it can get enough resource by borrowing in current ResourceFlavor. The possible values are:
-  - `Borrow` (default): ClusterQueue stops finding a better assignment.
-  - `TryNextFlavor`: ClusterQueue tries the next ResourceFlavor to see if the workload can get a better assignment.
-- `whenCanPreempt` determines whether a workload should try preemption in current ResourceFlavor before try the next one. The possible values are:
-  - `Preempt`: ClusterQueue stops trying preemption in current ResourceFlavor and starts from the next one if preempting failed.
-  - `TryNextFlavor` (default): ClusterQueue tries the next ResourceFlavor to see if the workload can fit in the ResourceFlavor.
+- `whenCanBorrow` defines what should happen if a workload can get enough resource by
+borrowing in current ResourceFlavor. The possible values are:
+  - `Borrow` (default): Kueue stops looking for a better assignment.
+  - `TryNextFlavor`: Kueue tries the next ResourceFlavor.
+- `whenCanPreempt` defines what should happen if a workload can get enough resource by
+preempting in current ResourceFlavor. The possible values are:
+  - `Preempt`: Kueue stops looking for a better assignment.
+  - `TryNextFlavor` (default): Kueue tries the next ResourceFlavor.
+
+If during the search, Kueue finds some ResourceFlavor in which it can fit
+without preemption or borrowing, such ResourceFlavor is immediately selected,
+regardless of the above configuration. Otherwise, out of the considered
+ResourceFlavors, Kueue selects a one that fits the workload using borrowing
+(without preemptions). If there is no such ResourceFlavor, Kueue selects a Flavor
+that uses preemption and is preferably not borrowing.
+
+By default Kueue avoids preemptions and prefers borrowing when assigning Flavors.
+Borrowing is not disruptive to other workloads but a
+workload that borrows risks being prempted (since it is using nominal quota
+from some other Cluster Queue). If you prefer to preempt rather than borrow when possible,
+you can enable the feature gate `FlavorFungibilityImplicitPreferenceDefault`, which
+changes the default preference as follows: If `.spec.flavorFungibility.whenCanBorrow` is `TryNextFlavor`,
+it assumes that preemption is preferred over borrowing and otherwise it assumes
+that borrowing is preferred over preemption.
+
+{{% alert title="Note" color="primary" %}}
+`FlavorFungibilityImplicitPreferenceDefault` is currently an alpha feature,
+introduced to Kueue in version 0.13 and it is not enabled by default.
 
-By default, the incoming workload stops trying the next flavor if the workload can get enough borrowed resources.
-And Kueue triggers preemption only after Kueue determines that the remaining ResourceFlavors can't fit the workload.
+To enable the feature, you have to set the `FlavorFungibilityImplicitPreferenceDefault`
+feature gate to `true`. Check the [Installation](/docs/installation/#change-the-feature-gates-configuration)
+guide for details on feature gate configuration.
+{{% /alert %}}
 
-Note that, whenever possible and when the configured policy allows it, Kueue avoids preemptions if it can fit a Workload by borrowing.
 
 ## StopPolicy
 
diff --git a/site/content/en/docs/concepts/multikueue.md b/site/content/en/docs/concepts/multikueue.md
index 6ab9505c3..9b024cdad 100644
--- a/site/content/en/docs/concepts/multikueue.md
+++ b/site/content/en/docs/concepts/multikueue.md
@@ -50,7 +50,9 @@ To enable multi-cluster dispatching, you need to assign a Job to a ClusterQueue
 The dispatching flow works as follows:
 
 1. When the Job's Workload obtains a `QuotaReservation` in the manager cluster,
-   a copy of that Workload is created in all configured worker clusters.
+   the dispatcher determines the worker clusters where the Workload should be created.
+   Depending on the configured dispatching algorithm (e.g., AllAtOnce, Incremental, or a custom approach),
+   the Workload may be created in all configured worker clusters or in a subset of them.
 2. When a worker cluster admits one of these remote Workloads:
    - The manager deletes the Workloads from the other clusters.
    - The manager creates a copy of the Job in the selected worker cluster and labels it
@@ -61,6 +63,48 @@ The dispatching flow works as follows:
    - The manager performs a final status sync.
    - It then deletes the corresponding objects from the worker cluster.
 
+## Workload Dispatching
+
+{{% alert title="Note" color="primary" %}}
+The MultiKueue Dispatcher mechanism is available since Kueue v0.13.
+{{% /alert %}}
+Provides a flexible way to control how workloads are distributed across worker clusters
+by allowing users to choose between built-in dispatching algorithms or implement custom ones.
+This mechanism ensures efficient workload placement while minimizing resource contention and preemptions across clusters.
+
+The `status.nominatedClusterNames` field lists the worker clusters currently being considered for scheduling the Workload,
+as determined by the dispatching algorithm, and is updated while the Workload is pending admission.
+
+The `status.clusterName` field specifies the worker cluster where the Workload has been successfully admitted.
+Once the field is set, it becomes immutable and the `status.nominatedClusterNames` field is reset,
+and it is no longer possible to set it. 
+
+This ensures that the Workload's cluster assignment is finalized and prevents further nomination of clusters.
+
+### AllAtOnce (Default Mode):
+In this mode, the Workload is copied to all available worker clusters as soon as it obtains a QuotaReservation in the manager cluster.
+This approach ensures the fastest possible admission by allowing all clusters to compete for the Workload simultaneously.
+
+### Incremental:
+This mode introduces a gradual dispatching strategy where clusters are nominated in rounds.
+Initially, all worker clusters are sorted in dictionary order, and a subset of up to 3 clusters is selected from the sorted list.
+The Workload is copied only to these nominated clusters.
+If none of the nominated clusters admit the Workload within a fixed duration (5 minutes),
+an additional up to 3 clusters are incrementally added in subsequent rounds, following the same dictionary order.
+
+### External (Custom implementation):
+In this mode, the selection of worker clusters is delegated to an external controller.
+The external controller is responsible for setting the `.status.nominatedClusterNames` field in the Workload to specify the clusters where it should be copied.
+
+The MultiKueue Workload Controller synchronizes the Workload with the nominated clusters.
+
+Known Limitation:
+{{% alert title="Warning" color="primary" %}}
+For the external controller to patch the `.status.nominatedClusterNames` field, it must use the kueue-admission field manager.
+This is required because the kueue-admission field manager is responsible for managing updates to the `.status.nominatedClusterNames` field.
+Without this, the Kueue is not able to admit the MultiKueue workloads.
+{{% /alert %}}
+
 ## Supported Job Types
 
 MultiKueue supports a wide variety of workloads. You can learn how to:
diff --git a/site/content/en/docs/concepts/topology_aware_scheduling.md b/site/content/en/docs/concepts/topology_aware_scheduling.md
index 7943b210f..1d3814254 100644
--- a/site/content/en/docs/concepts/topology_aware_scheduling.md
+++ b/site/content/en/docs/concepts/topology_aware_scheduling.md
@@ -85,10 +85,15 @@ following annotations set at the PodTemplate level:
 	then the next topology level up is considered. If the PodSet cannot fit
 	at the highest topology level, then it gets admitted as distributed
 	among multiple topology domains.
-- `kueue.x-k8s.io/podset-required-topology` - indicates indicates that a PodSet
+- `kueue.x-k8s.io/podset-required-topology` - indicates that a PodSet
   requires Topology Aware Scheduling, and requires scheduling all pods on nodes
 	within the same topology domain corresponding to the topology level
 	indicated by the annotation value (e.g. within a rack or within a block).
+- `kueue.x-k8s.io/podset-unconstrained-topology` - indicates that a PodSet requires
+    Topology Aware Scheduling, and requires scheduling all pods on any nodes without
+    topology considerations. In other words, this considers if all pods could be accommodated 
+    within any nodes which helps to minimize fragmentation by filling the small gaps
+    on nodes across the cluster.
 
 #### Example
 
diff --git a/site/content/en/docs/reference/kueue-config.v1beta1.md b/site/content/en/docs/reference/kueue-config.v1beta1.md
index c0aa05b44..6b569009d 100644
--- a/site/content/en/docs/reference/kueue-config.v1beta1.md
+++ b/site/content/en/docs/reference/kueue-config.v1beta1.md
@@ -75,6 +75,7 @@ Defaults to 1.</p>
 <td>
    <p>QPS controls the number of queries per second allowed for K8S api server
 connection.</p>
+<p>Setting this to a negative value will disable client-side ratelimiting.</p>
 </td>
 </tr>
 <tr><td><code>burst</code> <B>[Required]</B><br/>
diff --git a/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_in_grafana.md b/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_in_grafana.md
index 2ac4180c8..1e6c64243 100644
--- a/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_in_grafana.md
+++ b/site/content/en/docs/tasks/manage/monitor_pending_workloads/pending_workloads_in_grafana.md
@@ -82,8 +82,8 @@ Grafana is now available at [http://localhost:3000](http://localhost:3000).
 ### Step 6: Import the Pending Workloads Dashboard
 
 1. Download the appropriate dashboard JSON:
-   - [ClusterQueue Visibility](examples/visibility/pending-workloads-for-cluster-queue-visibility-dashboard.json).
-   - [LocalQueue Visibility](examples/visibility/pending-workloads-for-local-queue-visibility-dashboard.json).
+   - [ClusterQueue Visibility](/examples/visibility/pending-workloads-for-cluster-queue-visibility-dashboard.json).
+   - [LocalQueue Visibility](/examples/visibility/pending-workloads-for-local-queue-visibility-dashboard.json).
 2. In Grafana, go to `Dashboards` > `New` > `Import`.
 3. Select `Upload dashboard JSON` file and choose the downloaded file.
 4. Select the Infinity data source configured in Step 5.
diff --git a/site/content/zh-CN/docs/contribution_guidelines/testing.md b/site/content/zh-CN/docs/contribution_guidelines/testing.md
index d8b080816..240e820a8 100644
--- a/site/content/zh-CN/docs/contribution_guidelines/testing.md
+++ b/site/content/zh-CN/docs/contribution_guidelines/testing.md
@@ -1,59 +1,59 @@
 ---
-title: "Running and debugging tests"
-linkTitle: "Running tests"
+title: "运行和调试测试"
+linkTitle: "运行测试"
 weight: 25
 description: >
-  Running and debugging tests
+  运行和调试测试
 ---
 
-## Running presubmission verification tests
+## 运行预提交验证测试 {#running-presubmission-verification-tests}
 ```shell
 make verify
 ```
 
-## Running unit tests
-To run all unit tests:
+## 运行单元测试 {#running-unit-tests}
+运行所有单元测试：
 ```shell
 make test
 ```
 
-To run unit tests for webhooks:
+运行 Webhook 的单元测试：
 ```shell
 go test ./pkg/webhooks
 ```
-To run tests that match `TestValidateClusterQueue` regular expression [ref](https://pkg.go.dev/cmd/go#hdr-Testing_flags):
+[参考文档](https://pkg.go.dev/cmd/go#hdr-Testing_flags)运行与 `TestValidateClusterQueue` 正则表达式匹配的测试：
 ```shell
 go test ./pkg/webhooks -run TestValidateClusterQueue
 ```
 
-### Running unit tests with race detection
+### 使用竞态检测运行单元测试 {#running-unit-tests-with-race-detection}
 
-Use `-race` to enable Go's built-in race detector:
+使用 `-race` 启用 Go 内置的竞态检测器：
 ```shell
 go test ./pkg/scheduler/preemption/ -race
 ```
 
-### Running unit tests with stress
+### 使用压力测试运行单元测试 {#running-unit-tests-with-stress}
 
-To run unit tests in a loop and collect failures:
+循环运行单元测试并收集失败情况：
 ```shell
-# install go stress
+# 安装 go stress
 go install golang.org/x/tools/cmd/stress@latest
-# compile tests (you can add -race for race detection)
+# 编译测试（可以添加 -race 进行竞态检测）
 go test ./pkg/scheduler/preemption/ -c
-# it loops and reports failures
+# 循环运行并报告失败
 stress ./preemption.test -test.run TestPreemption
 ```
 
-## Running integration tests
+## 运行集成测试 {#running-integration-tests}
 
 ```shell
 make test-integration
 ```
 
-For running a subset of tests, see [Running subset of tests](#running-subset-of-integration-or-e2e-tests).
+关于运行测试子集，请参阅[运行测试子集](#running-subset-of-integration-or-e2e-tests)。
 
-## Running e2e tests using custom build
+## 使用自定义构建运行 e2e 测试 {#running-e2e-tests-using-custom-build}
 ```shell
 make kind-image-build
 make test-e2e
@@ -64,37 +64,37 @@ make test-e2e-kueueviz
 make test-multikueue-e2e
 ```
 
-You can specify the Kubernetes version used for running the e2e tests by setting the `E2E_K8S_FULL_VERSION` variable:
+你可以通过设置 `E2E_K8S_FULL_VERSION` 变量来指定用于运行 e2e 测试的 Kubernetes 版本：
 ```shell
 E2E_K8S_FULL_VERSION=1.33.1 make test-e2e
 ```
 
-For running a subset of tests, see [Running subset of tests](#running-subset-of-integration-or-e2e-tests).
+关于运行测试子集，请参阅 [运行测试子集](#running-subset-of-integration-or-e2e-tests)。
 
-## Increase logging verbosity
-You can change log level (for example, set -5 to increase verbosity) using `TEST_LOG_LEVEL` variables.
-By default, `TEST_LOG_LEVEL=-3`.
+## 增加日志详细程度 {#increase-logging-verbosity}
+你可以使用 `TEST_LOG_LEVEL` 变量更改日志级别（例如，设置 -5 来增加详细程度）。
+默认情况下，`TEST_LOG_LEVEL=-3`。
 
-## Debug tests in VSCode
-It is possible to debug unit and integration tests in VSCode.
-You need to have the [Go extension](https://marketplace.visualstudio.com/items?itemName=golang.Go) installed.
-Now you will have `run test | debug test` text buttons above lines like
+## 在 VSCode 中调试测试 {#debug-tests-in-vscode}
+可以在 VSCode 中调试单元测试和集成测试。
+你需要安装 [Go 扩展](https://marketplace.visualstudio.com/items?itemName=golang.Go)。
+现在你将在如下行上方看到 `run test | debug test` 文本按钮：
 ```go
 func TestValidateClusterQueue(t *testing.T) {
 ```
-You can click on the `debug test` to debug a specific test.
+你可以点击 `debug test` 来调试特定测试。
 
-For integration tests, an additional step is needed.  In settings.json, you need to add two variables inside `go.testEnvVars`:
-- Run `ENVTEST_K8S_VERSION=1.33 make envtest && ./bin/setup-envtest use $ENVTEST_K8S_VERSION -p path` and assign the path to the `KUBEBUILDER_ASSETS` variable
-- Set `KUEUE_BIN` to the `bin` directory within your cloned Kueue repository
+对于集成测试，需要额外的步骤。在 settings.json 中，你需要在 `go.testEnvVars` 内添加两个变量：
+- 运行 `ENVTEST_K8S_VERSION=1.33 make envtest && ./bin/setup-envtest use $ENVTEST_K8S_VERSION -p path` 并将路径分配给 `KUBEBUILDER_ASSETS` 变量
+- 将 `KUEUE_BIN` 设置为你的 Kueue 仓库克隆目录内的 `bin` 目录
 ```json
 "go.testEnvVars": {
-    "KUBEBUILDER_ASSETS": "<path from output above>",
-    "KUEUE_BIN": "<path-to-your-kueue-folder>/bin",
+    "KUBEBUILDER_ASSETS": "<上面输出的路径>",
+    "KUEUE_BIN": "<你的-kueue-文件夹路径>/bin",
   },
 ```
 
-For e2e tests, you can also use [Ginkgo Test Explorer](https://marketplace.visualstudio.com/items?itemName=joselitofilho.ginkgotestexplorer).  You need to add the following variables to settings.json:
+对于 e2e 测试，你也可以使用 [Ginkgo Test Explorer](https://marketplace.visualstudio.com/items?itemName=joselitofilho.ginkgotestexplorer)。你需要在 settings.json 中添加以下变量：
 ```json
  "ginkgotestexplorer.testEnvVars": {
         "KIND_CLUSTER_NAME": "kind",
@@ -104,79 +104,79 @@ For e2e tests, you can also use [Ginkgo Test Explorer](https://marketplace.visua
         "KIND": "<your_kueue_path>/bin/kind",
     },
 ```
-and then you can use GUI of the Ginkgo Test Explorer to run individual tests, provided you started kind clanter (see [here](#attaching-e2e-tests-to-an-existing-kind-cluster) for the instructions).
+然后你可以使用 Ginkgo Test Explorer 的 GUI 来运行单个测试，前提是你已经启动了 kind 集群（有关说明，请参阅[这里](#attaching-e2e-tests-to-an-existing-kind-cluster)）。
 
-## Attaching e2e tests to an existing kind cluster
-You can use the following approach to start up a kind cluster and then run e2e tests from commandline or VSCode,
-attaching them to the existing cluster. For example, suppose you want to test some of the multikueue-e2e tests.
+## 将 e2e 测试附加到现有的 kind 集群 {#attaching-e2e-tests-to-an-existing-kind-cluster}
+你可以使用以下方法来启动 kind 集群，然后从命令行或 VSCode 运行 e2e 测试，
+将它们附加到现有集群。例如，假设你想测试一些 multikueue-e2e 测试。
 
-Run `E2E_RUN_ONLY_ENV=true make kind-image-build test-multikueue-e2e` and wait for the `Press Enter to cleanup.` to appear.
+运行 `E2E_RUN_ONLY_ENV=true make kind-image-build test-multikueue-e2e` 并等待 `Press Enter to cleanup.` 出现。
 
-The cluster is ready, and now you can run tests from another terminal:
+集群已准备就绪，现在你可以从另一个终端运行测试：
 ```shell
 <your_kueue_path>/bin/ginkgo --json-report ./ginkgo.report -focus "MultiKueue when Creating a multikueue admission check Should run a jobSet on worker if admitted" -r
 ```
-or from VSCode.
+或从 VSCode 运行。
 
-## Running subset of integration or e2e tests
-### Use Ginkgo --focus arg
+## 运行集成或 e2e 测试子集 {#running-subset-of-integration-or-e2e-tests}
+### 使用 Ginkgo --focus 参数 {#use-ginkgo-focus-arg}
 ```shell
 GINKGO_ARGS="--focus=Scheduler" make test-integration
 GINKGO_ARGS="--focus=Creating a Pod requesting TAS" make test-e2e
 ```
-### Use ginkgo.FIt
-If you want to focus on specific tests, you can change
-`ginkgo.It` to `ginkgo.FIt` for these tests.
-For more details, see [here](https://onsi.github.io/ginkgo/#focused-specs).
-Then the other tests will be skipped.
-For example, you can change
+### 使用 ginkgo.FIt {#use-ginkgo-fit}
+如果你想专注于特定测试，可以将这些测试的
+`ginkgo.It` 更改为 `ginkgo.FIt`。
+有关更多详细信息，请参阅[这里](https://onsi.github.io/ginkgo/#focused-specs)。
+然后其他测试将被跳过。
+例如，你可以将
 ```go
 ginkgo.It("Should place pods based on the ranks-ordering", func() {
 ```
-to
+更改为
 ```go
 ginkgo.FIt("Should place pods based on the ranks-ordering", func() {
 ```
-and then run
+然后运行
 ```shell
-# build and pull image
+# 构建并拉取镜像
 make test-tas-e2e
 ```
-to test a particular TAS e2e test.
+来测试特定的 TAS e2e 测试。
 
-### Use INTEGRATION_TARGET
+### 使用 INTEGRATION_TARGET {#use-integration-target}
 ```shell
 INTEGRATION_TARGET='test/integration/singlecluster/scheduler' make test-integration
 ```
 
-## Flaky integration/e2e tests
-You can use --until-it-fails or --repeat=N arguments to Ginkgo to run tests repeatedly, such as:
+## 不稳定的集成/e2e 测试 {#flaky-integration-e2e-tests}
+你可以使用 --until-it-fails 或 --repeat=N 参数来让 Ginkgo 重复运行测试，例如：
 ```shell
 GINKGO_ARGS="--until-it-fails" make test-integration
 GINKGO_ARGS="--repeat=10" make test-e2e
 ```
-See more [here](https://onsi.github.io/ginkgo/#repeating-spec-runs-and-managing-flaky-specs)
+更多信息请参阅[这里](https://onsi.github.io/ginkgo/#repeating-spec-runs-and-managing-flaky-specs)
 
-### Adding stress
-You can run [stress](https://github.com/resurrecting-open-source-projects/stress) tool to increase CPU load during tests.  For example, if you're on Debian-based Linux:
+### 添加压力 {#adding-stress}
+你可以运行 [stress](https://github.com/resurrecting-open-source-projects/stress) 工具来在测试期间增加 CPU 负载。例如，如果你在基于 Debian 的 Linux 上：
 ```shell
-# install stress:
+# 安装 stress：
 sudo apt install stress
-# run stress alongside tests
+# 与测试一起运行 stress
 /usr/bin/stress --cpu 80
 ```
 
-### Analyzing logs
-Kueue runs as a regular pod on a worker node, and in e2e tests there are 2 replicas running.  The Kueue logs are located in `kind-worker/pods/kueue-system_kueue-controller-manager*/manager` and `kind-worker2/pods/kueue-system_kueue-controller-manager*/manager` folders.
+### 分析日志 {#analyzing-logs}
+Kueue 作为常规 pod 在 worker 节点上运行，在 e2e 测试中有 2 个副本在运行。Kueue 日志位于 `kind-worker/pods/kueue-system_kueue-controller-manager*/manager` 和 `kind-worker2/pods/kueue-system_kueue-controller-manager*/manager` 文件夹中。
 
-For each log message you can from which file and line the message is coming from:
+对于每条日志消息，你可以看到消息来自哪个文件和行：
 ```log
 2025-02-03T15:51:51.502425029Z stderr F 2025-02-03T15:51:51.502117824Z	LEVEL(-2)	cluster-queue-reconciler	core/clusterqueue_controller.go:341	ClusterQueue update event	{"clusterQueue": {"name":"cluster-queue"}}
 ```
-Here, it's `core/clusterqueue_controller.go:341`.
+这里，它是 `core/clusterqueue_controller.go:341`。
 
-### See also
-- [Kubernetes testing guide](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/testing.md)
-- [Integration Testing in Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/integration-tests.md)
-- [End-to-End Testing in Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/e2e-tests.md)
-- [Flaky Tests in Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/flaky-tests.md)
+### 另请参阅 {#see-also}
+- [Kubernetes 测试指南](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/testing.md)
+- [Kubernetes 中的集成测试](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/integration-tests.md)
+- [Kubernetes 中的端到端测试](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/e2e-tests.md)
+- [Kubernetes 中的不稳定测试](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-testing/flaky-tests.md)
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_localqueue.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_localqueue.md
index 81cba2d9e..7204a974a 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_localqueue.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_localqueue.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+传递 `describe localqueue` 给 kubectl
 
-
-Pass-through &#34;describe localqueue&#34; to kubectl
-
-```
+```shell
 kueuectl describe localqueue [flags]
 ```
 
-
-## Options
-
+## 选项  {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for localqueue</p>
+            <p>localqueue 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,13 @@ kueuectl describe localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl describe](../)	 - Show details of a resource
+* [kueuectl describe](../) - 显示资源的详细信息
 
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_resourceflavor.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_resourceflavor.md
index df1779cfa..4394ec080 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_resourceflavor.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_resourceflavor.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要  {#synopsis}
 
-## Synopsis
+传递 `describe resourceflavor` 给 kubectl
 
-
-Pass-through &#34;describe resourceflavor&#34; to kubectl
-
-```
+```shell
 kueuectl describe resourceflavor [flags]
 ```
 
-
-## Options
-
+## 选项  {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for resourceflavor</p>
+            <p>resourceflavor 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl describe resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl describe](../)	 - Show details of a resource
-
+* [kueuectl describe](../) - 显示资源的详细信息
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_workload.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_workload.md
index fd01e1d89..c59efc618 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_workload.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_describe/kueuectl_describe_workload.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+传递 `describe workload` 给 kubectl
 
-
-Pass-through &#34;describe workload&#34; to kubectl
-
-```
+```shell
 kueuectl describe workload [flags]
 ```
 
-
-## Options
-
+## 选项  {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for workload</p>
+            <p>workload 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl describe workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl describe](../)	 - Show details of a resource
-
+* [kueuectl describe](../) - 显示资源的详细信息
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/_index.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/_index.md
index e6084a7dd..1b6df5083 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/_index.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/_index.md
@@ -5,18 +5,11 @@ auto_generated: true
 no_list: true
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+编辑服务器上的资源
 
-
-Edit a resource on the server
-
-
-## Options
+## 选项 {#options}
 
 
 <table style="width: 100%; table-layout: fixed;">
@@ -31,7 +24,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for edit</p>
+            <p>edit 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
@@ -39,7 +32,8 @@ Edit a resource on the server
 
 
 
-## Options inherited from parent commands
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
+
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -52,7 +46,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -61,7 +55,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -70,7 +64,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -79,7 +73,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -88,7 +82,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -97,7 +91,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -106,7 +100,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -115,7 +109,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -124,7 +118,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -133,7 +127,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -142,7 +136,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -151,7 +145,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -160,7 +154,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -169,7 +163,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -178,7 +172,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -187,7 +181,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -196,7 +190,7 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -205,19 +199,17 @@ Edit a resource on the server
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl](../kueuectl/)	 - Controls Kueue queueing manager
-* [kueuectl edit clusterqueue](kueuectl_edit_clusterqueue/)	 - Pass-through &#34;edit clusterqueue&#34; to kubectl
-* [kueuectl edit localqueue](kueuectl_edit_localqueue/)	 - Pass-through &#34;edit localqueue&#34; to kubectl
-* [kueuectl edit resourceflavor](kueuectl_edit_resourceflavor/)	 - Pass-through &#34;edit resourceflavor&#34; to kubectl
-* [kueuectl edit workload](kueuectl_edit_workload/)	 - Pass-through &#34;edit workload&#34; to kubectl
+* [kueuectl](../kueuectl/) - 控制 Kueue 队列管理器
+* [kueuectl edit clusterqueue](kueuectl_edit_clusterqueue/) - 将 `edit clusterqueue` 透传给 kubectl
+* [kueuectl edit localqueue](kueuectl_edit_localqueue/) - 将 `edit localqueue` 透传给 kubectl
+* [kueuectl edit resourceflavor](kueuectl_edit_resourceflavor/) - 将 `edit resourceflavor` 传递给 kubectl
+* [kueuectl edit workload](kueuectl_edit_workload/) - 将 `edit workload` 透传给 kubectl
 
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_clusterqueue.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_clusterqueue.md
index 24d981ea1..6a9349088 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_clusterqueue.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_clusterqueue.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+将 `edit clusterqueue` 透传给 kubectl
 
-
-Pass-through &#34;edit clusterqueue&#34; to kubectl
-
-```
+```shell
 kueuectl edit clusterqueue [flags]
 ```
 
-
-## Options
-
+## 选项 {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for clusterqueue</p>
+            <p>clusterqueue 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl edit clusterqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl edit](../)	 - Edit a resource on the server
-
+* [kueuectl edit](../) - 编辑服务器上的资源
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_localqueue.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_localqueue.md
index 71d159e60..6d48e40df 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_localqueue.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_localqueue.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+将 `edit localqueue` 透传给 kubectl
 
-
-Pass-through &#34;edit localqueue&#34; to kubectl
-
-```
+```shell
 kueuectl edit localqueue [flags]
 ```
 
-
-## Options
-
+## 选项 {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for localqueue</p>
+            <p>localqueue 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl edit localqueue [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl edit](../)	 - Edit a resource on the server
-
+* [kueuectl edit](../) - 编辑服务器上的资源
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_resourceflavor.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_resourceflavor.md
index ecdd2d8c4..9ac188c58 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_resourceflavor.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_resourceflavor.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+将 `edit resourceflavor` 透传给 kubectl
 
-
-Pass-through &#34;edit resourceflavor&#34; to kubectl
-
-```
+```shell
 kueuectl edit resourceflavor [flags]
 ```
 
-
-## Options
-
+## 选项 {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for resourceflavor</p>
+            <p>resourceflavor 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl edit resourceflavor [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl edit](../)	 - Edit a resource on the server
-
+* [kueuectl edit](../) - 编辑服务器上的资源
diff --git a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_workload.md b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_workload.md
index a727414a8..96ce8a06f 100644
--- a/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_workload.md
+++ b/site/content/zh-CN/docs/reference/kubectl-kueue/commands/kueuectl_edit/kueuectl_edit_workload.md
@@ -5,23 +5,15 @@ auto_generated: true
 no_list: false
 ---
 
-<!--
-The file is auto-generated from the Go source code of the component using the
-[generator](https://github.com/kubernetes-sigs/kueue/tree/main/cmd/kueuectl-docs).
--->
+## 概要 {#synopsis}
 
-## Synopsis
+将 `edit workload` 透传给 kubectl
 
-
-Pass-through &#34;edit workload&#34; to kubectl
-
-```
+```shell
 kueuectl edit workload [flags]
 ```
 
-
-## Options
-
+## 选项 {#options}
 
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
@@ -35,15 +27,14 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>help for workload</p>
+            <p>workload 命令的帮助信息</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 从父命令继承的选项 {#options-inherited-from-parent-commands}
 
-
-## Options inherited from parent commands
 <table style="width: 100%; table-layout: fixed;">
     <colgroup>
         <col span="1" style="width: 10px;" />
@@ -56,7 +47,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Username to impersonate for the operation. User could be a regular user or a service account in a namespace.</p>
+            <p>为操作模拟的用户名。用户可以是普通用户或命名空间中的服务账户。</p>
         </td>
     </tr>
     <tr>
@@ -65,7 +56,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Group to impersonate for the operation, this flag can be repeated to specify multiple groups.</p>
+            <p>为操作模拟的组，此标志可以重复使用，以指定多个组。</p>
         </td>
     </tr>
     <tr>
@@ -74,7 +65,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>UID to impersonate for the operation.</p>
+            <p>为操作模拟的 UID。</p>
         </td>
     </tr>
     <tr>
@@ -83,7 +74,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Default cache directory</p>
+            <p>默认缓存目录</p>
         </td>
     </tr>
     <tr>
@@ -92,7 +83,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a cert file for the certificate authority</p>
+            <p>证书颁发机构证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -101,7 +92,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client certificate file for TLS</p>
+            <p>TLS 客户端证书文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -110,7 +101,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to a client key file for TLS</p>
+            <p>TLS 客户端密钥文件的路径</p>
         </td>
     </tr>
     <tr>
@@ -119,7 +110,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig cluster to use</p>
+            <p>要使用的 kubeconfig 集群的名称</p>
         </td>
     </tr>
     <tr>
@@ -128,7 +119,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig context to use</p>
+            <p>要使用的 kubeconfig 上下文的名称</p>
         </td>
     </tr>
     <tr>
@@ -137,7 +128,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, opt-out of response compression for all requests to the server</p>
+            <p>如果为 true，则取消对所有服务器请求的响应压缩</p>
         </td>
     </tr>
     <tr>
@@ -146,7 +137,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If true, the server&#39;s certificate will not be checked for validity. This will make your HTTPS connections insecure</p>
+            <p>如果为 true，将不检查服务器证书的有效性。这将使你的 HTTPS 连接不安全</p>
         </td>
     </tr>
     <tr>
@@ -155,7 +146,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Path to the kubeconfig file to use for CLI requests.</p>
+            <p>用于 CLI 请求的 kubeconfig 文件路径。</p>
         </td>
     </tr>
     <tr>
@@ -164,7 +155,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>If present, the namespace scope for this CLI request</p>
+            <p>如果存在，则为此次 CLI 请求的命名空间范围</p>
         </td>
     </tr>
     <tr>
@@ -173,7 +164,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don&#39;t timeout requests.</p>
+            <p>在放弃单个服务器请求之前要等待的时间长度。非零值应包含相应的时间单位（例如 1s、2m、3h）。零值意味着不要超时请求。</p>
         </td>
     </tr>
     <tr>
@@ -182,7 +173,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The address and port of the Kubernetes API server</p>
+            <p>Kubernetes API 服务器的地址和端口</p>
         </td>
     </tr>
     <tr>
@@ -191,7 +182,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Server name to use for server certificate validation. If it is not provided, the hostname used to contact the server is used</p>
+            <p>用于服务器证书验证的服务器名称。如果未提供，则使用联系服务器所用的主机名</p>
         </td>
     </tr>
     <tr>
@@ -200,7 +191,7 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>Bearer token for authentication to the API server</p>
+            <p>API 服务器身份验证所用的持有者令牌</p>
         </td>
     </tr>
     <tr>
@@ -209,15 +200,12 @@ kueuectl edit workload [flags]
     <tr>
         <td></td>
         <td style="line-height: 130%; word-wrap: break-word;">
-            <p>The name of the kubeconfig user to use</p>
+            <p>要使用的 kubeconfig 用户的名称</p>
         </td>
     </tr>
     </tbody>
 </table>
 
+## 参见
 
-
-## See Also
-
-* [kueuectl edit](../)	 - Edit a resource on the server
-
+* [kueuectl edit](../) - 编辑服务器上的资源
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/deployment.md b/site/content/zh-CN/docs/tasks/run/multikueue/deployment.md
index c3a166359..6c699cf07 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/deployment.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/deployment.md
@@ -1,29 +1,27 @@
 ---
-title: "Run Deployment in Multi-Cluster"
+title: "在多集群环境中运行 Deployment"
 linkTitle: "Deployment"
 weight: 2
 date: 2025-02-17
-description: >
-  Run a MultiKueue scheduled Deployment.
+description: 运行 MultiKueue 调度的 Deployment。
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-1. Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+1. 请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-2. Follow steps in [Run Plain Pods](/docs/tasks/run/plain_pods/#before-you-begin)
-to learn how to enable and configure the `pod` integration which is required for enabling the `deployment` integration.
+2. 按照[运行普通 Pod](/zh-CN/docs/tasks/run/plain_pods/#before-you-begin)的步骤，了解如何启用和配置 Pod 集成，这对于启用 Deployment 集成是必需的。
 
-Deployments receive live status updates through the status from the remote Pods created on the worker cluster.
+Deployment 会实时接收在工作集群创建的远程 Pod 的状态，并更新。
 
 {{< feature-state state="beta" for_version="v0.11.0" >}}
 
-{{% alert title="Note" color="primary" %}}
-In this current implementation, when Deployments are created in environments with multiple worker clusters, Pods are allocated to any worker.
+{{% alert title="注意" color="primary" %}}
+在当前实现中，当在有多个工作集群的环境中创建 Deployment 时，Pod 会被分配到任意工作集群。
 {{% /alert %}}
 
-## Example
+## 示例 {#examples}
 
-Once the setup is complete you can test it by running the example below:
+完成设置后，你可以通过运行以下示例进行测试：
 
 {{< include "examples/serving-workloads/sample-deployment.yaml" "yaml" >}}
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/job.md b/site/content/zh-CN/docs/tasks/run/multikueue/job.md
index a1a7e7f8e..ac40d8d67 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/job.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/job.md
@@ -1,47 +1,46 @@
 ---
-title: "Run Kubernetes Job in Multi-Cluster"
+title: "在多集群环境中运行 Job"
 linkTitle: "Kubernetes Job"
 weight: 2
 date: 2024-11-05
-description: >
-  Run a MultiKueue scheduled Kubernetes Job.
+description: 运行 MultiKueue 调度的 Kubernetes Job。
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-For the ease of setup and use we recommend using at least Kueue v0.8.1.
+为方便安装和使用，建议使用 Kueue v0.8.1 以上版本。
 
-The recommended way of running MultiKueue depends on the configuration of the `JobManagedBy` feature gate in your cluster. 
+运行 MultiKueue 的推荐方式取决于集群中 `JobManagedBy` 特性门控的配置。
 
-{{% alert title="Note" color="primary" %}}
-The `JobManagedBy` feature gate is disabled in 1.30 and 1.31 by default, and will be enabled in 1.32 by default.
+{{% alert title="注意" color="primary" %}}
+`JobManagedBy` 特性门控在 Kubernetes v1.30 和 v1.31 版本中默认禁用，在 v1.32 版本中默认启用。
 {{% /alert %}}
 
-### Cluster with JobManagedBy enabled
+### 集群启用 JobManagedBy {#cluster-with-jobmanagedby-enabled}
 
-When `JobManagedBy` is enabled in your cluster we recommend configuring Kueue to enable the `MultiKueueBatchJobWithManagedBy` feature gate. 
+当集群启用 `JobManagedBy` 时，建议配置 Kueue 启用 `MultiKueueBatchJobWithManagedBy` 特性门控。
 
-When `MultiKueueBatchJobWithManagedBy` is enabled, the current status of a Job being executed by MultiKueue on a worker cluster is live-updated on the management cluster.
+启用后，MultiKueue 在工作集群上执行的 Job 的当前状态会实时同步到管理集群。
 
-This gives the users and automation tools the ability to track the progress of Job status (.status) without lookup to the
-worker cluster, making MultiKueue transparent from that perspective.
+这样，用户和自动化工具可以在不访问工作集群的情况下，直接跟踪 Job 的状态（`.status`），
+从而实现 MultiKueue 的透明化。
 
-### Cluster with JobManagedBy disabled
+### 集群未启用 JobManagedBy {#cluster-with-jobmanagedby-disabled}
 
-When `JobManagedBy` is disabled in your cluster you should make sure `MultiKueueBatchJobWithManagedBy` is also disabled in Kueue. 
+当集群未启用 `JobManagedBy` 时，应确保 Kueue 也未启用 `MultiKueueBatchJobWithManagedBy`。
 
-This is important so that MultiKueue does not conflict with the build-in Job controller on the management cluster. 
+这样可以避免 MultiKueue 与管理集群上的内置 Job 控制器发生冲突。
 
-As a limitation of this deployment mode, to get the actual status of the job, you need to access the worker cluster.
+这种部署模式有一个缺点，你需要访问工作集群才能获取 Job 的实际状态。
 
-You can identify the worker cluster running the job by checking the AC status message of the workload object in the management cluster.
+你可以通过检查管理集群中工作负载对象的 AC 状态消息，辨别正在运行 Job 的工作集群。
 
-Also, the job is suspended from the perspective of the management cluster until it is `Finished`.
+此外，从管理集群的角度看，Job 在达到 `Finished` 之前，会一直处于挂起状态。
 
-## Example
+## 示例 {#examples}
 
-Once the setup is complete you can test it by running the example below:
+完成设置后，你可以通过运行以下示例进行测试：
 
 {{< include "examples/jobs/sample-job.yaml" "yaml" >}}
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/jobsets.md b/site/content/zh-CN/docs/tasks/run/multikueue/jobsets.md
index 7177cc639..6ad7d2bb1 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/jobsets.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/jobsets.md
@@ -1,22 +1,20 @@
 ---
-title: "Run Jobsets in Multi-Cluster"
+title: "在多集群环境中运行 Jobset"
 linkTitle: "Jobsets"
 weight: 3
 date: 2024-09-25
-description: >
-  Run a MultiKueue scheduled JobSet.
+description: 运行 MultiKueue 调度的 Jobset。
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-For the ease of setup and use we recommend using at least Kueue v0.8.1 and JobSet v0.6.0 (see [JobSet Installation](https://jobset.sigs.k8s.io/docs/installation/) for more details).
+为方便安装和使用，建议至少使用 Kueue v0.8.1 和 JobSet v0.6.0（更多详情见 [JobSet 安装文档](https://jobset.sigs.k8s.io/docs/installation/)）。
 
-## Run Jobsets example
+## 运行 Jobset 示例 {#run-jobsets-example}
 
-Once the setup is complete you can test it by running the [`jobset-sample.yaml`](/docs/tasks/run/jobsets/#example-jobset) Job. 
+完成设置后，你可以通过运行 [`jobset-sample.yaml`](/zh-CN/docs/tasks/run/jobsets/#example-jobset) Job 进行测试。
 
-In that setup, the `spec.managedBy` field is defaulted to `kueue.x-k8s.io/multikueue`
-automatically, if not specified, as long as  the `kueue.x-k8s.io/queue-name` annotation
-is specified and the corresponding Cluster Queue uses the Multi Kueue admission check.
\ No newline at end of file
+在该设置中，如果未显式指定 spec.managedBy 字段的取值，则取值自动默认为 `kueue.x-k8s.io/multikueue`。
+前提是已设置了 `kueue.x-k8s.io/queue-name` 注解，并且对应的 ClusterQueue 使用了 MultiKueue 的准入检查。
\ No newline at end of file
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/kubeflow.md b/site/content/zh-CN/docs/tasks/run/multikueue/kubeflow.md
index 1d7b18f46..49bceaf0e 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/kubeflow.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/kubeflow.md
@@ -1,44 +1,43 @@
 ---
-title: "Run Kubeflow Jobs in Multi-Cluster"
+title: "在多集群环境中运行 Kubeflow Job"
 linkTitle: "Kubeflow"
 weight: 4
 date: 2024-09-25
-description: >
-  Run a MultiKueue scheduled Kubeflow Jobs.
+description: 运行 MultiKueue 调度的 Kubeflow Job。
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-For the ease of setup and use we recommend using at least Kueue v0.11.0 and for Kubeflow Trainer at least v1.9.0.
+为方便安装和使用，建议使用 Kueue v0.11.0 和 Kubeflow Trainer v1.9.0 以上版本。
 
-See [Trainer Installation](https://www.kubeflow.org/docs/components/training/installation/#installing-the-training-operator) for installation and configuration details of Trainer.
+有关 Trainer 的安装和配置详情，请参见 [Trainer 安装文档](https://www.kubeflow.org/docs/components/training/installation/#installing-the-training-operator)。
 
-{{% alert title="Note" color="primary" %}}
-Before the [ManagedBy feature](https://github.com/kubeflow/trainer/issues/2193) was supported in Kueue (below v0.11.0), the installation of Kubeflow Trainer in the <b>Manager Cluster</b> must be limited to CRDs only.
+{{% alert title="注意" color="primary" %}}
+在 Kueue（低于 v0.11.0）支持 [ManagedBy 特性](https://github.com/kubeflow/trainer/issues/2193)之前，<b>管理集群</b>上的 Kubeflow Trainer 安装必须仅限于 CRD。
 
-To install the CRDs run:
+要安装 CRD，请运行：
 ```bash
 kubectl apply -k "github.com/kubeflow/trainer.git/manifests/base/crds?ref=v1.9.0"
 ```
 {{% /alert %}}
 
-## MultiKueue integration
+## MultiKueue 集成 {#multikueue-integration}
 
-Once the setup is complete you can test it by running one of the Kubeflow Jobs e.g. PyTorchJob [`sample-pytorchjob.yaml`](/docs/tasks/run/kubeflow/pytorchjobs/#sample-pytorchjob). 
+完成设置后，你可以通过运行其中一个 Kubeflow Job（如 PyTorchJob [`sample-pytorchjob.yaml`](/zh-CN/docs/tasks/run/kubeflow/pytorchjobs/#sample-pytorchjob)）进行测试。
 
-{{% alert title="Note" color="primary" %}}
-Note: Kueue defaults the `spec.runPolicy.managedBy` field to `kueue.x-k8s.io/multikueue` on the management cluster for all Kubeflow Jobs. 
+{{% alert title="注意" color="primary" %}}
+注意：Kueue 会在管理集群上的所有 Kubeflow Job 默认设置 `spec.runPolicy.managedBy` 字段为 `kueue.x-k8s.io/multikueue`。
 
-This allows the Trainer to ignore the Jobs managed by MultiKueue on the management cluster, and in particular skip Pod creation. 
+这使得 Trainer 能够忽略由 MultiKueue 管理的 Job，特别是跳过 Pod 的创建。
 
-The pods are created and the actual computation will happen on the mirror copy of the Job on the selected worker cluster. 
-The mirror copy of the Job does not have the field set.
+Pod 会在选定的工作集群上的 Job 镜像副本中被创建并实际运行。
+Job 镜像副本未设置此字段。
 {{% /alert %}}
 
-## Working alongside MPI Operator
-In order for MPI-operator and Trainer to work on the same cluster it is required that:
-1. `kubeflow.org_mpijobs.yaml` entry is removed from `base/crds/kustomization.yaml` - https://github.com/kubeflow/trainer/issues/1930
-2. Trainer deployment is modified to enable all kubeflow jobs except for MPI -  https://github.com/kubeflow/trainer/issues/1777
+## 与 MPI Operator 协同工作 {#working-alongside-mpi-operator}
+为了让 MPI-operator 和 Trainer 能在同一集群上工作，需要：
+1. 从 `base/crds/kustomization.yaml` 中移除 `kubeflow.org_mpijobs.yaml` - https://github.com/kubeflow/trainer/issues/1930
+2. 修改 Trainer 部署以启用除 MPI 以外的所有 Kubeflow Job -  https://github.com/kubeflow/trainer/issues/1777
   
\ No newline at end of file
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/kuberay.md b/site/content/zh-CN/docs/tasks/run/multikueue/kuberay.md
index c296bc532..0ce88536b 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/kuberay.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/kuberay.md
@@ -1,38 +1,39 @@
 ---
-title: "Run KubeRay Jobs in Multi-Cluster"
+title: "在多集群环境中运行 KubeRay Job"
 linkTitle: "KubeRay"
 weight: 4
 date: 2025-03-19
-description: >
-  Run a MultiKueue scheduled KubeRay Jobs.
+description: 在多集群环境中运行 KubeRay Job
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-For the ease of setup and use we recommend using at least Kueue v0.11.0 and for KubeRay Operator at least v1.3.1.
+为方便安装和使用，建议至少使用 Kueue v0.11.0 及 KubeRay Operator v1.3.1 及以上版本。
 
-See [KubeRay Operator Installation](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/raycluster-quick-start.html#step-2-deploy-a-kuberay-operator) for installation and configuration details of KubeRay Operator.
+有关 KubeRay Operator 的安装和配置详情，
+请参见 [KubeRay Operator 安装文档](https://docs.ray.io/en/latest/cluster/kubernetes/getting-started/raycluster-quick-start.html#step-2-deploy-a-kuberay-operator)。
 
-{{% alert title="Note" color="primary" %}}
-Before the [ManagedBy feature](https://github.com/ray-project/kuberay/issues/2544) was supported in Kueue (below v0.11.0), the installation of KubeRay Operator in the <b>Manager Cluster</b> must be limited to CRDs only.
+{{% alert title="注意" color="primary" %}}
+在 Kueue（低于 v0.11.0）支持 [ManagedBy 特性](https://github.com/ray-project/kuberay/issues/2544)之前，
+<b>管理集群</b>上的 KubeRay Operator 安装必须仅限于 CRD。
 
-To install the CRDs run:
+要安装 CRD，请运行：
 ```bash
 kubectl create -k "github.com/ray-project/kuberay/ray-operator/config/crd?ref=v1.3.0"
 ```
 {{% /alert %}}
 
-## MultiKueue integration
+## MultiKueue 集成 {#multikueue-integration}
 
-Once the setup is complete you can test it by running a RayJob [`ray-job-sample.yaml`](/docs/tasks/run/rayjobs/#example-rayjob).
+完成设置后，你可以通过运行 RayJob [`ray-job-sample.yaml`](/zh-CN/docs/tasks/run/rayjobs/#example-rayjob)进行测试。
 
-{{% alert title="Note" color="primary" %}}
-Note: Kueue defaults the `spec.managedBy` field to `kueue.x-k8s.io/multikueue` on the management cluster for KubeRay Jobs (RayJob, RayCluster, RayService). 
+{{% alert title="注意" color="primary" %}}
+注意：Kueue 会在管理集群上的 KubeRay Job（RayJob、RayCluster、RayService）默认设置 `spec.managedBy` 字段为 `kueue.x-k8s.io/multikueue`。
 
-This allows the KubeRay Operator to ignore the Jobs managed by MultiKueue on the management cluster, and in particular skip Pod creation. 
+这使得 KubeRay Operator 能够忽略由 MultiKueue 管理的 Job，特别是跳过 Pod 的创建。
 
-The pods are created and the actual computation will happen on the mirror copy of the Job on the selected worker cluster. 
-The mirror copy of the Job does not have the field set.
+Pod 会在选定的工作集群上的 Job 镜像副本中被创建并实际运行。
+Job 镜像副本未设置此字段。
 {{% /alert %}}
diff --git a/site/content/zh-CN/docs/tasks/run/multikueue/plain_pods.md b/site/content/zh-CN/docs/tasks/run/multikueue/plain_pods.md
index ea1f93f28..a0cff9a13 100644
--- a/site/content/zh-CN/docs/tasks/run/multikueue/plain_pods.md
+++ b/site/content/zh-CN/docs/tasks/run/multikueue/plain_pods.md
@@ -1,29 +1,29 @@
 ---
-title: "Run Plain Pod in Multi-Cluster"
+title: "在多集群环境中运行普通 Pod"
 linkTitle: "Plain Pod"
 weight: 2
 date: 2025-02-17
-description: >
-  Run a MultiKueue scheduled Plain Pod.
+description: 在多集群环境中运行普通 Pod
+
 ---
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-1. Check the [MultiKueue installation guide](/docs/tasks/manage/setup_multikueue) on how to properly setup MultiKueue clusters.
+1. 请查阅 [MultiKueue 安装指南](/zh-CN/docs/tasks/manage/setup_multikueue)了解如何正确设置 MultiKueue 集群。
 
-2. Follow steps in [Run Plain Pods](/docs/tasks/run/plain_pods/#before-you-begin)
-to learn how to enable and configure the `pod` integration.
+2. 按照[运行 Plain Pod](/zh-CN/docs/tasks/run/plain_pods/#before-you-begin)的步骤，
+   了解如何启用和配置 `pod` 集成。
 
-Pods created on the manager cluster are automatically gated and receive live status updates from their remote counterparts
+在管理集群上创建的 Pod 会自动被管控，并实时接收来自远程副本的状态更新。
 
 {{< feature-state state="beta" for_version="v0.11.0" >}}
 
-## Example
+## 示例 {#examples}
 
-Once the setup is complete you can test it by running the examples below:
+完成设置后，你可以通过运行以下示例进行测试：
 
-1. Single plain pod
+1. 单个普通 Pod
 {{< include "examples/pods-kueue/kueue-pod.yaml" "yaml" >}}
 
-2. Group of pods
+2. Pod 组
 {{< include "examples/pods-kueue/kueue-pod-group.yaml" "yaml" >}}
\ No newline at end of file
diff --git a/site/content/zh-CN/docs/tasks/run/statefulset.md b/site/content/zh-CN/docs/tasks/run/statefulset.md
index 7261469a9..a008ec654 100644
--- a/site/content/zh-CN/docs/tasks/run/statefulset.md
+++ b/site/content/zh-CN/docs/tasks/run/statefulset.md
@@ -1,27 +1,24 @@
 ---
-title: "Run StatefulSet"
+title: "运行 StatefulSet"
 linkTitle: "StatefulSet"
 date: 2024-07-25
 weight: 6
-description: >
-  Run a StatefulSet as a Kueue-managed workload.
+description: 将 StatefulSet 作为 Kueue 管理的工作负载运行。
 ---
 
-This page shows how to leverage Kueue's scheduling and resource management
-capabilities when running StatefulSets.
+本页面展示了如何利用 Kueue 的调度和服务资源管理能力来运行 StatefulSet。
 
-We demonstrate how to support scheduling StatefulSets in Kueue based on the
-[Plain Pod Group](https://kueue.sigs.k8s.io/docs/tasks/run/plain_pods/) integration,
-where StatefulSet is represented as a single independent workload.
+我们演示了如何支持基于 [Plain Pod Group](https://kueue.sigs.k8s.io/docs/tasks/run/plain_pods/)
+集成来调度 StatefulSet，其中 StatefulSet 被表示为一个独立的负载。
 
-This guide is for [serving users](/docs/tasks#serving-user) that have a basic understanding of Kueue.
-For more information, see [Kueue's overview](/docs/overview).
+本指南适用于[服务用户](/zh-CN/docs/tasks#serving-user)他们具有基本的 Kueue 理解。
+更多信息，请参见 [Kueue 概览](/zh-CN/docs/overview)。
 
-## Before you begin
+## 开始之前 {#before-you-begin}
 
-1. Learn how to [install Kueue with a custom manager configuration](/docs/installation/#install-a-custom-configured-released-version).
+1. 学习如何[安装 Kueue 并配置自定义管理器版本](/zh-CN/docs/installation/#install-a-custom-configured-released-version)。
 
-2. Ensure that you have the v1/statefulset integration enabled, for example:
+2. 确保你启用了 v1/statefulset 集成，例如：
    ```yaml
    apiVersion: config.kueue.x-k8s.io/v1beta1
    kind: Configuration
@@ -30,18 +27,18 @@ For more information, see [Kueue's overview](/docs/overview).
       - "pod" # required by statefulset
       - "statefulset"
    ```
-   Also, follow steps in [Run Plain Pods](/docs/tasks/run/plain_pods/#before-you-begin)
-   to learn how to enable and configure the `pod` integration.
+   同时，请参见[运行 Plain Pod](/zh-CN/docs/tasks/run/plain_pods/#before-you-begin)
+   了解如何启用和配置 `pod` 集成。
 
-3. Check [Administer cluster quotas](/docs/tasks/manage/administer_cluster_quotas) for details on the initial Kueue setup.
+3. 检查[管理集群配额](/zh-CN/docs/tasks/manage/administer_cluster_quotas)了解初始 Kueue 设置的详细信息。
 
-## Running a StatefulSet admitted by Kueue
+## 运行被 Kueue 调度的 StatefulSet {#running-a-statefulset-admitted-by-kueue}
 
-When running a StatefulSet on Kueue, take into consideration the following aspects:
+在运行 StatefulSet 时，请考虑以下方面：
 
-### a. Queue selection
+### a. 队列选择 {#a-queue-selection}
 
-The target [local queue](/docs/concepts/local_queue) should be specified in the `metadata.labels` section of the StatefulSet configuration.
+目标[本地队列](/zh-CN/docs/concepts/local_queue)应在 StatefulSet 配置的 `metadata.labels` 部分指定。
 
 ```yaml
 metadata:
@@ -49,8 +46,8 @@ metadata:
       kueue.x-k8s.io/queue-name: user-queue
 ```
 
-### b. Configure the resource needs
-The resource needs of the workload can be configured in the `spec.template.spec.containers`.
+### b. 配置资源需求 {#b-configure-the-resource-needs}
+工作负载的资源需求可以在 `spec.template.spec.containers` 中配置。
 
 ```yaml
 spec:
@@ -62,17 +59,17 @@ spec:
              cpu: 3
 ```
 
-### c. Scaling
+### c. 扩缩 {#c-scaling}
 
-Currently, scaling operations on StatefulSets are not supported.
-This means you cannot perform scale up or scale down operations directly through Kueue.
+目前，StatefulSet 的扩缩操作不受支持。
+这意味着你不能直接通过 Kueue 执行扩缩容操作。
 
-## Example
-Here is a sample StatefulSet:
+## 示例 {#examples}
+以下是一个 StatefulSet 的示例：
 
 {{< include "examples/serving-workloads/sample-statefulset.yaml" "yaml" >}}
 
-You can create the StatefulSet using the following command:
+你可以使用以下命令创建 StatefulSet：
 
 ```sh
 kubectl create -f sample-statefulset.yaml



Test patch:
diff --git a/pkg/controller/core/workload_controller_test.go b/pkg/controller/core/workload_controller_test.go
index 13130afa6..b69709c23 100644
--- a/pkg/controller/core/workload_controller_test.go
+++ b/pkg/controller/core/workload_controller_test.go
@@ -677,7 +677,7 @@ func TestReconcile(t *testing.T) {
 				).
 				SchedulingStatsEviction(
 					kueue.WorkloadSchedulingStatsEviction{
-						Reason: kueue.WorkloadDeactivated,
+						Reason: "DeactivatedDueToAdmissionCheck",
 						Count:  1,
 					},
 				).
@@ -1344,7 +1344,7 @@ func TestReconcile(t *testing.T) {
 					Message: "exceeding the maximum number of re-queuing retries",
 				}).
 				SchedulingStatsEviction(
-					kueue.WorkloadSchedulingStatsEviction{Reason: kueue.WorkloadDeactivated, Count: 1},
+					kueue.WorkloadSchedulingStatsEviction{Reason: "DeactivatedDueToRequeuingLimitExceeded", Count: 1},
 				).
 				Obj(),
 			wantEvents: []utiltesting.EventRecord{
@@ -1408,7 +1408,7 @@ func TestReconcile(t *testing.T) {
 				}).
 				SchedulingStatsEviction(
 					kueue.WorkloadSchedulingStatsEviction{
-						Reason: kueue.WorkloadDeactivated,
+						Reason: "DeactivatedDueToRequeuingLimitExceeded",
 						Count:  1,
 					},
 				).
@@ -1477,7 +1477,7 @@ func TestReconcile(t *testing.T) {
 				RequeueState(ptr.To[int32](100), nil).
 				SchedulingStatsEviction(
 					kueue.WorkloadSchedulingStatsEviction{
-						Reason: kueue.WorkloadDeactivated,
+						Reason: "DeactivatedDueToRequeuingLimitExceeded",
 						Count:  1,
 					},
 				).
@@ -1546,7 +1546,7 @@ func TestReconcile(t *testing.T) {
 				RequeueState(ptr.To[int32](100), nil).
 				SchedulingStatsEviction(
 					kueue.WorkloadSchedulingStatsEviction{
-						Reason: kueue.WorkloadDeactivated,
+						Reason: "DeactivatedDueToRequeuingLimitExceeded",
 						Count:  1,
 					},
 				).
@@ -1640,6 +1640,12 @@ func TestReconcile(t *testing.T) {
 					Reason:  kueue.WorkloadEvictedByLocalQueueStopped,
 					Message: "The LocalQueue is stopped",
 				}).
+				SchedulingStatsEviction(
+					kueue.WorkloadSchedulingStatsEviction{
+						Reason: kueue.WorkloadEvictedByLocalQueueStopped,
+						Count:  1,
+					},
+				).
 				Obj(),
 			wantEvents: []utiltesting.EventRecord{
 				{
diff --git a/pkg/controller/tas/node_failure_controller_test.go b/pkg/controller/tas/node_failure_controller_test.go
index d9dd43a93..b012fa5ba 100644
--- a/pkg/controller/tas/node_failure_controller_test.go
+++ b/pkg/controller/tas/node_failure_controller_test.go
@@ -84,6 +84,11 @@ func TestNodeFailureReconciler(t *testing.T) {
 		Admitted(true).
 		Obj()
 
+	workloadWithAnnotation := baseWorkload.DeepCopy()
+	workloadWithAnnotation.Annotations = map[string]string{
+		kueuealpha.NodeToReplaceAnnotation: nodeName,
+	}
+
 	workloadWithTwoNodes := utiltesting.MakeWorkload(wlName, nsName).
 		Finalizers(kueue.ResourceInUseFinalizerName).
 		PodSets(*utiltesting.MakePodSet(kueue.DefaultPodSetName, 2).Request(corev1.ResourceCPU, "1").Obj()).
@@ -148,6 +153,16 @@ func TestNodeFailureReconciler(t *testing.T) {
 			reconcileRequests: []reconcile.Request{{NamespacedName: types.NamespacedName{Name: nodeName}}},
 			wantFailedNode:    "",
 		},
+		"Node becomes healthy, annotation is removed": {
+			initObjs: []client.Object{
+				newNodeTest(nodeName, corev1.ConditionTrue, fakeClock, time.Duration(0)),
+				workloadWithAnnotation.DeepCopy(),
+				basePod.DeepCopy(),
+			},
+			reconcileRequests: []reconcile.Request{{NamespacedName: types.NamespacedName{Name: nodeName}}},
+			wantFailedNode:    "",
+		},
+
 		"Node Found and Unhealthy (NotReady), delay not passed - not marked as unavailable": {
 			initObjs: []client.Object{
 				newNodeTest(nodeName, corev1.ConditionFalse, fakeClock, time.Duration(0)),
diff --git a/pkg/scheduler/preemption/preemption_test.go b/pkg/scheduler/preemption/preemption_test.go
index 94583eed8..66dc406f5 100644
--- a/pkg/scheduler/preemption/preemption_test.go
+++ b/pkg/scheduler/preemption/preemption_test.go
@@ -2894,12 +2894,13 @@ func TestCandidatesOrdering(t *testing.T) {
 			enableFeatureGates: []featuregate.Feature{features.AdmissionFairSharing},
 		}}
 
+	_, log := utiltesting.ContextWithLog(t)
 	for _, tc := range cases {
 		for _, gate := range tc.enableFeatureGates {
 			features.SetFeatureGateDuringTest(t, gate, true)
 		}
 		sort.Slice(tc.candidates, func(i int, j int) bool {
-			return CandidatesOrdering(&tc.candidates[i], &tc.candidates[j], kueue.ClusterQueueReference(preemptorCq), now)
+			return CandidatesOrdering(log, &tc.candidates[i], &tc.candidates[j], kueue.ClusterQueueReference(preemptorCq), now)
 		})
 		got := slices.Map(tc.candidates, func(c *workload.Info) workload.Reference {
 			return workload.Reference(c.Obj.Name)
diff --git a/test/e2e/certmanager/metrics_test.go b/test/e2e/certmanager/metrics_test.go
index 45049f60a..29e674753 100644
--- a/test/e2e/certmanager/metrics_test.go
+++ b/test/e2e/certmanager/metrics_test.go
@@ -36,7 +36,7 @@ const (
 	serviceAccountName           = "kueue-controller-manager"
 	metricsReaderClusterRoleName = "kueue-metrics-reader"
 	metricsServiceName           = "kueue-controller-manager-metrics-service"
-	certSecretName               = "metrics-server-cert"
+	certSecretName               = "kueue-metrics-server-cert"
 	certMountPath                = "/etc/kueue/metrics/certs"
 )
 
@@ -101,7 +101,7 @@ var _ = ginkgo.Describe("Metrics", ginkgo.Ordered, func() {
 		}
 		util.MustCreate(ctx, k8sClient, curlPod)
 
-		ginkgo.By("Waiting for metrics-server-cert secret", func() {
+		ginkgo.By("Waiting for kueue-metrics-server-cert secret", func() {
 			gomega.Eventually(func(g gomega.Gomega) {
 				secret := &corev1.Secret{}
 				g.Expect(k8sClient.Get(ctx, client.ObjectKey{
diff --git a/test/e2e/config/certmanager/dev/kustomization.yaml b/test/e2e/config/certmanager/dev/kustomization.yaml
new file mode 100644
index 000000000..063319fea
--- /dev/null
+++ b/test/e2e/config/certmanager/dev/kustomization.yaml
@@ -0,0 +1,7 @@
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+namePrefix: kueue-
+
+resources:
+- ../../../../../config/components/certmanager
diff --git a/test/e2e/config/certmanager/kustomization.yaml b/test/e2e/config/certmanager/kustomization.yaml
index 3f0ab8c0e..66a3060ac 100644
--- a/test/e2e/config/certmanager/kustomization.yaml
+++ b/test/e2e/config/certmanager/kustomization.yaml
@@ -4,7 +4,7 @@ kind: Kustomization
 namespace: kueue-system
 
 resources:
-- ../../../../config/components/certmanager
+- ./dev
 - ../../../../config/dev
 
 transformers:
diff --git a/test/e2e/multikueue/e2e_test.go b/test/e2e/multikueue/e2e_test.go
index 0e07d26aa..f85e849c4 100644
--- a/test/e2e/multikueue/e2e_test.go
+++ b/test/e2e/multikueue/e2e_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package mke2e
 
 import (
+	"context"
 	"fmt"
 	"os/exec"
 	"regexp"
@@ -176,12 +177,12 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 		util.ExpectObjectToBeDeleted(ctx, k8sWorker2Client, worker2Cq, true)
 		util.ExpectObjectToBeDeleted(ctx, k8sWorker2Client, worker2Flavor, true)
 
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, managerCq, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, managerFlavor, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, multiKueueAc, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, multiKueueConfig, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, workerCluster1, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, workerCluster2, true)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, managerCq, true, util.LongTimeout)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, managerFlavor, true, util.LongTimeout)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, multiKueueAc, true, util.LongTimeout)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, multiKueueConfig, true, util.LongTimeout)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, workerCluster1, true, util.LongTimeout)
+		util.ExpectObjectToBeDeletedWithTimeout(ctx, k8sManagerClient, workerCluster2, true, util.LongTimeout)
 
 		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sManagerClient, managerNs)
 		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sWorker1Client, worker1Ns)
@@ -192,8 +193,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 		ginkgo.It("Should create a pod on worker if admitted", func() {
 			pod := testingpod.MakePod("pod", managerNs.Name).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
-				RequestAndLimit("cpu", "1").
-				RequestAndLimit("memory", "2G").
+				RequestAndLimit(corev1.ResourceCPU, "1").
+				RequestAndLimit(corev1.ResourceMemory, "2G").
 				Queue(managerLq.Name).
 				Obj()
 			// Since it requires 2G of memory, this pod can only be admitted in worker 2.
@@ -437,8 +438,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			// Since it requires 2G of memory, this job can only be admitted in worker 2.
 			job := testingjob.MakeJob("job", managerNs.Name).
 				Queue(kueue.LocalQueueName(managerLq.Name)).
-				RequestAndLimit("cpu", "1").
-				RequestAndLimit("memory", "2G").
+				RequestAndLimit(corev1.ResourceCPU, "1").
+				RequestAndLimit(corev1.ResourceMemory, "2G").
 				TerminationGracePeriod(1).
 				// Give it the time to be observed Active in the live status update step.
 				Image(util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
@@ -497,14 +498,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the job is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerJob := &batchv1.Job{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(job), workerJob)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(job), workerJob)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				expectObjectToBeDeletedOnWorkerClusters(ctx, createdLeaderWorkload)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, job)
 
 				createdJob := &batchv1.Job{}
 				gomega.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
@@ -531,8 +526,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 						Args: util.BehaviorWaitForDeletion,
 					},
 				).
-				RequestAndLimit("replicated-job-1", "cpu", "500m").
-				RequestAndLimit("replicated-job-1", "memory", "200M").
+				RequestAndLimit("replicated-job-1", corev1.ResourceCPU, "500m").
+				RequestAndLimit("replicated-job-1", corev1.ResourceMemory, "200M").
 				Obj()
 
 			ginkgo.By("Creating the jobSet", func() {
@@ -541,24 +536,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 
 			createdLeaderWorkload := &kueue.Workload{}
 			wlLookupKey := types.NamespacedName{Name: workloadjobset.GetWorkloadNameForJobSet(jobSet.Name, jobSet.UID), Namespace: managerNs.Name}
-
-			// the execution should be given to the worker
-			ginkgo.By("Waiting to be admitted in worker1 and manager", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					g.Expect(k8sManagerClient.Get(ctx, wlLookupKey, createdLeaderWorkload)).To(gomega.Succeed())
-					g.Expect(workload.FindAdmissionCheck(createdLeaderWorkload.Status.AdmissionChecks, kueue.AdmissionCheckReference(multiKueueAc.Name))).To(gomega.BeComparableTo(&kueue.AdmissionCheckState{
-						Name:    kueue.AdmissionCheckReference(multiKueueAc.Name),
-						State:   kueue.CheckStateReady,
-						Message: `The workload got reservation on "worker1"`,
-					}, cmpopts.IgnoreFields(kueue.AdmissionCheckState{}, "LastTransitionTime")))
-					g.Expect(apimeta.FindStatusCondition(createdLeaderWorkload.Status.Conditions, kueue.WorkloadAdmitted)).To(gomega.BeComparableTo(&metav1.Condition{
-						Type:    kueue.WorkloadAdmitted,
-						Status:  metav1.ConditionTrue,
-						Reason:  "Admitted",
-						Message: "The workload is admitted",
-					}, util.IgnoreConditionTimestampsAndObservedGeneration))
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
-			})
+			// the execution should be given to the worker1
+			waitForJobAdmitted(wlLookupKey, multiKueueAc.Name, "worker1")
 
 			ginkgo.By("Waiting for the jobSet to get status updates", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
@@ -594,14 +573,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the jobSet is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerJobSet := &jobset.JobSet{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(jobSet), workerJobSet)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(jobSet), workerJobSet)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				expectObjectToBeDeletedOnWorkerClusters(ctx, createdLeaderWorkload)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, jobSet)
 
 				createdJobSet := &jobset.JobSet{}
 				gomega.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(jobSet), createdJobSet)).To(gomega.Succeed())
@@ -671,14 +644,8 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the appwrapper is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerAppWrapper := &awv1beta2.AppWrapper{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(aw), workerAppWrapper)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(aw), workerAppWrapper)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				expectObjectToBeDeletedOnWorkerClusters(ctx, createdWorkload)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, aw)
 
 				createdAppWrapper := &awv1beta2.AppWrapper{}
 				gomega.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(aw), createdAppWrapper)).To(gomega.Succeed())
@@ -739,14 +706,14 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the PyTorchJob is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerPyTorchJob := &kftraining.PyTorchJob{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(pyTorchJob), workerPyTorchJob)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(pyTorchJob), workerPyTorchJob)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				wl := &kueue.Workload{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      wlLookupKey.Name,
+						Namespace: wlLookupKey.Namespace,
+					},
+				}
+				expectObjectToBeDeletedOnWorkerClusters(ctx, wl)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, pyTorchJob)
 			})
 		})
 
@@ -801,14 +768,14 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the MPIJob is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerMPIJob := &kfmpi.MPIJob{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(mpijob), workerMPIJob)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(mpijob), workerMPIJob)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				wl := &kueue.Workload{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      wlLookupKey.Name,
+						Namespace: wlLookupKey.Namespace,
+					},
+				}
+				expectObjectToBeDeletedOnWorkerClusters(ctx, wl)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, mpijob)
 			})
 		})
 
@@ -845,14 +812,14 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 
 			ginkgo.By("Checking no objects are left in the worker clusters and the RayJob is completed", func() {
-				gomega.Eventually(func(g gomega.Gomega) {
-					workerWl := &kueue.Workload{}
-					g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-					workerRayJob := &rayv1.RayJob{}
-					g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(rayjob), workerRayJob)).To(utiltesting.BeNotFoundError())
-					g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(rayjob), workerRayJob)).To(utiltesting.BeNotFoundError())
-				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+				wl := &kueue.Workload{
+					ObjectMeta: metav1.ObjectMeta{
+						Name:      wlLookupKey.Name,
+						Namespace: wlLookupKey.Namespace,
+					},
+				}
+				expectObjectToBeDeletedOnWorkerClusters(ctx, wl)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, rayjob)
 			})
 		})
 
@@ -887,6 +854,106 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 			})
 		})
 	})
+
+	ginkgo.When("Incremental mode", ginkgo.Ordered, func() {
+		var defaultManagerKueueCfg *kueueconfig.Configuration
+
+		ginkgo.BeforeAll(func() {
+			ginkgo.By("setting MultiKueue Dispatcher to Incremental", func() {
+				defaultManagerKueueCfg = util.GetKueueConfiguration(ctx, k8sManagerClient)
+				newCfg := defaultManagerKueueCfg.DeepCopy()
+				util.UpdateKueueConfiguration(ctx, k8sManagerClient, newCfg, managerClusterName, func(cfg *kueueconfig.Configuration) {
+					if cfg.MultiKueue == nil {
+						cfg.MultiKueue = &kueueconfig.MultiKueue{}
+					}
+					cfg.MultiKueue.DispatcherName = ptr.To(kueueconfig.MultiKueueDispatcherModeIncremental)
+				})
+			})
+		})
+		ginkgo.AfterAll(func() {
+			ginkgo.By("setting MultiKueue Dispatcher back to AllAtOnce", func() {
+				util.ApplyKueueConfiguration(ctx, k8sManagerClient, defaultManagerKueueCfg)
+				util.RestartKueueController(ctx, k8sManagerClient, managerClusterName)
+			})
+		})
+		ginkgo.It("Should run a job on worker if admitted", func() {
+			// Since it requires 2G of memory, this job can only be admitted in worker 2.
+			job := testingjob.MakeJob("job", managerNs.Name).
+				Queue(kueue.LocalQueueName(managerLq.Name)).
+				RequestAndLimit(corev1.ResourceCPU, "1").
+				RequestAndLimit(corev1.ResourceMemory, "2G").
+				TerminationGracePeriod(1).
+				// Give it the time to be observed Active in the live status update step.
+				Image(util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
+				Obj()
+
+			ginkgo.By("Creating the job", func() {
+				util.MustCreate(ctx, k8sManagerClient, job)
+				gomega.Eventually(func(g gomega.Gomega) {
+					createdJob := &batchv1.Job{}
+					g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
+					g.Expect(ptr.Deref(createdJob.Spec.ManagedBy, "")).To(gomega.BeEquivalentTo(kueue.MultiKueueControllerName))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+			createdLeaderWorkload := &kueue.Workload{}
+			wlLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(job.Name, job.UID), Namespace: managerNs.Name}
+			// the execution should be given to the worker
+			ginkgo.By("Waiting to be admitted in worker2, and the manager's job unsuspended", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sManagerClient.Get(ctx, wlLookupKey, createdLeaderWorkload)).To(gomega.Succeed())
+					g.Expect(workload.FindAdmissionCheck(createdLeaderWorkload.Status.AdmissionChecks, kueue.AdmissionCheckReference(multiKueueAc.Name))).To(gomega.BeComparableTo(&kueue.AdmissionCheckState{
+						Name:    kueue.AdmissionCheckReference(multiKueueAc.Name),
+						State:   kueue.CheckStateReady,
+						Message: `The workload got reservation on "worker2"`,
+					}, cmpopts.IgnoreFields(kueue.AdmissionCheckState{}, "LastTransitionTime")))
+					g.Expect(ptr.Deref(createdLeaderWorkload.Status.ClusterName, "")).To(gomega.Equal(workerCluster2.Name))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+				gomega.Eventually(func(g gomega.Gomega) {
+					createdJob := &batchv1.Job{}
+					g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
+					g.Expect(ptr.Deref(createdJob.Spec.Suspend, false)).To(gomega.BeFalse())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Waiting for the job to get status updates", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					createdJob := batchv1.Job{}
+					g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), &createdJob)).To(gomega.Succeed())
+					g.Expect(createdJob.Status.StartTime).NotTo(gomega.BeNil())
+					g.Expect(createdJob.Status.Active).To(gomega.Equal(int32(1)))
+					g.Expect(createdJob.Status.CompletionTime).To(gomega.BeNil())
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Finishing the job's pod", func() {
+				listOpts := util.GetListOptsFromLabel(fmt.Sprintf("batch.kubernetes.io/job-name=%s", job.Name))
+				util.WaitForActivePodsAndTerminate(ctx, k8sWorker2Client, worker2RestClient, worker2Cfg, job.Namespace, 1, 0, listOpts)
+			})
+
+			ginkgo.By("Waiting for the job to finish", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sManagerClient.Get(ctx, wlLookupKey, createdLeaderWorkload)).To(gomega.Succeed())
+					g.Expect(createdLeaderWorkload.Status.Conditions).To(utiltesting.HaveConditionStatusTrueAndReason(kueue.WorkloadFinished, kueue.WorkloadFinishedReasonSucceeded))
+				}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking no objects are left in the worker clusters and the job is completed", func() {
+				expectObjectToBeDeletedOnWorkerClusters(ctx, createdLeaderWorkload)
+				expectObjectToBeDeletedOnWorkerClusters(ctx, job)
+
+				createdJob := &batchv1.Job{}
+				gomega.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
+				gomega.Expect(createdJob.Status.Conditions).To(gomega.ContainElement(gomega.BeComparableTo(
+					batchv1.JobCondition{
+						Type:   batchv1.JobComplete,
+						Status: corev1.ConditionTrue,
+					},
+					cmpopts.IgnoreFields(batchv1.JobCondition{}, "LastTransitionTime", "LastProbeTime", "Reason", "Message"))))
+			})
+		})
+	})
+
 	ginkgo.When("The connection to a worker cluster is unreliable", func() {
 		ginkgo.It("Should update the cluster status to reflect the connection state", func() {
 			worker1Cq2 := utiltesting.MakeClusterQueue("q2").
@@ -959,221 +1026,6 @@ var _ = ginkgo.Describe("MultiKueue", func() {
 	})
 })
 
-var _ = ginkgo.Describe("MultiKueue with Incremental mode", ginkgo.Ordered, func() {
-	var (
-		managerNs *corev1.Namespace
-		worker1Ns *corev1.Namespace
-		worker2Ns *corev1.Namespace
-
-		workerCluster1   *kueue.MultiKueueCluster
-		workerCluster2   *kueue.MultiKueueCluster
-		multiKueueConfig *kueue.MultiKueueConfig
-		multiKueueAc     *kueue.AdmissionCheck
-		managerFlavor    *kueue.ResourceFlavor
-		managerCq        *kueue.ClusterQueue
-		managerLq        *kueue.LocalQueue
-
-		worker1Flavor *kueue.ResourceFlavor
-		worker1Cq     *kueue.ClusterQueue
-		worker1Lq     *kueue.LocalQueue
-
-		worker2Flavor *kueue.ResourceFlavor
-		worker2Cq     *kueue.ClusterQueue
-		worker2Lq     *kueue.LocalQueue
-	)
-
-	ginkgo.BeforeAll(func() {
-		managerNs = util.CreateNamespaceFromPrefixWithLog(ctx, k8sManagerClient, "multikueue-")
-		worker1Ns = util.CreateNamespaceWithLog(ctx, k8sWorker1Client, managerNs.Name)
-		worker2Ns = util.CreateNamespaceWithLog(ctx, k8sWorker2Client, managerNs.Name)
-
-		workerCluster1 = utiltesting.MakeMultiKueueCluster("worker1").KubeConfig(kueue.SecretLocationType, "multikueue1").Obj()
-		util.MustCreate(ctx, k8sManagerClient, workerCluster1)
-
-		workerCluster2 = utiltesting.MakeMultiKueueCluster("worker2").KubeConfig(kueue.SecretLocationType, "multikueue2").Obj()
-		util.MustCreate(ctx, k8sManagerClient, workerCluster2)
-
-		multiKueueConfig = utiltesting.MakeMultiKueueConfig("multikueueconfig").Clusters("worker1", "worker2").Obj()
-		util.MustCreate(ctx, k8sManagerClient, multiKueueConfig)
-
-		multiKueueAc = utiltesting.MakeAdmissionCheck("ac1").
-			ControllerName(kueue.MultiKueueControllerName).
-			Parameters(kueue.GroupVersion.Group, "MultiKueueConfig", multiKueueConfig.Name).
-			Obj()
-		util.MustCreate(ctx, k8sManagerClient, multiKueueAc)
-
-		ginkgo.By("wait for check active", func() {
-			updatedAc := kueue.AdmissionCheck{}
-			acKey := client.ObjectKeyFromObject(multiKueueAc)
-			gomega.Eventually(func(g gomega.Gomega) {
-				g.Expect(k8sManagerClient.Get(ctx, acKey, &updatedAc)).To(gomega.Succeed())
-				g.Expect(updatedAc.Status.Conditions).To(utiltesting.HaveConditionStatusTrue(kueue.AdmissionCheckActive))
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
-		})
-		managerFlavor = utiltesting.MakeResourceFlavor("default").Obj()
-		util.MustCreate(ctx, k8sManagerClient, managerFlavor)
-
-		managerCq = utiltesting.MakeClusterQueue("q1").
-			ResourceGroup(
-				*utiltesting.MakeFlavorQuotas(managerFlavor.Name).
-					Resource(corev1.ResourceCPU, "2").
-					Resource(corev1.ResourceMemory, "2G").
-					Obj(),
-			).
-			AdmissionChecks(kueue.AdmissionCheckReference(multiKueueAc.Name)).
-			Obj()
-		util.MustCreate(ctx, k8sManagerClient, managerCq)
-
-		managerLq = utiltesting.MakeLocalQueue(managerCq.Name, managerNs.Name).ClusterQueue(managerCq.Name).Obj()
-		util.MustCreate(ctx, k8sManagerClient, managerLq)
-
-		worker1Flavor = utiltesting.MakeResourceFlavor("default").Obj()
-		util.MustCreate(ctx, k8sWorker1Client, worker1Flavor)
-
-		worker1Cq = utiltesting.MakeClusterQueue("q1").
-			ResourceGroup(
-				*utiltesting.MakeFlavorQuotas(worker1Flavor.Name).
-					Resource(corev1.ResourceCPU, "2").
-					Resource(corev1.ResourceMemory, "1G").
-					Obj(),
-			).
-			Obj()
-		util.MustCreate(ctx, k8sWorker1Client, worker1Cq)
-
-		worker1Lq = utiltesting.MakeLocalQueue(worker1Cq.Name, worker1Ns.Name).ClusterQueue(worker1Cq.Name).Obj()
-		util.MustCreate(ctx, k8sWorker1Client, worker1Lq)
-
-		worker2Flavor = utiltesting.MakeResourceFlavor("default").Obj()
-		util.MustCreate(ctx, k8sWorker2Client, worker2Flavor)
-
-		worker2Cq = utiltesting.MakeClusterQueue("q1").
-			ResourceGroup(
-				*utiltesting.MakeFlavorQuotas(worker2Flavor.Name).
-					Resource(corev1.ResourceCPU, "1").
-					Resource(corev1.ResourceMemory, "2G").
-					Obj(),
-			).
-			Obj()
-		util.MustCreate(ctx, k8sWorker2Client, worker2Cq)
-
-		worker2Lq = utiltesting.MakeLocalQueue(worker2Cq.Name, worker2Ns.Name).ClusterQueue(worker2Cq.Name).Obj()
-		util.MustCreate(ctx, k8sWorker2Client, worker2Lq)
-
-		ginkgo.By("setting MultiKueue Dispatcher to Incremental", func() {
-			util.UpdateKueueConfiguration(ctx, k8sManagerClient, defaultManagerKueueCfg, managerClusterName, func(cfg *kueueconfig.Configuration) {
-				cfg.MultiKueue = &kueueconfig.MultiKueue{}
-				cfg.MultiKueue.DispatcherName = ptr.To(kueueconfig.MultiKueueDispatcherModeIncremental)
-			})
-		})
-	})
-
-	ginkgo.AfterEach(func() {
-		gomega.Expect(util.DeleteNamespace(ctx, k8sManagerClient, managerNs)).To(gomega.Succeed())
-		gomega.Expect(util.DeleteNamespace(ctx, k8sWorker1Client, worker1Ns)).To(gomega.Succeed())
-		gomega.Expect(util.DeleteNamespace(ctx, k8sWorker2Client, worker2Ns)).To(gomega.Succeed())
-
-		util.ExpectObjectToBeDeleted(ctx, k8sWorker1Client, worker1Cq, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sWorker1Client, worker1Flavor, true)
-
-		util.ExpectObjectToBeDeleted(ctx, k8sWorker2Client, worker2Cq, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sWorker2Client, worker2Flavor, true)
-
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, managerCq, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, managerFlavor, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, multiKueueAc, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, multiKueueConfig, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, workerCluster1, true)
-		util.ExpectObjectToBeDeleted(ctx, k8sManagerClient, workerCluster2, true)
-
-		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sManagerClient, managerNs)
-		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sWorker1Client, worker1Ns)
-		util.ExpectAllPodsInNamespaceDeleted(ctx, k8sWorker2Client, worker2Ns)
-	})
-
-	ginkgo.It("Should run a job on worker if admitted", func() {
-		// Since it requires 2G of memory, this job can only be admitted in worker 2.
-		job := testingjob.MakeJob("job", managerNs.Name).
-			Queue(kueue.LocalQueueName(managerLq.Name)).
-			RequestAndLimit(corev1.ResourceCPU, "1").
-			RequestAndLimit(corev1.ResourceMemory, "2G").
-			TerminationGracePeriod(1).
-			// Give it the time to be observed Active in the live status update step.
-			Image(util.GetAgnHostImage(), util.BehaviorWaitForDeletion).
-			Obj()
-
-		ginkgo.By("Creating the job", func() {
-			util.MustCreate(ctx, k8sManagerClient, job)
-			gomega.Eventually(func(g gomega.Gomega) {
-				createdJob := &batchv1.Job{}
-				g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
-				g.Expect(ptr.Deref(createdJob.Spec.ManagedBy, "")).To(gomega.BeEquivalentTo(kueue.MultiKueueControllerName))
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
-		})
-		createdLeaderWorkload := &kueue.Workload{}
-		wlLookupKey := types.NamespacedName{Name: workloadjob.GetWorkloadNameForJob(job.Name, job.UID), Namespace: managerNs.Name}
-		// the execution should be given to the worker
-		ginkgo.By("Waiting to be admitted in worker2, and the manager's job unsuspended", func() {
-			gomega.Eventually(func(g gomega.Gomega) {
-				g.Expect(k8sManagerClient.Get(ctx, wlLookupKey, createdLeaderWorkload)).To(gomega.Succeed())
-				g.Expect(workload.FindAdmissionCheck(createdLeaderWorkload.Status.AdmissionChecks, kueue.AdmissionCheckReference(multiKueueAc.Name))).To(gomega.BeComparableTo(&kueue.AdmissionCheckState{
-					Name:    kueue.AdmissionCheckReference(multiKueueAc.Name),
-					State:   kueue.CheckStateReady,
-					Message: `The workload got reservation on "worker2"`,
-				}, cmpopts.IgnoreFields(kueue.AdmissionCheckState{}, "LastTransitionTime")))
-				g.Expect(ptr.Deref(createdLeaderWorkload.Status.ClusterName, "")).To(gomega.Equal(workerCluster2.Name))
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
-
-			gomega.Eventually(func(g gomega.Gomega) {
-				createdJob := &batchv1.Job{}
-				g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
-				g.Expect(ptr.Deref(createdJob.Spec.Suspend, false)).To(gomega.BeFalse())
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
-		})
-
-		ginkgo.By("Waiting for the job to get status updates", func() {
-			gomega.Eventually(func(g gomega.Gomega) {
-				createdJob := batchv1.Job{}
-				g.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), &createdJob)).To(gomega.Succeed())
-				g.Expect(createdJob.Status.StartTime).NotTo(gomega.BeNil())
-				g.Expect(createdJob.Status.Active).To(gomega.Equal(int32(1)))
-				g.Expect(createdJob.Status.CompletionTime).To(gomega.BeNil())
-			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
-		})
-
-		ginkgo.By("Finishing the job's pod", func() {
-			listOpts := util.GetListOptsFromLabel(fmt.Sprintf("batch.kubernetes.io/job-name=%s", job.Name))
-			util.WaitForActivePodsAndTerminate(ctx, k8sWorker2Client, worker2RestClient, worker2Cfg, job.Namespace, 1, 0, listOpts)
-		})
-
-		ginkgo.By("Waiting for the job to finish", func() {
-			gomega.Eventually(func(g gomega.Gomega) {
-				g.Expect(k8sManagerClient.Get(ctx, wlLookupKey, createdLeaderWorkload)).To(gomega.Succeed())
-				g.Expect(createdLeaderWorkload.Status.Conditions).To(utiltesting.HaveConditionStatusTrueAndReason(kueue.WorkloadFinished, kueue.WorkloadFinishedReasonSucceeded))
-			}, util.LongTimeout, util.Interval).Should(gomega.Succeed())
-		})
-
-		ginkgo.By("Checking no objects are left in the worker clusters and the job is completed", func() {
-			gomega.Eventually(func(g gomega.Gomega) {
-				workerWl := &kueue.Workload{}
-				g.Expect(k8sWorker1Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-				g.Expect(k8sWorker2Client.Get(ctx, wlLookupKey, workerWl)).To(utiltesting.BeNotFoundError())
-				workerJob := &batchv1.Job{}
-				g.Expect(k8sWorker1Client.Get(ctx, client.ObjectKeyFromObject(job), workerJob)).To(utiltesting.BeNotFoundError())
-				g.Expect(k8sWorker2Client.Get(ctx, client.ObjectKeyFromObject(job), workerJob)).To(utiltesting.BeNotFoundError())
-			}, util.Timeout, util.Interval).Should(gomega.Succeed())
-
-			createdJob := &batchv1.Job{}
-			gomega.Expect(k8sManagerClient.Get(ctx, client.ObjectKeyFromObject(job), createdJob)).To(gomega.Succeed())
-			gomega.Expect(createdJob.Status.Conditions).To(gomega.ContainElement(gomega.BeComparableTo(
-				batchv1.JobCondition{
-					Type:   batchv1.JobComplete,
-					Status: corev1.ConditionTrue,
-				},
-				cmpopts.IgnoreFields(batchv1.JobCondition{}, "LastTransitionTime", "LastProbeTime", "Reason", "Message"))))
-		})
-	})
-})
-
 func waitForJobAdmitted(wlLookupKey types.NamespacedName, acName, workerName string) {
 	ginkgo.By(fmt.Sprintf("Waiting to be admitted in %s and manager", workerName))
 	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
@@ -1239,3 +1091,15 @@ func GetMultiKueueClusterNameFromAdmissionCheckMessage(message string) string {
 	}
 	return ""
 }
+
+type objAsPtr[T any] interface {
+	client.Object
+	*T
+}
+
+func expectObjectToBeDeletedOnWorkerClusters[PtrT objAsPtr[T], T any](ctx context.Context, obj PtrT) {
+	gomega.EventuallyWithOffset(1, func(g gomega.Gomega) {
+		util.ExpectObjectToBeDeleted(ctx, k8sWorker1Client, obj, false)
+		util.ExpectObjectToBeDeleted(ctx, k8sWorker2Client, obj, false)
+	}, util.Timeout, util.Interval).Should(gomega.Succeed())
+}
diff --git a/test/e2e/multikueue/suite_test.go b/test/e2e/multikueue/suite_test.go
index 518e97e6e..03699efd0 100644
--- a/test/e2e/multikueue/suite_test.go
+++ b/test/e2e/multikueue/suite_test.go
@@ -43,7 +43,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	jobset "sigs.k8s.io/jobset/api/jobset/v1alpha2"
 
-	"sigs.k8s.io/kueue/apis/config/v1beta1"
 	kueue "sigs.k8s.io/kueue/apis/kueue/v1beta1"
 	"sigs.k8s.io/kueue/pkg/util/kubeversion"
 	"sigs.k8s.io/kueue/test/util"
@@ -68,8 +67,6 @@ var (
 	managerRestClient *rest.RESTClient
 	worker1RestClient *rest.RESTClient
 	worker2RestClient *rest.RESTClient
-
-	defaultManagerKueueCfg *v1beta1.Configuration
 )
 
 func policyRule(group, resource string, verbs ...string) rbacv1.PolicyRule {
@@ -320,8 +317,6 @@ var _ = ginkgo.BeforeSuite(func() {
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
 	managerK8SVersion, err = kubeversion.FetchServerVersion(discoveryClient)
 	gomega.Expect(err).NotTo(gomega.HaveOccurred())
-
-	defaultManagerKueueCfg = util.GetKueueConfiguration(ctx, k8sManagerClient)
 })
 
 var _ = ginkgo.AfterSuite(func() {
@@ -330,7 +325,4 @@ var _ = ginkgo.AfterSuite(func() {
 
 	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue1")).To(gomega.Succeed())
 	gomega.Expect(cleanMultiKueueSecret(ctx, k8sManagerClient, kueueNS, "multikueue2")).To(gomega.Succeed())
-
-	util.ApplyKueueConfiguration(ctx, k8sManagerClient, defaultManagerKueueCfg)
-	util.RestartKueueController(ctx, k8sManagerClient, managerClusterName)
 })
diff --git a/test/e2e/singlecluster/e2e_test.go b/test/e2e/singlecluster/e2e_test.go
index 26a0ed835..fd144ae12 100644
--- a/test/e2e/singlecluster/e2e_test.go
+++ b/test/e2e/singlecluster/e2e_test.go
@@ -616,7 +616,7 @@ var _ = ginkgo.Describe("Kueue", func() {
 			ginkgo.By("setting the check as successful", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).Should(gomega.Succeed())
-					patch := workload.BaseSSAWorkload(createdWorkload)
+					patch := util.BaseSSAWorkload(createdWorkload)
 					workload.SetAdmissionCheckState(&patch.Status.AdmissionChecks, kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -654,7 +654,7 @@ var _ = ginkgo.Describe("Kueue", func() {
 			ginkgo.By("setting the check as successful", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).Should(gomega.Succeed())
-					patch := workload.BaseSSAWorkload(createdWorkload)
+					patch := util.BaseSSAWorkload(createdWorkload)
 					workload.SetAdmissionCheckState(&patch.Status.AdmissionChecks, kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateReady,
@@ -670,7 +670,7 @@ var _ = ginkgo.Describe("Kueue", func() {
 			ginkgo.By("setting the check as Rejected", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, wlLookupKey, createdWorkload)).Should(gomega.Succeed())
-					patch := workload.BaseSSAWorkload(createdWorkload)
+					patch := util.BaseSSAWorkload(createdWorkload)
 					workload.SetAdmissionCheckState(&patch.Status.AdmissionChecks, kueue.AdmissionCheckState{
 						Name:  "check1",
 						State: kueue.CheckStateRejected,
diff --git a/test/e2e/singlecluster/fair_sharing_test.go b/test/e2e/singlecluster/fair_sharing_test.go
index 9b22af5d0..71001f400 100644
--- a/test/e2e/singlecluster/fair_sharing_test.go
+++ b/test/e2e/singlecluster/fair_sharing_test.go
@@ -99,8 +99,8 @@ var _ = ginkgo.Describe("Fair Sharing", ginkgo.Ordered, ginkgo.ContinueOnFailure
 					Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 					Parallelism(3).
 					Completions(3).
-					RequestAndLimit("cpu", "1").
-					RequestAndLimit("memory", "200Mi").
+					RequestAndLimit(corev1.ResourceCPU, "1").
+					RequestAndLimit(corev1.ResourceMemory, "200Mi").
 					Obj()
 				util.MustCreate(ctx, k8sClient, job)
 			}
diff --git a/test/e2e/singlecluster/jobset_test.go b/test/e2e/singlecluster/jobset_test.go
index aaec40e80..bb961eaec 100644
--- a/test/e2e/singlecluster/jobset_test.go
+++ b/test/e2e/singlecluster/jobset_test.go
@@ -82,8 +82,8 @@ var _ = ginkgo.Describe("JobSet", func() {
 						Completions: 2,
 					},
 				).
-				RequestAndLimit("replicated-job-1", "cpu", "500m").
-				RequestAndLimit("replicated-job-1", "memory", "200M").
+				RequestAndLimit("replicated-job-1", corev1.ResourceCPU, "500m").
+				RequestAndLimit("replicated-job-1", corev1.ResourceMemory, "200M").
 				Obj()
 
 			ginkgo.By("Creating the jobSet", func() {
@@ -159,8 +159,8 @@ var _ = ginkgo.Describe("JobSet", func() {
 						Completions: 1,
 					},
 				).
-				RequestAndLimit("replicated-job-1", "cpu", "500m").
-				RequestAndLimit("replicated-job-1", "memory", "200M").
+				RequestAndLimit("replicated-job-1", corev1.ResourceCPU, "500m").
+				RequestAndLimit("replicated-job-1", corev1.ResourceMemory, "200M").
 				Obj()
 
 			ginkgo.By("Creating the jobSet", func() {
diff --git a/test/e2e/singlecluster/metrics_test.go b/test/e2e/singlecluster/metrics_test.go
index 681e6b5c6..f22abcf3c 100644
--- a/test/e2e/singlecluster/metrics_test.go
+++ b/test/e2e/singlecluster/metrics_test.go
@@ -260,7 +260,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 
 			createdJob = testingjob.MakeJob("admission-checked-job", ns.Name).
 				Queue(v1beta1.LocalQueueName(localQueue.Name)).
-				RequestAndLimit("cpu", "1").
+				RequestAndLimit(corev1.ResourceCPU, "1").
 				Obj()
 			util.MustCreate(ctx, k8sClient, createdJob)
 
@@ -290,7 +290,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 			ginkgo.By("setting the check as successful", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
 					g.Expect(k8sClient.Get(ctx, workloadKey, createdWorkload)).Should(gomega.Succeed())
-					patch := workload.BaseSSAWorkload(createdWorkload)
+					patch := util.BaseSSAWorkload(createdWorkload)
 					workload.SetAdmissionCheckState(&patch.Status.AdmissionChecks, v1beta1.AdmissionCheckState{
 						Name:  v1beta1.AdmissionCheckReference(admissionCheck.Name),
 						State: v1beta1.CheckStateReady,
@@ -403,7 +403,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 
 			lowerJob1 = testingjob.MakeJob("lower-job-1", ns.Name).
 				Queue(v1beta1.LocalQueueName(localQueue1.Name)).
-				RequestAndLimit("cpu", "1").
+				RequestAndLimit(corev1.ResourceCPU, "1").
 				Obj()
 			util.MustCreate(ctx, k8sClient, lowerJob1)
 
@@ -422,7 +422,7 @@ var _ = ginkgo.Describe("Metrics", func() {
 
 			lowerJob2 = testingjob.MakeJob("lower-job-2", ns.Name).
 				Queue(v1beta1.LocalQueueName(localQueue2.Name)).
-				RequestAndLimit("cpu", "1").
+				RequestAndLimit(corev1.ResourceCPU, "1").
 				Obj()
 			util.MustCreate(ctx, k8sClient, lowerJob2)
 
diff --git a/test/e2e/singlecluster/tas_test.go b/test/e2e/singlecluster/tas_test.go
index 6818f6d91..bc7d21a12 100644
--- a/test/e2e/singlecluster/tas_test.go
+++ b/test/e2e/singlecluster/tas_test.go
@@ -92,8 +92,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 		ginkgo.It("should admit a Job via TAS", func() {
 			sampleJob := testingjob.MakeJob("test-job", ns.Name).
 				Queue(kueue.LocalQueueName(localQueue.Name)).
-				RequestAndLimit("cpu", "700m").
-				RequestAndLimit("memory", "20Mi").
+				RequestAndLimit(corev1.ResourceCPU, "700m").
+				RequestAndLimit(corev1.ResourceMemory, "20Mi").
 				Obj()
 			jobKey := client.ObjectKeyFromObject(sampleJob)
 			sampleJob = (&testingjob.JobWrapper{Job: *sampleJob}).
@@ -212,10 +212,10 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 						},
 					},
 				).
-				RequestAndLimit("rj1", "cpu", "200m").
-				RequestAndLimit("rj1", "memory", "20Mi").
-				RequestAndLimit("rj2", "cpu", "200m").
-				RequestAndLimit("rj2", "memory", "20Mi").
+				RequestAndLimit("rj1", corev1.ResourceCPU, "200m").
+				RequestAndLimit("rj1", corev1.ResourceMemory, "20Mi").
+				RequestAndLimit("rj2", corev1.ResourceCPU, "200m").
+				RequestAndLimit("rj2", corev1.ResourceMemory, "20Mi").
 				Obj()
 
 			ginkgo.By("Creating the JobSet", func() {
@@ -325,8 +325,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 				Queue(localQueue.Name).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
-				RequestAndLimit("cpu", "200m").
-				RequestAndLimit("memory", "200Mi").
+				RequestAndLimit(corev1.ResourceCPU, "200m").
+				RequestAndLimit(corev1.ResourceMemory, "200Mi").
 				Obj()
 
 			ginkgo.By("Creating the Pod", func() {
@@ -383,8 +383,8 @@ var _ = ginkgo.Describe("TopologyAwareScheduling", func() {
 				Queue(localQueue.Name).
 				Image(util.GetAgnHostImage(), util.BehaviorExitFast).
 				Annotation(kueuealpha.PodSetRequiredTopologyAnnotation, corev1.LabelHostname).
-				RequestAndLimit("cpu", "200m").
-				RequestAndLimit("memory", "200Mi").
+				RequestAndLimit(corev1.ResourceCPU, "200m").
+				RequestAndLimit(corev1.ResourceMemory, "200Mi").
 				MakeGroup(2)
 
 			ginkgo.By("Creating the Pod group", func() {
diff --git a/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go b/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
index 5378f7755..dce85f0ae 100644
--- a/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
+++ b/test/integration/singlecluster/controller/admissionchecks/provisioning/provisioning_test.go
@@ -917,6 +917,49 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 			util.ExpectObjectToBeDeleted(ctx, k8sClient, prc, true)
 		})
 
+		ginkgo.It("Admission checks for an evicted workload are Pending", func() {
+			// Repro for https://github.com/kubernetes-sigs/kueue/issues/5129
+			ginkgo.By("Setting the quota reservation to the workload", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).Should(gomega.Succeed())
+					g.Expect(util.SetQuotaReservation(ctx, k8sClient, &updatedWl, admission)).To(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Setting the provision request-1 as Failed", func() {
+				provReqKey := types.NamespacedName{
+					Namespace: wlKey.Namespace,
+					Name:      provisioning.ProvisioningRequestName(wlKey.Name, kueue.AdmissionCheckReference(ac.Name), 1),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, provReqKey, &createdRequest)).Should(gomega.Succeed())
+					apimeta.SetStatusCondition(&createdRequest.Status.Conditions, metav1.Condition{
+						Type:   autoscaling.Failed,
+						Status: metav1.ConditionTrue,
+						Reason: autoscaling.Failed,
+					})
+					g.Expect(k8sClient.Status().Update(ctx, &createdRequest)).Should(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the Workload is Evicted", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					_, evicted := workload.IsEvictedByAdmissionCheck(&updatedWl)
+					g.Expect(evicted).To(gomega.BeTrue())
+				}, util.Timeout, time.Millisecond).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the AdmissionChecks are reset to Pending and remain this way", func() {
+				gomega.Consistently(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					check := workload.FindAdmissionCheck(updatedWl.Status.AdmissionChecks, kueue.AdmissionCheckReference(ac.Name))
+					g.Expect(check).NotTo(gomega.BeNil())
+					g.Expect(check.State).To(gomega.Equal(kueue.CheckStatePending), fmt.Sprintf("status: %v", updatedWl.Status))
+				}, util.ConsistentDuration, util.ShortInterval).Should(gomega.Succeed())
+			})
+		})
+
 		ginkgo.It("Should retry if a ProvisioningRequest fails, then succeed if the second Provisioning request succeeds", func() {
 			ginkgo.By("Setting the quota reservation to the workload", func() {
 				gomega.Eventually(func(g gomega.Gomega) {
@@ -1257,6 +1300,189 @@ var _ = ginkgo.Describe("Provisioning", ginkgo.Ordered, ginkgo.ContinueOnFailure
 		})
 	})
 
+	ginkgo.When("Workload uses a provision admission check with BackoffLimitCount=2", func() {
+		var (
+			ns             *corev1.Namespace
+			wlKey          types.NamespacedName
+			ac             *kueue.AdmissionCheck
+			prc            *kueue.ProvisioningRequestConfig
+			rf             *kueue.ResourceFlavor
+			cq             *kueue.ClusterQueue
+			lq             *kueue.LocalQueue
+			admission      *kueue.Admission
+			createdRequest autoscaling.ProvisioningRequest
+			updatedWl      kueue.Workload
+			provReqKey     types.NamespacedName
+		)
+		ginkgo.JustBeforeEach(func() {
+			ns = util.CreateNamespaceFromPrefixWithLog(ctx, k8sClient, "provisioning-")
+
+			prc = baseConfig.Clone().RetryLimit(2).BaseBackoff(2).Obj()
+			util.MustCreate(ctx, k8sClient, prc)
+
+			ac = testing.MakeAdmissionCheck("ac-prov").
+				ControllerName(kueue.ProvisioningRequestControllerName).
+				Parameters(kueue.GroupVersion.Group, "ProvisioningRequestConfig", prc.Name).
+				Obj()
+			util.MustCreate(ctx, k8sClient, ac)
+
+			rf = testing.MakeResourceFlavor("rf1").Obj()
+			util.MustCreate(ctx, k8sClient, rf)
+
+			cq = testing.MakeClusterQueue("cluster-queue").
+				ResourceGroup(*testing.MakeFlavorQuotas(rf.Name).
+					Resource(resourceGPU, "5").Obj()).
+				AdmissionChecks(kueue.AdmissionCheckReference(ac.Name)).
+				Obj()
+			util.MustCreate(ctx, k8sClient, cq)
+
+			lq = testing.MakeLocalQueue("queue", ns.Name).ClusterQueue(cq.Name).Obj()
+			util.MustCreate(ctx, k8sClient, lq)
+
+			wl := testing.MakeWorkload("wl", ns.Name).
+				Queue(kueue.LocalQueueName(lq.Name)).
+				PodSets(
+					*testing.MakePodSet("ps1", 3).
+						Request(corev1.ResourceCPU, "1").
+						Image("image").
+						Obj(),
+				).Obj()
+			util.MustCreate(ctx, k8sClient, wl)
+
+			wlKey = client.ObjectKeyFromObject(wl)
+			admission = testing.MakeAdmission(cq.Name).
+				PodSets(
+					kueue.PodSetAssignment{
+						Name: "ps1",
+						Flavors: map[corev1.ResourceName]kueue.ResourceFlavorReference{
+							corev1.ResourceCPU: kueue.ResourceFlavorReference(rf.Name),
+						},
+						ResourceUsage: map[corev1.ResourceName]resource.Quantity{
+							corev1.ResourceCPU: resource.MustParse("3"),
+						},
+						Count: ptr.To[int32](3),
+					}).Obj()
+		})
+
+		ginkgo.AfterEach(func() {
+			gomega.Expect(util.DeleteNamespace(ctx, k8sClient, ns)).To(gomega.Succeed())
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, cq, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, rf, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, ac, true)
+			util.ExpectObjectToBeDeleted(ctx, k8sClient, prc, true)
+		})
+
+		ginkgo.It("Should retry twice if a ProvisioningRequest fails twice", func() {
+			ginkgo.By("Setting the quota reservation to the workload", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).Should(gomega.Succeed())
+					g.Expect(util.SetQuotaReservation(ctx, k8sClient, &updatedWl, admission)).To(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Setting the provision request-1 as Failed", func() {
+				provReqKey = types.NamespacedName{
+					Namespace: wlKey.Namespace,
+					Name:      provisioning.ProvisioningRequestName(wlKey.Name, kueue.AdmissionCheckReference(ac.Name), 1),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, provReqKey, &createdRequest)).Should(gomega.Succeed())
+					apimeta.SetStatusCondition(&createdRequest.Status.Conditions, metav1.Condition{
+						Type:   autoscaling.Failed,
+						Status: metav1.ConditionTrue,
+						Reason: autoscaling.Failed,
+					})
+					g.Expect(k8sClient.Status().Update(ctx, &createdRequest)).Should(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the AdmissionCheck is set to Retry, and the workload has requeueState set", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					g.Expect(updatedWl.Status.RequeueState).NotTo(gomega.BeNil())
+					g.Expect(*updatedWl.Status.RequeueState.Count).To(gomega.Equal(int32(1)))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the Workload is Evicted, and all AdmissionChecks are reset to Pending", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					_, evicted := workload.IsEvictedByAdmissionCheck(&updatedWl)
+					g.Expect(evicted).To(gomega.BeTrue())
+					check := workload.FindAdmissionCheck(updatedWl.Status.AdmissionChecks, kueue.AdmissionCheckReference(ac.Name))
+					g.Expect(check).NotTo(gomega.BeNil())
+					g.Expect(check.State).To(gomega.Equal(kueue.CheckStatePending))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Setting the quota reservation to the workload", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).Should(gomega.Succeed())
+					g.Expect(util.SetQuotaReservation(ctx, k8sClient, &updatedWl, admission)).To(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the provision request-2 exists", func() {
+				gomega.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+				provReqKey = types.NamespacedName{
+					Namespace: wlKey.Namespace,
+					Name:      provisioning.ProvisioningRequestName(wlKey.Name, kueue.AdmissionCheckReference(ac.Name), 2),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, provReqKey, &createdRequest)).Should(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Setting the provision request-2 as Failed", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, provReqKey, &createdRequest)).Should(gomega.Succeed())
+					apimeta.SetStatusCondition(&createdRequest.Status.Conditions, metav1.Condition{
+						Type:   autoscaling.Failed,
+						Status: metav1.ConditionTrue,
+						Reason: autoscaling.Failed,
+					})
+					g.Expect(k8sClient.Status().Update(ctx, &createdRequest)).Should(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the AdmissionCheck is set to Retry, and the workload has requeueState set", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					g.Expect(updatedWl.Status.RequeueState).NotTo(gomega.BeNil())
+					g.Expect(*updatedWl.Status.RequeueState.Count).To(gomega.Equal(int32(2)))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the Workload is Evicted, and all AdmissionChecks are reset to Pending", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).To(gomega.Succeed())
+					_, evicted := workload.IsEvictedByAdmissionCheck(&updatedWl)
+					g.Expect(evicted).To(gomega.BeTrue())
+					check := workload.FindAdmissionCheck(updatedWl.Status.AdmissionChecks, kueue.AdmissionCheckReference(ac.Name))
+					g.Expect(check).NotTo(gomega.BeNil())
+					g.Expect(check.State).To(gomega.Equal(kueue.CheckStatePending))
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Setting the quota reservation to the workload", func() {
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, wlKey, &updatedWl)).Should(gomega.Succeed())
+					g.Expect(util.SetQuotaReservation(ctx, k8sClient, &updatedWl, admission)).To(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+
+			ginkgo.By("Checking the provision request-3 exists", func() {
+				provReqKey = types.NamespacedName{
+					Namespace: wlKey.Namespace,
+					Name:      provisioning.ProvisioningRequestName(wlKey.Name, kueue.AdmissionCheckReference(ac.Name), 3),
+				}
+				gomega.Eventually(func(g gomega.Gomega) {
+					g.Expect(k8sClient.Get(ctx, provReqKey, &createdRequest)).Should(gomega.Succeed())
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+		})
+	})
+
 	ginkgo.When("A workload is using a provision request with enabled PodSetMergePolicy", func() {
 		var (
 			ns             *corev1.Namespace
diff --git a/test/integration/singlecluster/controller/core/workload_controller_test.go b/test/integration/singlecluster/controller/core/workload_controller_test.go
index 0b6c06f10..47e01b4c6 100644
--- a/test/integration/singlecluster/controller/core/workload_controller_test.go
+++ b/test/integration/singlecluster/controller/core/workload_controller_test.go
@@ -311,7 +311,7 @@ var _ = ginkgo.Describe("Workload controller", ginkgo.Ordered, ginkgo.ContinueOn
 					g.Expect(k8sClient.Get(ctx, wlKey, updatedWl)).To(gomega.Succeed())
 					g.Expect(workload.IsEvictedByDeactivation(updatedWl)).To(gomega.BeTrue())
 					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "DeactivatedDueToAdmissionCheck", 1)
-					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, kueue.WorkloadDeactivated, "", 1)
+					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "DeactivatedDueToAdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
@@ -396,7 +396,7 @@ var _ = ginkgo.Describe("Workload controller", ginkgo.Ordered, ginkgo.ContinueOn
 
 					g.Expect(workload.IsEvictedByDeactivation(updatedWl)).To(gomega.BeTrue())
 					util.ExpectEvictedWorkloadsTotalMetric(clusterQueue.Name, "DeactivatedDueToAdmissionCheck", 1)
-					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, kueue.WorkloadDeactivated, "", 1)
+					util.ExpectEvictedWorkloadsOnceTotalMetric(clusterQueue.Name, "DeactivatedDueToAdmissionCheck", "", 1)
 				}, util.Timeout, util.Interval).Should(gomega.Succeed())
 			})
 		})
diff --git a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
index fffd8ed85..0dd6a2e3c 100644
--- a/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
+++ b/test/integration/singlecluster/controller/jobs/jobset/jobset_controller_test.go
@@ -1229,8 +1229,8 @@ var _ = ginkgo.Describe("JobSet controller when TopologyAwareScheduling enabled"
 					Args:  util.BehaviorExitFast,
 				},
 			).
-			Request("rj1", "cpu", "100m").
-			Request("rj2", "cpu", "100m").
+			Request("rj1", corev1.ResourceCPU, "100m").
+			Request("rj2", corev1.ResourceCPU, "100m").
 			Obj()
 		ginkgo.By("creating a JobSet", func() {
 			util.MustCreate(ctx, k8sClient, jobSet)
diff --git a/test/integration/singlecluster/kueuectl/create_test.go b/test/integration/singlecluster/kueuectl/create_test.go
index eb802db35..002fda597 100644
--- a/test/integration/singlecluster/kueuectl/create_test.go
+++ b/test/integration/singlecluster/kueuectl/create_test.go
@@ -212,11 +212,11 @@ var _ = ginkgo.Describe("Kueuectl Create", ginkgo.Ordered, ginkgo.ContinueOnFail
 					g.Expect(createdQueue.Spec.Preemption.WithinClusterQueue).Should(gomega.Equal(v1beta1.PreemptionPolicyLowerPriority))
 					g.Expect(createdQueue.Spec.ResourceGroups).Should(gomega.Equal([]v1beta1.ResourceGroup{
 						{
-							CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+							CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 							Flavors: []v1beta1.FlavorQuotas{
 								*testing.MakeFlavorQuotas("alpha").
-									Resource("cpu", "0").
-									Resource("memory", "0").
+									Resource(corev1.ResourceCPU, "0").
+									Resource(corev1.ResourceMemory, "0").
 									Obj(),
 							},
 						},
@@ -249,15 +249,15 @@ var _ = ginkgo.Describe("Kueuectl Create", ginkgo.Ordered, ginkgo.ContinueOnFail
 					g.Expect(createdQueue.Name).Should(gomega.Equal(cqName))
 					g.Expect(createdQueue.Spec.ResourceGroups).Should(gomega.Equal([]v1beta1.ResourceGroup{
 						{
-							CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+							CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 							Flavors: []v1beta1.FlavorQuotas{
 								*testing.MakeFlavorQuotas("alpha").
-									Resource("cpu", "0").
-									Resource("memory", "0").
+									Resource(corev1.ResourceCPU, "0").
+									Resource(corev1.ResourceMemory, "0").
 									Obj(),
 								*testing.MakeFlavorQuotas("beta").
-									Resource("cpu", "0").
-									Resource("memory", "0").
+									Resource(corev1.ResourceCPU, "0").
+									Resource(corev1.ResourceMemory, "0").
 									Obj(),
 							},
 						},
@@ -290,15 +290,15 @@ var _ = ginkgo.Describe("Kueuectl Create", ginkgo.Ordered, ginkgo.ContinueOnFail
 					g.Expect(createdQueue.Name).Should(gomega.Equal(cqName))
 					g.Expect(createdQueue.Spec.ResourceGroups).Should(gomega.Equal([]v1beta1.ResourceGroup{
 						{
-							CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+							CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 							Flavors: []v1beta1.FlavorQuotas{
 								*testing.MakeFlavorQuotas("alpha").
-									Resource("cpu", "0").
-									Resource("memory", "0").
+									Resource(corev1.ResourceCPU, "0").
+									Resource(corev1.ResourceMemory, "0").
 									Obj(),
 								*testing.MakeFlavorQuotas("gamma").
-									Resource("cpu", "0").
-									Resource("memory", "0").
+									Resource(corev1.ResourceCPU, "0").
+									Resource(corev1.ResourceMemory, "0").
 									Obj(),
 							},
 						},
@@ -346,11 +346,11 @@ var _ = ginkgo.Describe("Kueuectl Create", ginkgo.Ordered, ginkgo.ContinueOnFail
 					g.Expect(createdQueue.Name).Should(gomega.Equal(cqName))
 					g.Expect(createdQueue.Spec.ResourceGroups).Should(gomega.Equal([]v1beta1.ResourceGroup{
 						{
-							CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+							CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 							Flavors: []v1beta1.FlavorQuotas{
 								*testing.MakeFlavorQuotas("alpha").
-									Resource("cpu", "0", "0", "0").
-									Resource("memory", "0", "0", "0").
+									Resource(corev1.ResourceCPU, "0", "0", "0").
+									Resource(corev1.ResourceMemory, "0", "0", "0").
 									Obj(),
 							},
 						},
@@ -400,15 +400,15 @@ var _ = ginkgo.Describe("Kueuectl Create", ginkgo.Ordered, ginkgo.ContinueOnFail
 					g.Expect(createdQueue.Spec.Preemption.WithinClusterQueue).Should(gomega.Equal(v1beta1.PreemptionPolicyLowerPriority))
 					g.Expect(createdQueue.Spec.ResourceGroups).Should(gomega.Equal([]v1beta1.ResourceGroup{
 						{
-							CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+							CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 							Flavors: []v1beta1.FlavorQuotas{
 								*testing.MakeFlavorQuotas("alpha").
-									Resource("cpu", "2", "1", "0").
-									Resource("memory", "2", "1", "0").
+									Resource(corev1.ResourceCPU, "2", "1", "0").
+									Resource(corev1.ResourceMemory, "2", "1", "0").
 									Obj(),
 								*testing.MakeFlavorQuotas("gamma").
-									Resource("cpu", "2", "1", "0").
-									Resource("memory", "2", "1", "0").
+									Resource(corev1.ResourceCPU, "2", "1", "0").
+									Resource(corev1.ResourceMemory, "2", "1", "0").
 									Obj(),
 							},
 						},
diff --git a/test/integration/singlecluster/scheduler/scheduler_test.go b/test/integration/singlecluster/scheduler/scheduler_test.go
index 71eee5088..9848bb864 100644
--- a/test/integration/singlecluster/scheduler/scheduler_test.go
+++ b/test/integration/singlecluster/scheduler/scheduler_test.go
@@ -2067,6 +2067,7 @@ var _ = ginkgo.Describe("Scheduler", func() {
 			}, util.Timeout, util.Interval).Should(gomega.Succeed())
 
 			util.ExpectEvictedWorkloadsTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, 1)
+			util.ExpectEvictedWorkloadsOnceTotalMetric(cq.Name, kueue.WorkloadEvictedByLocalQueueStopped, "", 1)
 
 			createdWl := kueue.Workload{}
 			ginkgo.By("Checking the condition of workload is evicted")
diff --git a/test/integration/singlecluster/tas/tas_test.go b/test/integration/singlecluster/tas/tas_test.go
index 775a9b715..5fe44f97e 100644
--- a/test/integration/singlecluster/tas/tas_test.go
+++ b/test/integration/singlecluster/tas/tas_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package core
 
 import (
+	"fmt"
 	"slices"
 	"time"
 
@@ -1025,6 +1026,123 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 					}, util.Timeout, util.Interval).Should(gomega.Succeed())
 				})
 			})
+			ginkgo.It("should clear the annotation when node recovers", func() {
+				var wl1 *kueue.Workload
+				nodeName := nodes[0].Name
+
+				ginkgo.By("creating a workload", func() {
+					wl1 = testing.MakeWorkload("wl1", ns.Name).
+						PodSets(*testing.MakePodSet("worker", 2).
+							// requiring the same block makes sure that no replacement is possible
+							RequiredTopologyRequest(testing.DefaultBlockTopologyLevel).
+							Obj()).
+						Queue(kueue.LocalQueueName(localQueue.Name)).Request(corev1.ResourceCPU, "1").Obj()
+					util.MustCreate(ctx, k8sClient, wl1)
+				})
+
+				ginkgo.By("verify the workload is admitted", func() {
+					util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl1)
+					gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+					gomega.Expect(wl1.Status.Admission.PodSetAssignments[0].TopologyAssignment).Should(gomega.BeComparableTo(
+						&kueue.TopologyAssignment{
+							Levels: []string{corev1.LabelHostname},
+							Domains: []kueue.TopologyDomainAssignment{
+								{Count: 1, Values: []string{"x1"}},
+								{Count: 1, Values: []string{"x2"}},
+							},
+						},
+					))
+				})
+
+				ginkgo.By("making the node NotReady 30s in the past", func() {
+					nodeToUpdate := &corev1.Node{}
+					gomega.Expect(k8sClient.Get(ctx, apitypes.NamespacedName{Name: nodeName}, nodeToUpdate)).Should(gomega.Succeed())
+
+					util.SetNodeCondition(ctx, k8sClient, nodeToUpdate, &corev1.NodeCondition{
+						Type:               corev1.NodeReady,
+						Status:             corev1.ConditionFalse,
+						LastTransitionTime: metav1.NewTime(time.Now().Add(-tas.NodeFailureDelay)),
+					})
+				})
+
+				ginkgo.By("verify the workload eventually gets the NodeToReplaceAnnotation", func() {
+					gomega.Eventually(func(g gomega.Gomega) map[string]string {
+						g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+						return wl1.Annotations
+					}, util.Timeout, util.Interval).Should(gomega.HaveKeyWithValue(kueuealpha.NodeToReplaceAnnotation, nodeName))
+				})
+
+				ginkgo.By("node recovers", func() {
+					nodeToUpdate := &corev1.Node{}
+					gomega.Expect(k8sClient.Get(ctx, apitypes.NamespacedName{Name: nodeName}, nodeToUpdate)).Should(gomega.Succeed())
+
+					util.SetNodeCondition(ctx, k8sClient, nodeToUpdate, &corev1.NodeCondition{
+						Type:               corev1.NodeReady,
+						Status:             corev1.ConditionTrue,
+						LastTransitionTime: metav1.NewTime(time.Now()),
+					})
+				})
+
+				ginkgo.By("verify the annotation is cleared", func() {
+					gomega.Eventually(func(g gomega.Gomega) map[string]string {
+						g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+						return wl1.Annotations
+					}, util.Timeout, util.Interval).ShouldNot(gomega.HaveKeyWithValue(kueuealpha.NodeToReplaceAnnotation, nodeName))
+				})
+			})
+
+			ginkgo.It("should clear the annotation when node reappears", func() {
+				var wl1 *kueue.Workload
+				nodeName := nodes[0].Name
+
+				ginkgo.By("creating a workload", func() {
+					wl1 = testing.MakeWorkload("wl1", ns.Name).
+						PodSets(*testing.MakePodSet("worker", 2).
+							RequiredTopologyRequest(testing.DefaultBlockTopologyLevel).
+							Obj()).
+						Queue(kueue.LocalQueueName(localQueue.Name)).Request(corev1.ResourceCPU, "1").Obj()
+					util.MustCreate(ctx, k8sClient, wl1)
+				})
+
+				ginkgo.By("verify the workload is admitted", func() {
+					util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl1)
+					gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+					gomega.Expect(wl1.Status.Admission.PodSetAssignments[0].TopologyAssignment).Should(gomega.BeComparableTo(
+						&kueue.TopologyAssignment{
+							Levels: []string{corev1.LabelHostname},
+							Domains: []kueue.TopologyDomainAssignment{
+								{Count: 1, Values: []string{"x1"}},
+								{Count: 1, Values: []string{"x2"}},
+							},
+						},
+					))
+				})
+
+				nodeToDelete := &corev1.Node{}
+				ginkgo.By("deleting the node", func() {
+					gomega.Expect(k8sClient.Get(ctx, client.ObjectKey{Name: nodeName}, nodeToDelete)).Should(gomega.Succeed())
+					gomega.Expect(k8sClient.Delete(ctx, nodeToDelete)).Should(gomega.Succeed())
+				})
+
+				ginkgo.By("verify the workload eventually gets the NodeToReplaceAnnotation", func() {
+					gomega.Eventually(func(g gomega.Gomega) map[string]string {
+						g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+						return wl1.Annotations
+					}, util.Timeout, util.Interval).Should(gomega.HaveKeyWithValue(kueuealpha.NodeToReplaceAnnotation, nodeName))
+				})
+
+				ginkgo.By("node reappears", func() {
+					nodeToDelete.ResourceVersion = ""
+					gomega.Expect(k8sClient.Create(ctx, nodeToDelete)).Should(gomega.Succeed())
+				})
+
+				ginkgo.By("verify the annotation is cleared", func() {
+					gomega.Eventually(func(g gomega.Gomega) map[string]string {
+						g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl1), wl1)).To(gomega.Succeed())
+						return wl1.Annotations
+					}, util.Timeout, util.Interval).ShouldNot(gomega.HaveKeyWithValue(kueuealpha.NodeToReplaceAnnotation, nodeName))
+				})
+			})
 
 			ginkgo.It("should update workload TopologyAssignment after a node recovers", func() {
 				var wl1, wl2 *kueue.Workload
@@ -2608,6 +2726,485 @@ var _ = ginkgo.Describe("Topology Aware Scheduling", ginkgo.Ordered, func() {
 			})
 		})
 	})
+
+	// The purpose of this test is to demonstrate a TAS use case
+	// for just the host scope of fragmentation
+	ginkgo.When("Testing node resource fragmentation", func() {
+		var (
+			nodes []corev1.Node
+		)
+
+		ginkgo.BeforeEach(func() {
+			// 1. Create 8 fake nodes with 8 GPUs each. (8 nodes * 8 GPU = 64 GPUs)
+			// 2. Per node, schedule a workload that uses 7 of the 8 GPUs. (7 x 8 = 56 GPU allocated)
+			// This means:
+			// There are 8 total GPUs unallocated, however each GPU is on a different node.
+			nodes = make([]corev1.Node, 8)
+			for i := range 8 {
+				nodes[i] = *testingnode.MakeNode(fmt.Sprintf("fake-gpu-node-%d", i+1)).
+					Label("nodepool", "gpu-nodes").
+					Label(corev1.LabelHostname, fmt.Sprintf("fake-gpu-node-%d", i+1)).
+					StatusAllocatable(corev1.ResourceList{
+						"nvidia.com/gpu":    resource.MustParse("8"), // 8 GPUs per node
+						corev1.ResourcePods: resource.MustParse("10"),
+					}).
+					StatusConditions(corev1.NodeCondition{
+						Type:               corev1.NodeReady,
+						Status:             corev1.ConditionTrue,
+						LastTransitionTime: metav1.NewTime(time.Now()),
+						Reason:             "KubeletReady",
+						Message:            "kubelet is posting ready status",
+					}).
+					Obj()
+			}
+
+			ginkgo.By("Creating nodes first", func() {
+				util.CreateNodesWithStatus(ctx, k8sClient, nodes)
+
+				// Verify all nodes are properly recognized by TAS system
+				gomega.Eventually(func(g gomega.Gomega) {
+					var nodeList corev1.NodeList
+					g.Expect(k8sClient.List(ctx, &nodeList)).To(gomega.Succeed())
+					g.Expect(nodeList.Items).To(gomega.HaveLen(8))
+					for _, node := range nodeList.Items {
+						g.Expect(utiltas.IsNodeStatusConditionTrue(node.Status.Conditions, corev1.NodeReady)).To(gomega.BeTrue())
+					}
+				}, util.Timeout, util.Interval).Should(gomega.Succeed())
+			})
+		})
+
+		ginkgo.AfterEach(func() {
+			for i := range nodes {
+				util.ExpectObjectToBeDeleted(ctx, k8sClient, &nodes[i], true)
+			}
+		})
+
+		ginkgo.Context("Without Topology Aware Scheduling", func() {
+			var (
+				nonTasFlavor       *kueue.ResourceFlavor
+				nonTasClusterQueue *kueue.ClusterQueue
+				nonTasLocalQueue   *kueue.LocalQueue
+			)
+
+			ginkgo.BeforeEach(func() {
+				// Create a ResourceFlavor without topology
+				nonTasFlavor = testing.MakeResourceFlavor("non-tas-gpu-flavor").
+					NodeLabel("nodepool", "gpu-nodes").
+					// No TopologyName - this simulates non-TAS behavior
+					Obj()
+				util.MustCreate(ctx, k8sClient, nonTasFlavor)
+
+				nonTasClusterQueue = testing.MakeClusterQueue("non-tas-gpu-cluster-queue").
+					ResourceGroup(
+						*testing.MakeFlavorQuotas("non-tas-gpu-flavor").
+							Resource("nvidia.com/gpu", "64"). // Total 64 GPUs available (8 nodes × 8 GPUs)
+							Obj(),
+					).
+					Obj()
+				util.MustCreate(ctx, k8sClient, nonTasClusterQueue)
+				util.ExpectClusterQueuesToBeActive(ctx, k8sClient, nonTasClusterQueue)
+
+				nonTasLocalQueue = testing.MakeLocalQueue("non-tas-gpu-queue", ns.Name).
+					ClusterQueue("non-tas-gpu-cluster-queue").
+					Obj()
+				util.MustCreate(ctx, k8sClient, nonTasLocalQueue)
+
+				// Create existing workloads that consume 7 GPUs on each node
+				// This simulates the scenario where only 1 GPU is available per node
+				for i := range 8 {
+					existingWl := testing.MakeWorkload(fmt.Sprintf("existing-workload-%d", i+1), ns.Name).
+						Queue(kueue.LocalQueueName(nonTasLocalQueue.Name)).
+						PodSets(*testing.MakePodSet("worker", 1).
+							Request("nvidia.com/gpu", "7"). // Single pod needs 7 GPUs
+							NodeSelector(map[string]string{
+								"nodepool":           "gpu-nodes",
+								corev1.LabelHostname: fmt.Sprintf("fake-gpu-node-%d", i+1),
+							}).
+							Obj()).
+						Obj()
+					util.MustCreate(ctx, k8sClient, existingWl)
+					util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, existingWl)
+				}
+			})
+
+			ginkgo.AfterEach(func() {
+				gomega.Expect(util.DeleteWorkloadsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+				util.ExpectObjectToBeDeleted(ctx, k8sClient, nonTasClusterQueue, true)
+				util.ExpectObjectToBeDeleted(ctx, k8sClient, nonTasFlavor, true)
+			})
+
+			ginkgo.It("Should demonstrate fragmentation issue", func() {
+				// Create a 1 pod workload that needs 8 GPUs on a single node
+				// This should cause fragmentation because:
+				// - Kueue sees 8 GPUs available total (1 GPU per node across 8 nodes)
+				// - But a single pod requiring 8 GPUs cannot fit on any single node
+				wl := testing.MakeWorkload("fragmented-workload", ns.Name).
+					Queue(kueue.LocalQueueName(nonTasLocalQueue.Name)).
+					PodSets(*testing.MakePodSet("worker", 1).
+						Request("nvidia.com/gpu", "8"). // Single pod needs 8 GPUs
+						NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+						Obj()).
+					Obj()
+
+				ginkgo.By("Creating the workload that requires all 8 GPUs", func() {
+					util.MustCreate(ctx, k8sClient, wl)
+				})
+
+				ginkgo.By("Verifying the workload gets admitted (Kueue thinks it can schedule)", func() {
+					// Without TAS, Kueue should admit this because it sees 8 GPUs are available
+					// irrespective of quota topology
+					util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl)
+					// We expect 9 total workloads: 8 existing (7 GPUs each) + 1 new (8 GPUs)
+					// Total: 8×7 + 1×8 = 64 GPUs, which fits in the 64 GPU quota
+					util.ExpectReservingActiveWorkloadsMetric(nonTasClusterQueue, 9)
+				})
+
+				ginkgo.By("Verifying admission shows resource assignment", func() {
+					gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+					gomega.Expect(wl.Status.Admission).ShouldNot(gomega.BeNil())
+					gomega.Expect(wl.Status.Admission.PodSetAssignments).Should(gomega.HaveLen(1))
+					gomega.Expect(wl.Status.Admission.PodSetAssignments[0].Flavors).Should(gomega.Equal(
+						map[corev1.ResourceName]kueue.ResourceFlavorReference{
+							"nvidia.com/gpu": kueue.ResourceFlavorReference("non-tas-gpu-flavor"),
+						},
+					))
+					// Without TAS, there should be no TopologyAssignment
+					gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment).Should(gomega.BeNil())
+				})
+
+				ginkgo.By("Demonstrating the problem: workload is admitted but cannot actually be scheduled", func() {
+					// This test demonstrates the core issue:
+					// 1. Kueue sees 8 GPUs available total (1 per node across 8 nodes) and admits the 1 pod workload
+					// 2. But the single pod needs 8 GPUs in 1 node, and no single node has 8 available GPUs
+					// 3. Each node only has 1 GPU available (the other 7 are busy with existing workloads)
+					// 4. This leads to the pod being unschedulable, and will eventually reach scheduling timeout in
+					//    a real world scenario
+
+					// The workload is admitted, showing Kueue thinks it can be scheduled
+					gomega.Expect(workload.HasQuotaReservation(wl)).Should(gomega.BeTrue())
+				})
+			})
+		})
+
+		ginkgo.Context("With Topology-Aware Scheduling", func() {
+			var (
+				tasFlavor    *kueue.ResourceFlavor
+				topology     *kueuealpha.Topology
+				localQueue   *kueue.LocalQueue
+				clusterQueue *kueue.ClusterQueue
+			)
+			ginkgo.Context("Single pod fitting into single node scenario", func() {
+				ginkgo.BeforeEach(func() {
+					ginkgo.By("Creating TAS topology", func() {
+						topology = testing.MakeDefaultOneLevelTopology("node")
+						util.MustCreate(ctx, k8sClient, topology)
+					})
+
+					ginkgo.By("Creating TAS ResourceFlavor", func() {
+						tasFlavor = testing.MakeResourceFlavor("gpu-flavor").
+							NodeLabel("nodepool", "gpu-nodes").
+							TopologyName("node").
+							Obj()
+						util.MustCreate(ctx, k8sClient, tasFlavor)
+					})
+
+					ginkgo.By("Creating ClusterQueue and LocalQueue", func() {
+						clusterQueue = testing.MakeClusterQueue("gpu-cluster-queue").
+							ResourceGroup(
+								*testing.MakeFlavorQuotas("gpu-flavor").
+									Resource("nvidia.com/gpu", "64"). // Total 64 GPUs available (8 nodes × 8 GPUs)
+									Obj(),
+							).
+							Obj()
+						util.MustCreate(ctx, k8sClient, clusterQueue)
+						util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+						localQueue = testing.MakeLocalQueue("gpu-queue", ns.Name).
+							ClusterQueue("gpu-cluster-queue").
+							Obj()
+						util.MustCreate(ctx, k8sClient, localQueue)
+					})
+
+					// Verify all nodes are properly recognized by TAS system
+					gomega.Eventually(func(g gomega.Gomega) {
+						var nodeList corev1.NodeList
+						g.Expect(k8sClient.List(ctx, &nodeList)).To(gomega.Succeed())
+						g.Expect(nodeList.Items).To(gomega.HaveLen(8))
+						for _, node := range nodeList.Items {
+							g.Expect(utiltas.IsNodeStatusConditionTrue(node.Status.Conditions, corev1.NodeReady)).To(gomega.BeTrue())
+						}
+					}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+					// Create existing workloads that consume 7 GPUs on each node
+					// This simulates the scenario where only 1 GPU is available per node
+					for i := range 8 {
+						existingWl := testing.MakeWorkload(fmt.Sprintf("existing-tas-workload-%d", i+1), ns.Name).
+							Queue(kueue.LocalQueueName(localQueue.Name)).
+							PodSets(*testing.MakePodSet("worker", 1).
+								Request("nvidia.com/gpu", "7").                // Single pod needs 7 GPUs
+								RequiredTopologyRequest(corev1.LabelHostname). // Require hostname topology
+								Obj()).
+							Obj()
+						util.MustCreate(ctx, k8sClient, existingWl)
+						util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, existingWl)
+					}
+				})
+
+				ginkgo.AfterEach(func() {
+					gomega.Expect(util.DeleteWorkloadsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, tasFlavor, true)
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
+				})
+
+				ginkgo.It("Should prevent unschedulable admission by rejecting 8-GPU workload that requires 8-GPUs on single node", func() {
+					// Create a workload that needs 8 GPUs on a single pod
+					// With TAS, this should be rejected because no single node has 8 available GPUs
+					wl := testing.MakeWorkload("tas-workload", ns.Name).
+						Queue(kueue.LocalQueueName(localQueue.Name)).
+						PodSets(*testing.MakePodSet("worker", 1).
+							Request("nvidia.com/gpu", "8"). // Single pod needs 8 GPUs
+							NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+							RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+							Obj()).
+						Obj()
+
+					ginkgo.By("Creating the workload with TAS hostname requirement", func() {
+						util.MustCreate(ctx, k8sClient, wl)
+					})
+
+					ginkgo.By("Verifying the workload is not admitted due to topology constraints", func() {
+						// With TAS, Kueue should not admit this because no single node has 8 GPUs
+						util.ExpectWorkloadsToBePending(ctx, k8sClient, wl)
+						util.ExpectPendingWorkloadsMetric(clusterQueue, 0, 1)
+					})
+
+					ginkgo.By("Verifying workload remains pending (preventing unscheduable admission thus preventing resource waste)", func() {
+						// The workload should remain pending
+						gomega.Consistently(func(g gomega.Gomega) {
+							g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+							g.Expect(workload.HasQuotaReservation(wl)).Should(gomega.BeFalse())
+						}, util.ConsistentDuration, util.ShortInterval).Should(gomega.Succeed())
+					})
+				})
+
+				ginkgo.It("Should allow workload that fits within topology constraints", func() {
+					// Create a workload that needs only 1 GPU (fits on any single node)
+					wl := testing.MakeWorkload("tas-fitting-workload", ns.Name).
+						Queue(kueue.LocalQueueName(localQueue.Name)).
+						PodSets(*testing.MakePodSet("worker", 1).
+							Request("nvidia.com/gpu", "1").
+							NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+							RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+							Obj()).
+						Obj()
+
+					ginkgo.By("Creating the workload with TAS hostname requirement that fits", func() {
+						util.MustCreate(ctx, k8sClient, wl)
+					})
+
+					ginkgo.By("Verifying the workload IS admitted and runs successfully", func() {
+						// This should work because 1 GPU fits on any single node
+						util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl)
+						util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 9) // 8 original workloads, 9th 1 GPU workload here
+					})
+
+					ginkgo.By("Verifying admission contains topology assignment", func() {
+						gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+						gomega.Expect(wl.Status.Admission).ShouldNot(gomega.BeNil())
+						gomega.Expect(wl.Status.Admission.PodSetAssignments).Should(gomega.HaveLen(1))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment).ShouldNot(gomega.BeNil())
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Levels).Should(gomega.Equal([]string{corev1.LabelHostname}))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Domains).Should(gomega.HaveLen(1))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Domains[0].Count).Should(gomega.Equal(int32(1)))
+					})
+				})
+			})
+
+			ginkgo.Context("Multiple pods in 1 workload TAS scenario", func() {
+				var (
+					tasFlavor    *kueue.ResourceFlavor
+					topology     *kueuealpha.Topology
+					localQueue   *kueue.LocalQueue
+					clusterQueue *kueue.ClusterQueue
+				)
+
+				ginkgo.BeforeEach(func() {
+					// Create TAS topology
+					topology = testing.MakeDefaultOneLevelTopology("gpu-topology")
+					util.MustCreate(ctx, k8sClient, topology)
+
+					// Create TAS ResourceFlavor
+					tasFlavor = testing.MakeResourceFlavor("gpu-tas-flavor").
+						NodeLabel("nodepool", "gpu-nodes").
+						TopologyName("gpu-topology").
+						Obj()
+					util.MustCreate(ctx, k8sClient, tasFlavor)
+
+					// Create ClusterQueue and LocalQueue
+					clusterQueue = testing.MakeClusterQueue("gpu-tas-cluster-queue").
+						ResourceGroup(
+							*testing.MakeFlavorQuotas("gpu-tas-flavor").
+								Resource("nvidia.com/gpu", "64"). // Total 64 GPUs available (8 nodes × 8 GPUs)
+								Obj(),
+						).
+						Obj()
+					util.MustCreate(ctx, k8sClient, clusterQueue)
+					util.ExpectClusterQueuesToBeActive(ctx, k8sClient, clusterQueue)
+
+					localQueue = testing.MakeLocalQueue("gpu-tas-queue", ns.Name).
+						ClusterQueue("gpu-tas-cluster-queue").
+						Obj()
+					util.MustCreate(ctx, k8sClient, localQueue)
+
+					// Verify all nodes are properly recognized by TAS system
+					gomega.Eventually(func(g gomega.Gomega) {
+						var nodeList corev1.NodeList
+						g.Expect(k8sClient.List(ctx, &nodeList)).To(gomega.Succeed())
+						g.Expect(nodeList.Items).To(gomega.HaveLen(8))
+						for _, node := range nodeList.Items {
+							g.Expect(utiltas.IsNodeStatusConditionTrue(node.Status.Conditions, corev1.NodeReady)).To(gomega.BeTrue())
+						}
+					}, util.Timeout, util.Interval).Should(gomega.Succeed())
+
+					// Create 7 workloads that consume 7 GPUs each on different nodes
+					// Here, 7 nodes have 1 GPU available each, and 1 node has 8 GPUs available
+					for i := range 7 {
+						existingWl := testing.MakeWorkload(fmt.Sprintf("existing-7gpu-workload-%d", i+1), ns.Name).
+							Queue(kueue.LocalQueueName(localQueue.Name)).
+							PodSets(*testing.MakePodSet("worker", 1).
+								Request("nvidia.com/gpu", "7").                // Single pod needs 7 GPUs
+								RequiredTopologyRequest(corev1.LabelHostname). // Require hostname topology
+								Obj()).
+							Obj()
+						util.MustCreate(ctx, k8sClient, existingWl)
+						util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, existingWl)
+					}
+				})
+
+				ginkgo.AfterEach(func() {
+					gomega.Expect(util.DeleteWorkloadsInNamespace(ctx, k8sClient, ns)).Should(gomega.Succeed())
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, clusterQueue, true)
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, tasFlavor, true)
+					util.ExpectObjectToBeDeleted(ctx, k8sClient, topology, true)
+				})
+
+				ginkgo.It("Should handle workload with 8-GPU pod and 7-GPU pod requirements", func() {
+					// Create a workload with two pods: one needing 8 GPUs and another needing 7 GPUs
+					// With TAS, this should be rejected because:
+					// - The 8-GPU pod can fit on the one remaining node with 8 GPUs available
+					// - But the 7-GPU pod cannot fit on any single node (7 nodes have only 1 GPU available each)
+					wl := testing.MakeWorkload("mixed-gpu-workload", ns.Name).
+						Queue(kueue.LocalQueueName(localQueue.Name)).
+						Obj()
+
+					// First pod set: 1 pod needing 8 GPUs
+					ps1 := *testing.MakePodSet("gpu8-worker", 1).
+						Request("nvidia.com/gpu", "8"). // Single pod needs 8 GPUs
+						NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+						RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+						Obj()
+
+					// Second pod set: 1 pod needing 7 GPUs
+					ps2 := *testing.MakePodSet("gpu7-worker", 1).
+						Request("nvidia.com/gpu", "7"). // Single pod needs 7 GPUs
+						NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+						RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+						Obj()
+
+					wl.Spec.PodSets = []kueue.PodSet{ps1, ps2}
+
+					ginkgo.By("Creating the workload with mixed GPU requirements", func() {
+						util.MustCreate(ctx, k8sClient, wl)
+					})
+
+					ginkgo.By("Verifying the workload is not admitted due to topology constraints", func() {
+						// With TAS, Kueue should not admit this because:
+						// - The 8-GPU pod can fit on the one remaining node with 8 GPUs available
+						// - But the 7-GPU pod cannot fit on any single node (7 nodes have only 1 GPU available each)
+						// - TAS prevents admission when not all pods can be scheduled
+						util.ExpectWorkloadsToBePending(ctx, k8sClient, wl)
+						util.ExpectPendingWorkloadsMetric(clusterQueue, 0, 1)
+					})
+
+					ginkgo.By("Verifying workload remains pending (preventing unschedulable admission)", func() {
+						// The workload should remain pending, demonstrating TAS prevents
+						// admission of workloads that cannot actually be scheduled
+						gomega.Eventually(func(g gomega.Gomega) {
+							g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+							g.Expect(workload.HasQuotaReservation(wl)).Should(gomega.BeFalse())
+						}, util.ConsistentDuration, util.ShortInterval).Should(gomega.Succeed())
+					})
+				})
+				ginkgo.It("Should admit workload with 8-GPU pod and 1-GPU pod requirements", func() {
+					// Create a workload with two pods: one needing 8 GPUs and another needing 1 GPU
+					// With TAS, this should be admitted because:
+					// - The 8-GPU pod can fit on the one remaining node with 8 GPUs available
+					// - The 1-GPU pod can fit on any of the 7 nodes with 1 GPU available each
+					// - TAS allows admission when all pods can be scheduled
+					wl := testing.MakeWorkload("admissible-mixed-gpu-workload", ns.Name).
+						Queue(kueue.LocalQueueName(localQueue.Name)).
+						Obj()
+
+					// First pod set: 1 pod needing 8 GPUs
+					ps1 := *testing.MakePodSet("gpu8-worker", 1).
+						Request("nvidia.com/gpu", "8"). // Single pod needs 8 GPUs
+						NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+						RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+						Obj()
+
+					// Second pod set: 1 pod needing 1 GPU
+					ps2 := *testing.MakePodSet("gpu1-worker", 1).
+						Request("nvidia.com/gpu", "1"). // Single pod needs 1 GPU
+						NodeSelector(map[string]string{"nodepool": "gpu-nodes"}).
+						RequiredTopologyRequest(corev1.LabelHostname). // Require pod on single hostname
+						Obj()
+
+					wl.Spec.PodSets = []kueue.PodSet{ps1, ps2}
+
+					ginkgo.By("Creating the workload with 8+1 GPU requirements", func() {
+						util.MustCreate(ctx, k8sClient, wl)
+					})
+
+					ginkgo.By("Verifying the workload is admitted due to schedulable topology constraints", func() {
+						// With TAS, Kueue should admit this because:
+						// - The 8-GPU pod can fit on the one remaining node with 8 GPUs available
+						// - The 1-GPU pod can fit on any of the 7 nodes with 1 GPU available each
+						// - TAS allows admission when all pods can be scheduled
+						util.ExpectWorkloadsToBeAdmitted(ctx, k8sClient, wl)
+						util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 8) // 7 existing + 1 new workload
+					})
+
+					ginkgo.By("Verifying admission contains correct topology assignments", func() {
+						gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(wl), wl)).To(gomega.Succeed())
+						gomega.Expect(wl.Status.Admission).ShouldNot(gomega.BeNil())
+						gomega.Expect(wl.Status.Admission.PodSetAssignments).Should(gomega.HaveLen(2))
+
+						// First pod set (8 GPUs) should be assigned to a single node
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment).ShouldNot(gomega.BeNil())
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Levels).Should(gomega.Equal([]string{corev1.LabelHostname}))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Domains).Should(gomega.HaveLen(1))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[0].TopologyAssignment.Domains[0].Count).Should(gomega.Equal(int32(1)))
+
+						// Second pod set (1 GPU) should be assigned to a single node
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[1].TopologyAssignment).ShouldNot(gomega.BeNil())
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[1].TopologyAssignment.Levels).Should(gomega.Equal([]string{corev1.LabelHostname}))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[1].TopologyAssignment.Domains).Should(gomega.HaveLen(1))
+						gomega.Expect(wl.Status.Admission.PodSetAssignments[1].TopologyAssignment.Domains[0].Count).Should(gomega.Equal(int32(1)))
+					})
+
+					ginkgo.By("Demonstrating TAS prevents resource waste by allowing schedulable workloads", func() {
+						// This test demonstrates the benefit of TAS:
+						// 1. TAS correctly identifies that both pods can be scheduled
+						// 2. The 8-GPU pod goes to the node with 8 available GPUs
+						// 3. The 1-GPU pod goes to one of the nodes with 1 available GPU
+						// 4. This prevents resource waste by admitting workloads that can actually be scheduled
+						gomega.Expect(workload.HasQuotaReservation(wl)).Should(gomega.BeTrue())
+					})
+				})
+			})
+		})
+	})
 })
 
 var _ = ginkgo.Describe("Topology validations", func() {
diff --git a/test/integration/singlecluster/webhook/core/clusterqueue_test.go b/test/integration/singlecluster/webhook/core/clusterqueue_test.go
index 60d58444e..0edcfb631 100644
--- a/test/integration/singlecluster/webhook/core/clusterqueue_test.go
+++ b/test/integration/singlecluster/webhook/core/clusterqueue_test.go
@@ -304,7 +304,7 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should allow to create clusterQueue with built-in resources with qualified names",
 				testing.MakeClusterQueue("cluster-queue").
-					ResourceGroup(*testing.MakeFlavorQuotas("default").Resource("cpu").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU).Obj()).
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should forbid to create clusterQueue with invalid resource name",
@@ -325,7 +325,7 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 				gomega.Succeed()),
 			ginkgo.Entry("Should allow to create clusterQueue with flavor with qualified names",
 				testing.MakeClusterQueue("cluster-queue").
-					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU).Obj()).
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should forbid to create clusterQueue with flavor with unqualified names",
@@ -336,33 +336,33 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 			ginkgo.Entry("Should forbid to create clusterQueue with flavor quota with negative value",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "-1").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "-1").Obj()).
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should allow to create clusterQueue with flavor quota with zero values",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "0").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "0").Obj()).
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should allow to create clusterQueue with flavor quota with borrowingLimit 0",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "0").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "0").Obj()).
 					Cohort("cohort").
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should forbid to create clusterQueue with flavor quota with negative borrowingLimit",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "-1").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "-1").Obj()).
 					Cohort("cohort").
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should forbid to create clusterQueue with flavor quota with borrowingLimit and empty cohort",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "1").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "1").Obj()).
 					Obj(),
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should allow to create clusterQueue with empty queueing strategy",
@@ -389,12 +389,12 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("alpha").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 						*testing.MakeFlavorQuotas("beta").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					ResourceGroup(
@@ -415,15 +415,15 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.ClusterQueueSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
-										Resource("memory", "0").
+										Resource(corev1.ResourceCPU, "0").
+										Resource(corev1.ResourceMemory, "0").
 										Obj(),
 									*testing.MakeFlavorQuotas("beta").
-										Resource("memory", "0").
-										Resource("cpu", "0").
+										Resource(corev1.ResourceMemory, "0").
+										Resource(corev1.ResourceCPU, "0").
 										Obj(),
 								},
 							},
@@ -439,10 +439,10 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.ClusterQueueSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
+										Resource(corev1.ResourceCPU, "0").
 										Obj(),
 								},
 							},
@@ -458,11 +458,11 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.ClusterQueueSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
-										Resource("memory", "0").
+										Resource(corev1.ResourceCPU, "0").
+										Resource(corev1.ResourceMemory, "0").
 										Obj(),
 								},
 							},
@@ -481,8 +481,8 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 								CoveredResources: []corev1.ResourceName{"blah"},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
-										Resource("memory", "0").
+										Resource(corev1.ResourceCPU, "0").
+										Resource(corev1.ResourceMemory, "0").
 										Obj(),
 								},
 							},
@@ -494,13 +494,13 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("alpha").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("beta").
-							Resource("memory", "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					Obj(),
@@ -508,11 +508,11 @@ var _ = ginkgo.Describe("ClusterQueue Webhook", ginkgo.Ordered, func() {
 			ginkgo.Entry("Should forbid to create clusterQueue with flavor in more than one resource group",
 				testing.MakeClusterQueue("cluster-queue").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("alpha").Resource("cpu").Obj(),
-						*testing.MakeFlavorQuotas("beta").Resource("cpu").Obj(),
+						*testing.MakeFlavorQuotas("alpha").Resource(corev1.ResourceCPU).Obj(),
+						*testing.MakeFlavorQuotas("beta").Resource(corev1.ResourceCPU).Obj(),
 					).
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("beta").Resource("memory").Obj(),
+						*testing.MakeFlavorQuotas("beta").Resource(corev1.ResourceMemory).Obj(),
 					).
 					Obj(),
 				testing.BeForbiddenError()),
diff --git a/test/integration/singlecluster/webhook/core/cohort_test.go b/test/integration/singlecluster/webhook/core/cohort_test.go
index 228daee9a..3aaa9cfc8 100644
--- a/test/integration/singlecluster/webhook/core/cohort_test.go
+++ b/test/integration/singlecluster/webhook/core/cohort_test.go
@@ -75,7 +75,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should reject invalid flavor name",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("@x86").Resource("cpu", "5").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("@x86").Resource(corev1.ResourceCPU, "5").Obj()).
 					Obj(),
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should allow valid resource name",
@@ -85,23 +85,23 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should reject too many flavors in resource group",
 				testing.MakeCohort("cohort").ResourceGroup(
-					testing.MakeFlavorQuotas("f0").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f1").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f2").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f3").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f4").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f5").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f6").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f7").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f8").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f9").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f10").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f11").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f12").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f13").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f14").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f15").Resource("cpu").FlavorQuotas,
-					testing.MakeFlavorQuotas("f16").Resource("cpu").FlavorQuotas).Obj(),
+					testing.MakeFlavorQuotas("f0").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f1").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f2").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f3").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f4").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f5").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f6").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f7").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f8").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f9").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f10").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f11").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f12").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f13").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f14").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f15").Resource(corev1.ResourceCPU).FlavorQuotas,
+					testing.MakeFlavorQuotas("f16").Resource(corev1.ResourceCPU).FlavorQuotas).Obj(),
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should reject too many resources in resource group",
 				testing.MakeCohort("cohort").ResourceGroup(
@@ -126,7 +126,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should allow resource with valid name",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("default").Resource("cpu").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("default").Resource(corev1.ResourceCPU).Obj()).
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should reject resource with invalid name",
@@ -141,46 +141,46 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				gomega.Succeed()),
 			ginkgo.Entry("Should allow flavor with valid name",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU).Obj()).
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should reject flavor with invalid name",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("x_86").Resource("cpu").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x_86").Resource(corev1.ResourceCPU).Obj()).
 					Obj(),
 				testing.BeInvalidError()),
 			ginkgo.Entry("Should reject negative nominal quota",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu", "-1").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "-1").Obj()).
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should reject negative borrowing limit",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "-1").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "-1").Obj()).
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should reject negative lending limit",
 				testing.MakeCohort("cohort").
-					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "", "-1").Obj()).
+					ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "", "-1").Obj()).
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should reject borrowingLimit when no parent",
 				testing.MakeCohort("cohort").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "1").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "1").Obj()).
 					Obj(),
 				testing.BeForbiddenError()),
 			ginkgo.Entry("Should allow borrowingLimit 0 when parent exists",
 				testing.MakeCohort("cohort").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "0").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "0").Obj()).
 					Parent("parent").
 					Obj(),
 				gomega.Succeed()),
 			ginkgo.Entry("Should allow borrowingLimit when parent exists",
 				testing.MakeCohort("cohort").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("x86").Resource("cpu", "1", "1").Obj()).
+						*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "1", "1").Obj()).
 					Parent("parent").
 					Obj(),
 				gomega.Succeed()),
@@ -188,7 +188,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						testing.MakeFlavorQuotas("x86").
-							ResourceQuotaWrapper("cpu").NominalQuota("1").LendingLimit("1").Append().
+							ResourceQuotaWrapper(corev1.ResourceCPU).NominalQuota("1").LendingLimit("1").Append().
 							FlavorQuotas,
 					).
 					Obj(),
@@ -197,7 +197,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						testing.MakeFlavorQuotas("x86").
-							ResourceQuotaWrapper("cpu").NominalQuota("1").LendingLimit("1").Append().
+							ResourceQuotaWrapper(corev1.ResourceCPU).NominalQuota("1").LendingLimit("1").Append().
 							FlavorQuotas,
 					).
 					Parent("parent").
@@ -207,7 +207,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						testing.MakeFlavorQuotas("x86").
-							ResourceQuotaWrapper("cpu").NominalQuota("0").LendingLimit("0").Append().
+							ResourceQuotaWrapper(corev1.ResourceCPU).NominalQuota("0").LendingLimit("0").Append().
 							FlavorQuotas,
 					).
 					Parent("parent").
@@ -217,7 +217,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						testing.MakeFlavorQuotas("x86").
-							ResourceQuotaWrapper("cpu").NominalQuota("3").LendingLimit("5").Append().
+							ResourceQuotaWrapper(corev1.ResourceCPU).NominalQuota("3").LendingLimit("5").Append().
 							FlavorQuotas,
 					).
 					Parent("parent").
@@ -227,12 +227,12 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("alpha").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 						*testing.MakeFlavorQuotas("beta").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					ResourceGroup(
@@ -253,15 +253,15 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
-										Resource("memory", "0").
+										Resource(corev1.ResourceCPU, "0").
+										Resource(corev1.ResourceMemory, "0").
 										Obj(),
 									*testing.MakeFlavorQuotas("beta").
-										Resource("memory", "0").
-										Resource("cpu", "0").
+										Resource(corev1.ResourceMemory, "0").
+										Resource(corev1.ResourceCPU, "0").
 										Obj(),
 								},
 							},
@@ -277,10 +277,10 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu", "memory"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU, corev1.ResourceMemory},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
+										Resource(corev1.ResourceCPU, "0").
 										Obj(),
 								},
 							},
@@ -296,11 +296,11 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 					Spec: kueue.CohortSpec{
 						ResourceGroups: []kueue.ResourceGroup{
 							{
-								CoveredResources: []corev1.ResourceName{"cpu"},
+								CoveredResources: []corev1.ResourceName{corev1.ResourceCPU},
 								Flavors: []kueue.FlavorQuotas{
 									*testing.MakeFlavorQuotas("alpha").
-										Resource("cpu", "0").
-										Resource("memory", "0").
+										Resource(corev1.ResourceCPU, "0").
+										Resource(corev1.ResourceMemory, "0").
 										Obj(),
 								},
 							},
@@ -312,13 +312,13 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 				testing.MakeCohort("cohort").
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("alpha").
-							Resource("cpu", "0").
-							Resource("memory", "0").
+							Resource(corev1.ResourceCPU, "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					ResourceGroup(
 						*testing.MakeFlavorQuotas("beta").
-							Resource("memory", "0").
+							Resource(corev1.ResourceMemory, "0").
 							Obj(),
 					).
 					Obj(),
@@ -326,11 +326,11 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 			ginkgo.Entry("Should reject flavor in more than one resource group",
 				testing.MakeCohort("cohort").
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("alpha").Resource("cpu").Obj(),
-						*testing.MakeFlavorQuotas("beta").Resource("cpu").Obj(),
+						*testing.MakeFlavorQuotas("alpha").Resource(corev1.ResourceCPU).Obj(),
+						*testing.MakeFlavorQuotas("beta").Resource(corev1.ResourceCPU).Obj(),
 					).
 					ResourceGroup(
-						*testing.MakeFlavorQuotas("beta").Resource("memory").Obj(),
+						*testing.MakeFlavorQuotas("beta").Resource(corev1.ResourceMemory).Obj(),
 					).
 					Obj(),
 				testing.BeForbiddenError()),
@@ -382,7 +382,7 @@ var _ = ginkgo.Describe("Cohort Webhook", ginkgo.Ordered, func() {
 		})
 		ginkgo.It("Should reject negative borrowing limit", func() {
 			cohort = testing.MakeCohort("cohort").
-				ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource("cpu", "-1").Obj()).
+				ResourceGroup(*testing.MakeFlavorQuotas("x86").Resource(corev1.ResourceCPU, "-1").Obj()).
 				Obj()
 			gomega.Expect(k8sClient.Create(ctx, cohort)).ShouldNot(gomega.Succeed())
 		})
diff --git a/test/util/e2e.go b/test/util/e2e.go
index d25a92e41..50ee99cb4 100644
--- a/test/util/e2e.go
+++ b/test/util/e2e.go
@@ -55,6 +55,7 @@ import (
 	kueueclientset "sigs.k8s.io/kueue/client-go/clientset/versioned"
 	visibilityv1beta1 "sigs.k8s.io/kueue/client-go/clientset/versioned/typed/visibility/v1beta1"
 	utiltesting "sigs.k8s.io/kueue/pkg/util/testing"
+	"sigs.k8s.io/kueue/pkg/workload"
 )
 
 const (
@@ -451,3 +452,7 @@ func UpdateKueueConfiguration(ctx context.Context, k8sClient client.Client, conf
 	RestartKueueController(ctx, k8sClient, kindClusterName)
 	ginkgo.GinkgoLogr.Info("Kueue configuration updated", "took", time.Since(configurationUpdate))
 }
+
+func BaseSSAWorkload(w *kueue.Workload) *kueue.Workload {
+	return workload.BaseSSAWorkload(w, true)
+}