Skip to content

Commit 15b1a7f

Browse files
committed
Revert "CPU and Memory manager event when using pod level resources"
This reverts commit 7804b51.
1 parent 766d011 commit 15b1a7f

File tree

8 files changed

+7
-168
lines changed

8 files changed

+7
-168
lines changed

pkg/kubelet/allocation/allocation_manager.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package allocation
1818

1919
import (
2020
"context"
21-
"errors"
2221
"fmt"
2322
"path/filepath"
2423
"slices"
@@ -42,7 +41,6 @@ import (
4241
"k8s.io/kubernetes/pkg/features"
4342
"k8s.io/kubernetes/pkg/kubelet/allocation/state"
4443
"k8s.io/kubernetes/pkg/kubelet/cm"
45-
"k8s.io/kubernetes/pkg/kubelet/cm/admission"
4644
"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager"
4745
"k8s.io/kubernetes/pkg/kubelet/cm/memorymanager"
4846
"k8s.io/kubernetes/pkg/kubelet/config"
@@ -703,13 +701,6 @@ func (m *manager) canAdmitPod(allocatedPods []*v1.Pod, pod *v1.Pod) (bool, strin
703701
if result := podAdmitHandler.Admit(attrs); !result.Admit {
704702
klog.InfoS("Pod admission denied", "podUID", attrs.Pod.UID, "pod", klog.KObj(attrs.Pod), "reason", result.Reason, "message", result.Message)
705703
return false, result.Reason, result.Message
706-
} else if result.Admit && len(result.Errors) > 0 && result.Reason == admission.PodLevelResourcesIncompatible && utilfeature.DefaultFeatureGate.Enabled(features.PodLevelResources) {
707-
for _, err := range result.Errors {
708-
var admissionWarning admission.Error
709-
if errors.As(err, &admissionWarning) {
710-
m.recorder.Event(attrs.Pod, v1.EventTypeWarning, admission.PodLevelResourcesIncompatible, admissionWarning.Error())
711-
}
712-
}
713704
}
714705
}
715706

pkg/kubelet/cm/admission/errors.go

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,11 @@ import (
2020
"errors"
2121
"fmt"
2222

23-
utilerrors "k8s.io/apimachinery/pkg/util/errors"
2423
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
2524
)
2625

2726
const (
2827
ErrorReasonUnexpected = "UnexpectedAdmissionError"
29-
30-
// Explicit reason when CPU/Memory manager's policy is incompatible with pod level resources.
31-
PodLevelResourcesIncompatible = "PodLevelResourcesIncompatible"
32-
33-
// Warnings for pod level resources when manager's policy incompatibility.
34-
CPUManagerPodLevelResourcesError = "CPUManagerPodLevelResourcesError"
35-
MemoryManagerPodLevelResourcesError = "MemoryManagerPodLevelResourcesError"
3628
)
3729

3830
type Error interface {
@@ -57,53 +49,14 @@ func GetPodAdmitResult(err error) lifecycle.PodAdmitResult {
5749
return lifecycle.PodAdmitResult{Admit: true}
5850
}
5951

60-
var errs []error
61-
// To support multiple pod-level resource errors, we need to check if the error
62-
// is an aggregate error.
63-
var agg utilerrors.Aggregate
64-
if errors.As(err, &agg) {
65-
errs = agg.Errors()
66-
} else {
67-
errs = []error{err}
68-
}
69-
70-
var podLevelWarnings []error
71-
var otherErrs []error
72-
for _, e := range errs {
73-
var admissionErr Error
74-
if errors.As(e, &admissionErr) && (admissionErr.Type() == CPUManagerPodLevelResourcesError || admissionErr.Type() == MemoryManagerPodLevelResourcesError) {
75-
podLevelWarnings = append(podLevelWarnings, e)
76-
} else {
77-
otherErrs = append(otherErrs, e)
78-
}
79-
}
80-
81-
// If all errors are pod-level resource errors, we should treat them as warnings
82-
// and not block pod admission.
83-
if len(otherErrs) == 0 && len(podLevelWarnings) > 0 {
84-
return lifecycle.PodAdmitResult{
85-
Admit: true,
86-
Reason: PodLevelResourcesIncompatible,
87-
Message: "",
88-
Errors: podLevelWarnings,
89-
}
90-
}
91-
92-
if len(otherErrs) == 0 {
93-
// This should not happen if err != nil, but as a safeguard.
94-
return lifecycle.PodAdmitResult{Admit: true}
95-
}
96-
97-
// At this point, we have at least one error that requires pod rejection.
98-
firstErr := otherErrs[0]
9952
var admissionErr Error
100-
if !errors.As(firstErr, &admissionErr) {
101-
admissionErr = &unexpectedAdmissionError{firstErr}
53+
if !errors.As(err, &admissionErr) {
54+
admissionErr = &unexpectedAdmissionError{err}
10255
}
10356

10457
return lifecycle.PodAdmitResult{
105-
Admit: false,
10658
Message: admissionErr.Error(),
10759
Reason: admissionErr.Type(),
60+
Admit: false,
10861
}
10962
}

pkg/kubelet/cm/cpumanager/cpu_manager.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package cpumanager
1818

1919
import (
2020
"context"
21-
"errors"
2221
"fmt"
2322
"math"
2423
"sync"
@@ -262,13 +261,6 @@ func (m *manager) Allocate(p *v1.Pod, c *v1.Container) error {
262261

263262
// Call down into the policy to assign this container CPUs if required.
264263
err := m.policy.Allocate(m.state, p, c)
265-
266-
// If it gets this error it means that the pod requires pod level resources but this is not aligned.
267-
// We do not want the pod to fail to schedule on this error so we Admit it, this is just a warning
268-
if errors.As(err, &CPUManagerPodLevelResourcesError{}) {
269-
return err
270-
}
271-
272264
if err != nil {
273265
klog.ErrorS(err, "Allocate error")
274266
return err

pkg/kubelet/cm/cpumanager/policy_static.go

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,10 @@ package cpumanager
1818

1919
import (
2020
"fmt"
21-
2221
"strconv"
2322

2423
v1 "k8s.io/api/core/v1"
2524
utilfeature "k8s.io/apiserver/pkg/util/feature"
26-
resourcehelper "k8s.io/component-helpers/resource"
2725
"k8s.io/klog/v2"
2826
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
2927
v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
@@ -37,15 +35,13 @@ import (
3735
)
3836

3937
const (
38+
4039
// PolicyStatic is the name of the static policy.
4140
// Should options be given, these will be ignored and backward (up to 1.21 included)
4241
// compatible behaviour will be enforced
4342
PolicyStatic policyName = "static"
4443
// ErrorSMTAlignment represents the type of an SMTAlignmentError
4544
ErrorSMTAlignment = "SMTAlignmentError"
46-
47-
// ErrorCPUManagerPodLevelResources represents the type of a CPUManagerPodLevelResourcesError
48-
ErrorCPUManagerPodLevelResources = "CPUManagerPodLevelResourcesError"
4945
)
5046

5147
// SMTAlignmentError represents an error due to SMT alignment
@@ -56,15 +52,6 @@ type SMTAlignmentError struct {
5652
CausedByPhysicalCPUs bool
5753
}
5854

59-
// PodLevelResourcesError represents an error due to pod-level resources not being supported.
60-
type CPUManagerPodLevelResourcesError struct{}
61-
62-
func (e CPUManagerPodLevelResourcesError) Error() string {
63-
return "CPU Manager static policy does not support pod-level resources"
64-
}
65-
66-
func (e CPUManagerPodLevelResourcesError) Type() string { return ErrorCPUManagerPodLevelResources }
67-
6855
func (e SMTAlignmentError) Error() string {
6956
if e.CausedByPhysicalCPUs {
7057
return fmt.Sprintf("SMT Alignment Error: not enough free physical CPUs: available physical CPUs = %d, requested CPUs = %d, CPUs per core = %d", e.AvailablePhysicalCPUs, e.RequestedCPUs, e.CpusPerCore)
@@ -329,10 +316,6 @@ func (p *staticPolicy) updateCPUsToReuse(pod *v1.Pod, container *v1.Container, c
329316
func (p *staticPolicy) Allocate(s state.State, pod *v1.Pod, container *v1.Container) (rerr error) {
330317
numCPUs := p.guaranteedCPUs(pod, container)
331318
if numCPUs == 0 {
332-
if p.isPodWithPodLevelResources(pod) {
333-
return CPUManagerPodLevelResourcesError{}
334-
}
335-
336319
// container belongs in the shared pool (nothing to do; use default cpuset)
337320
return nil
338321
}
@@ -484,12 +467,6 @@ func (p *staticPolicy) guaranteedCPUs(pod *v1.Pod, container *v1.Container) int
484467
klog.V(5).InfoS("Exclusive CPU allocation skipped, pod QoS is not guaranteed", "pod", klog.KObj(pod), "containerName", container.Name, "qos", qos)
485468
return 0
486469
}
487-
488-
// The CPU manager static policy does not support pod-level resources.
489-
if utilfeature.DefaultFeatureGate.Enabled(features.PodLevelResources) && resourcehelper.IsPodLevelResourcesSet(pod) {
490-
return 0
491-
}
492-
493470
cpuQuantity := container.Resources.Requests[v1.ResourceCPU]
494471
// In-place pod resize feature makes Container.Resources field mutable for CPU & memory.
495472
// AllocatedResources holds the value of Container.Resources.Requests when the pod was admitted.
@@ -837,14 +814,3 @@ func updateAllocationPerNUMAMetric(topo *topology.CPUTopology, allocatedCPUs cpu
837814
metrics.CPUManagerAllocationPerNUMA.WithLabelValues(strconv.Itoa(numaNode)).Set(float64(count))
838815
}
839816
}
840-
841-
func (p *staticPolicy) isPodWithPodLevelResources(pod *v1.Pod) bool {
842-
if utilfeature.DefaultFeatureGate.Enabled(features.PodLevelResources) && resourcehelper.IsPodLevelResourcesSet(pod) {
843-
// The Memory manager static policy does not support pod-level resources.
844-
klog.V(5).InfoS("CPU Manager allocation skipped, pod is using pod-level resources which are not supported by the static CPU manager policy", "pod", klog.KObj(pod))
845-
846-
return true
847-
}
848-
849-
return false
850-
}

pkg/kubelet/cm/memorymanager/memory_manager.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package memorymanager
1818

1919
import (
2020
"context"
21-
"errors"
2221
"fmt"
2322
"runtime"
2423
"sync"
@@ -274,12 +273,6 @@ func (m *manager) Allocate(pod *v1.Pod, container *v1.Container) error {
274273

275274
// Call down into the policy to assign this container memory if required.
276275
if err := m.policy.Allocate(ctx, m.state, pod, container); err != nil {
277-
// If it gets this error it means that the pod requires pod level resources but this is not aligned.
278-
// We do not want the pod to fail to schedule on this error so we Admit it, this is just a warning
279-
if errors.As(err, &MemoryManagerPodLevelResourcesError{}) {
280-
return err
281-
}
282-
283276
logger.Error(err, "Allocate error", "pod", klog.KObj(pod), "containerName", container.Name)
284277
return err
285278
}

pkg/kubelet/cm/memorymanager/policy_static.go

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
v1 "k8s.io/api/core/v1"
2828
"k8s.io/apimachinery/pkg/api/resource"
2929
utilfeature "k8s.io/apiserver/pkg/util/feature"
30-
resourcehelper "k8s.io/component-helpers/resource"
3130
"k8s.io/klog/v2"
3231
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
3332
corehelper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
@@ -39,12 +38,7 @@ import (
3938
"k8s.io/kubernetes/pkg/kubelet/metrics"
4039
)
4140

42-
const (
43-
PolicyTypeStatic policyType = "Static"
44-
45-
// ErrorMemoryManagerPodLevelResources represents the type of a MemoryManagerPodLevelResourcesError
46-
ErrorMemoryManagerPodLevelResources = "MemoryManagerPodLevelResourcesError"
47-
)
41+
const PolicyTypeStatic policyType = "Static"
4842

4943
type systemReservedMemory map[int]map[v1.ResourceName]uint64
5044
type reusableMemory map[string]map[string]map[v1.ResourceName]uint64
@@ -66,16 +60,6 @@ type staticPolicy struct {
6660

6761
var _ Policy = &staticPolicy{}
6862

69-
type MemoryManagerPodLevelResourcesError struct{}
70-
71-
func (e MemoryManagerPodLevelResourcesError) Type() string {
72-
return ErrorMemoryManagerPodLevelResources
73-
}
74-
75-
func (e MemoryManagerPodLevelResourcesError) Error() string {
76-
return "Memory Manager static policy does not support pod-level resources"
77-
}
78-
7963
// NewPolicyStatic returns new static policy instance
8064
func NewPolicyStatic(ctx context.Context, machineInfo *cadvisorapi.MachineInfo, reserved systemReservedMemory, affinity topologymanager.Store) (Policy, error) {
8165
var totalSystemReserved uint64
@@ -123,10 +107,6 @@ func (p *staticPolicy) Allocate(ctx context.Context, s state.State, pod *v1.Pod,
123107
return nil
124108
}
125109

126-
if p.isPodWithPodLevelResources(ctx, pod) {
127-
return MemoryManagerPodLevelResourcesError{}
128-
}
129-
130110
podUID := string(pod.UID)
131111
logger.Info("Allocate")
132112
// container belongs in an exclusively allocated pool
@@ -426,10 +406,6 @@ func (p *staticPolicy) GetPodTopologyHints(ctx context.Context, s state.State, p
426406
return nil
427407
}
428408

429-
if p.isPodWithPodLevelResources(ctx, pod) {
430-
return nil
431-
}
432-
433409
reqRsrcs, err := getPodRequestedResources(pod)
434410
if err != nil {
435411
logger.Error(err, "Failed to get pod requested resources", "podUID", pod.UID)
@@ -460,10 +436,6 @@ func (p *staticPolicy) GetTopologyHints(ctx context.Context, s state.State, pod
460436
return nil
461437
}
462438

463-
if p.isPodWithPodLevelResources(ctx, pod) {
464-
return nil
465-
}
466-
467439
requestedResources, err := getRequestedResources(pod, container)
468440
if err != nil {
469441
logger.Error(err, "Failed to get container requested resources", "podUID", pod.UID, "containerName", container.Name)
@@ -1104,16 +1076,3 @@ func isAffinityViolatingNUMAAllocations(machineState state.NUMANodeMap, mask bit
11041076
}
11051077
return false
11061078
}
1107-
1108-
func (p *staticPolicy) isPodWithPodLevelResources(ctx context.Context, pod *v1.Pod) bool {
1109-
logger := klog.FromContext(ctx)
1110-
1111-
if utilfeature.DefaultFeatureGate.Enabled(features.PodLevelResources) && resourcehelper.IsPodLevelResourcesSet(pod) {
1112-
// The Memory manager static policy does not support pod-level resources.
1113-
logger.V(5).Info("Memory manager allocation skipped, pod is using pod-level resources which are not supported by the static Memory manager policy", "pod", klog.KObj(pod))
1114-
1115-
return true
1116-
}
1117-
1118-
return false
1119-
}

pkg/kubelet/cm/topologymanager/scope.go

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ package topologymanager
1919
import (
2020
"sync"
2121

22-
v1 "k8s.io/api/core/v1"
23-
utilerrors "k8s.io/apimachinery/pkg/util/errors"
24-
utilfeature "k8s.io/apiserver/pkg/util/feature"
22+
"k8s.io/api/core/v1"
2523
"k8s.io/klog/v2"
26-
"k8s.io/kubernetes/pkg/features"
2724
"k8s.io/kubernetes/pkg/kubelet/cm/admission"
2825
"k8s.io/kubernetes/pkg/kubelet/cm/containermap"
2926
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
@@ -151,21 +148,11 @@ func (s *scope) admitPolicyNone(pod *v1.Pod) lifecycle.PodAdmitResult {
151148
// It would be better to implement this function in topologymanager instead of scope
152149
// but topologymanager do not track providers anymore
153150
func (s *scope) allocateAlignedResources(pod *v1.Pod, container *v1.Container) error {
154-
isPodLevelResourcesEnabled := utilfeature.DefaultFeatureGate.Enabled(features.PodLevelResources)
155-
156-
var errs []error
157151
for _, provider := range s.hintProviders {
158152
err := provider.Allocate(pod, container)
159-
if err != nil && isPodLevelResourcesEnabled {
160-
errs = append(errs, err)
161-
} else if err != nil {
153+
if err != nil {
162154
return err
163155
}
164156
}
165-
166-
if isPodLevelResourcesEnabled {
167-
return utilerrors.NewAggregate(errs)
168-
}
169-
170157
return nil
171158
}

pkg/kubelet/lifecycle/interfaces.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ type PodAdmitResult struct {
3535
Reason string
3636
// a brief message explaining why the pod could not be admitted.
3737
Message string
38-
// all errors for why the pod could not be admitted.
39-
Errors []error
4038
}
4139

4240
// PodAdmitHandler is notified during pod admission.

0 commit comments

Comments
 (0)