Skip to content

Commit 0d68bff

Browse files
klueskanolancon
authored andcommitted
Change GetTopologyPodAdmitHandler() to be more general
GetTopologyPodAdmitHandler() now returns a lifecycle.PodAdmitHandler type instead of the TopologyManager directly. The handler it returns is generally responsible for attempting to allocate any resources that require a pod admission check. When the TopologyManager feature gate is on, this comes directly from the TopologyManager. When it is off, we simply attempt the allocations ourselves and fail the admission on an unexpected error. The higher level kubelet.go feature gate check will be removed in an upcoming PR.
1 parent 0b168f0 commit 0d68bff

File tree

4 files changed

+47
-12
lines changed

4 files changed

+47
-12
lines changed

pkg/kubelet/cm/container_manager.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
internalapi "k8s.io/cri-api/pkg/apis"
2626
podresourcesapi "k8s.io/kubernetes/pkg/kubelet/apis/podresources/v1alpha1"
2727
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
28-
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
2928
"k8s.io/kubernetes/pkg/kubelet/config"
3029
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
3130
evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api"
@@ -111,8 +110,8 @@ type ContainerManager interface {
111110
// due to node recreation.
112111
ShouldResetExtendedResourceCapacity() bool
113112

114-
// GetTopologyPodAdmitHandler returns an instance of the TopologyManager for Pod Admission
115-
GetTopologyPodAdmitHandler() topologymanager.Manager
113+
// GetTopologyPodAdmitHandler returns an instance of a PodAdmitHandler responsible for allocating pod resources.
114+
GetTopologyPodAdmitHandler() lifecycle.PodAdmitHandler
116115

117116
// UpdateAllocatedDevices frees any Devices that are bound to terminated pods.
118117
UpdateAllocatedDevices()

pkg/kubelet/cm/container_manager_linux.go

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -672,15 +672,51 @@ func (cm *containerManagerImpl) GetResources(pod *v1.Pod, container *v1.Containe
672672
}
673673

674674
func (cm *containerManagerImpl) UpdatePluginResources(node *schedulernodeinfo.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error {
675-
err := cm.deviceManager.Allocate(attrs.Pod)
676-
if err != nil {
677-
return err
678-
}
679675
return cm.deviceManager.UpdatePluginResources(node, attrs)
680676
}
681677

682-
func (cm *containerManagerImpl) GetTopologyPodAdmitHandler() topologymanager.Manager {
683-
return cm.topologyManager
678+
func (cm *containerManagerImpl) GetTopologyPodAdmitHandler() lifecycle.PodAdmitHandler {
679+
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.TopologyManager) {
680+
return cm.topologyManager
681+
}
682+
// TODO: we need to think about a better way to do this. This will work for
683+
// now so long as we have only the cpuManager and deviceManager relying on
684+
// allocations here. However, going forward it is not generalized enough to
685+
// work as we add more and more hint providers that the TopologyManager
686+
// needs to call Allocate() on (that may not be directly intstantiated
687+
// inside this component).
688+
return &resourceAllocator{cm.cpuManager, cm.deviceManager}
689+
}
690+
691+
type resourceAllocator struct {
692+
cpuManager cpumanager.Manager
693+
deviceManager devicemanager.Manager
694+
}
695+
696+
func (m *resourceAllocator) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult {
697+
pod := attrs.Pod
698+
699+
for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) {
700+
err := m.deviceManager.Allocate(pod, &container)
701+
if err != nil {
702+
return lifecycle.PodAdmitResult{
703+
Message: fmt.Sprintf("Allocate failed due to %v, which is unexpected", err),
704+
Reason: "UnexpectedAdmissionError",
705+
Admit: false,
706+
}
707+
}
708+
709+
err = m.cpuManager.Allocate(pod, &container)
710+
if err != nil {
711+
return lifecycle.PodAdmitResult{
712+
Message: fmt.Sprintf("Allocate failed due to %v, which is unexpected", err),
713+
Reason: "UnexpectedAdmissionError",
714+
Admit: false,
715+
}
716+
}
717+
}
718+
719+
return lifecycle.PodAdmitResult{Admit: true}
684720
}
685721

686722
func (cm *containerManagerImpl) SystemCgroupsLimit() v1.ResourceList {

pkg/kubelet/cm/container_manager_stub.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ func (cm *containerManagerStub) ShouldResetExtendedResourceCapacity() bool {
117117
return cm.shouldResetExtendedResourceCapacity
118118
}
119119

120-
func (cm *containerManagerStub) GetTopologyPodAdmitHandler() topologymanager.Manager {
121-
return nil
120+
func (cm *containerManagerStub) GetTopologyPodAdmitHandler() lifecycle.PodAdmitHandler {
121+
return topologymanager.NewFakeManager()
122122
}
123123

124124
func (cm *containerManagerStub) UpdateAllocatedDevices() {

pkg/kubelet/cm/container_manager_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func (cm *containerManagerImpl) ShouldResetExtendedResourceCapacity() bool {
178178
return false
179179
}
180180

181-
func (cm *containerManagerImpl) GetTopologyPodAdmitHandler() topologymanager.Manager {
181+
func (cm *containerManagerImpl) GetTopologyPodAdmitHandler() lifecycle.PodAdmitHandler {
182182
return nil
183183
}
184184

0 commit comments

Comments
 (0)