@@ -25,6 +25,10 @@ package cm
25
25
import (
26
26
"context"
27
27
"fmt"
28
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
29
+ kubefeatures "k8s.io/kubernetes/pkg/features"
30
+ "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager"
31
+ "sync"
28
32
29
33
"k8s.io/klog/v2"
30
34
"k8s.io/mount-utils"
@@ -38,10 +42,8 @@ import (
38
42
pluginwatcherapi "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
39
43
podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1"
40
44
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
41
- "k8s.io/kubernetes/pkg/kubelet/cm/admission"
42
45
"k8s.io/kubernetes/pkg/kubelet/cm/cpumanager"
43
46
"k8s.io/kubernetes/pkg/kubelet/cm/devicemanager"
44
- "k8s.io/kubernetes/pkg/kubelet/cm/memorymanager"
45
47
"k8s.io/kubernetes/pkg/kubelet/cm/resourceupdates"
46
48
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
47
49
"k8s.io/kubernetes/pkg/kubelet/config"
@@ -63,12 +65,9 @@ type containerManagerImpl struct {
63
65
deviceManager devicemanager.Manager
64
66
// Interface for Topology resource co-ordination
65
67
topologyManager topologymanager.Manager
66
- }
67
-
68
- type noopWindowsResourceAllocator struct {}
69
-
70
- func (ra * noopWindowsResourceAllocator ) Admit (attrs * lifecycle.PodAdmitAttributes ) lifecycle.PodAdmitResult {
71
- return admission .GetPodAdmitResult (nil )
68
+ cpuManager cpumanager.Manager
69
+ nodeInfo * v1.Node
70
+ sync.RWMutex
72
71
}
73
72
74
73
func (cm * containerManagerImpl ) Start (ctx context.Context , node * v1.Node ,
@@ -80,6 +79,8 @@ func (cm *containerManagerImpl) Start(ctx context.Context, node *v1.Node,
80
79
localStorageCapacityIsolation bool ) error {
81
80
klog .V (2 ).InfoS ("Starting Windows container manager" )
82
81
82
+ cm .nodeInfo = node
83
+
83
84
if localStorageCapacityIsolation {
84
85
rootfs , err := cm .cadvisorInterface .RootFsInfo ()
85
86
if err != nil {
@@ -92,6 +93,14 @@ func (cm *containerManagerImpl) Start(ctx context.Context, node *v1.Node,
92
93
93
94
containerMap , containerRunningSet := buildContainerMapAndRunningSetFromRuntime (ctx , runtimeService )
94
95
96
+ // Initialize CPU manager
97
+ if utilfeature .DefaultFeatureGate .Enabled (kubefeatures .WindowsCPUAndMemoryAffinity ) {
98
+ err := cm .cpuManager .Start (cpumanager .ActivePodsFunc (activePods ), sourcesReady , podStatusProvider , runtimeService , containerMap )
99
+ if err != nil {
100
+ return fmt .Errorf ("start cpu manager error: %v" , err )
101
+ }
102
+ }
103
+
95
104
// Starts device manager.
96
105
if err := cm .deviceManager .Start (devicemanager .ActivePodsFunc (activePods ), sourcesReady , containerMap , containerRunningSet ); err != nil {
97
106
return err
@@ -117,7 +126,37 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I
117
126
cadvisorInterface : cadvisorInterface ,
118
127
}
119
128
120
- cm .topologyManager = topologymanager .NewFakeManager ()
129
+ if utilfeature .DefaultFeatureGate .Enabled (kubefeatures .WindowsCPUAndMemoryAffinity ) {
130
+ klog .InfoS ("Creating topology manager" )
131
+ cm .topologyManager , err = topologymanager .NewManager (machineInfo .Topology ,
132
+ nodeConfig .TopologyManagerPolicy ,
133
+ nodeConfig .TopologyManagerScope ,
134
+ nodeConfig .TopologyManagerPolicyOptions )
135
+ if err != nil {
136
+ klog .ErrorS (err , "Failed to initialize topology manager" )
137
+ return nil , err
138
+ }
139
+
140
+ klog .InfoS ("Creating cpu manager" )
141
+ cm .cpuManager , err = cpumanager .NewManager (
142
+ nodeConfig .CPUManagerPolicy ,
143
+ nodeConfig .CPUManagerPolicyOptions ,
144
+ nodeConfig .CPUManagerReconcilePeriod ,
145
+ machineInfo ,
146
+ nodeConfig .NodeAllocatableConfig .ReservedSystemCPUs ,
147
+ cm .GetNodeAllocatableReservation (),
148
+ nodeConfig .KubeletRootDir ,
149
+ cm .topologyManager ,
150
+ )
151
+ if err != nil {
152
+ klog .ErrorS (err , "Failed to initialize cpu manager" )
153
+ return nil , err
154
+ }
155
+ cm .topologyManager .AddHintProvider (cm .cpuManager )
156
+ } else {
157
+ cm .topologyManager = topologymanager .NewFakeManager ()
158
+ cm .cpuManager = cpumanager .NewFakeManager ()
159
+ }
121
160
122
161
klog .InfoS ("Creating device plugin manager" )
123
162
cm .deviceManager , err = devicemanager .NewManagerImpl (nil , cm .topologyManager )
@@ -134,7 +173,9 @@ func (cm *containerManagerImpl) SystemCgroupsLimit() v1.ResourceList {
134
173
}
135
174
136
175
func (cm * containerManagerImpl ) GetNodeConfig () NodeConfig {
137
- return NodeConfig {}
176
+ cm .RLock ()
177
+ defer cm .RUnlock ()
178
+ return cm .nodeConfig
138
179
}
139
180
140
181
func (cm * containerManagerImpl ) GetMountedSubsystems () * CgroupSubsystems {
@@ -226,7 +267,7 @@ func (cm *containerManagerImpl) UpdatePluginResources(node *schedulerframework.N
226
267
}
227
268
228
269
func (cm * containerManagerImpl ) InternalContainerLifecycle () InternalContainerLifecycle {
229
- return & internalContainerLifecycleImpl {cpumanager . NewFakeManager () , memorymanager .NewFakeManager (), topologymanager . NewFakeManager () }
270
+ return & internalContainerLifecycleImpl {cm . cpuManager , memorymanager .NewFakeManager (), cm . topologyManager }
230
271
}
231
272
232
273
func (cm * containerManagerImpl ) GetPodCgroupRoot () string {
@@ -246,18 +287,30 @@ func (cm *containerManagerImpl) ShouldResetExtendedResourceCapacity() bool {
246
287
}
247
288
248
289
func (cm * containerManagerImpl ) GetAllocateResourcesPodAdmitHandler () lifecycle.PodAdmitHandler {
249
- return & noopWindowsResourceAllocator {}
290
+ return cm . topologyManager
250
291
}
251
292
252
293
func (cm * containerManagerImpl ) UpdateAllocatedDevices () {
253
294
return
254
295
}
255
296
256
- func (cm * containerManagerImpl ) GetCPUs (_ , _ string ) []int64 {
297
+ func (cm * containerManagerImpl ) GetCPUs (podUID , containerName string ) []int64 {
298
+ if utilfeature .DefaultFeatureGate .Enabled (kubefeatures .WindowsCPUAndMemoryAffinity ) {
299
+ if cm .cpuManager != nil {
300
+ return int64Slice (cm .cpuManager .GetExclusiveCPUs (podUID , containerName ).UnsortedList ())
301
+ }
302
+ return []int64 {}
303
+ }
257
304
return nil
258
305
}
259
306
260
307
func (cm * containerManagerImpl ) GetAllocatableCPUs () []int64 {
308
+ if utilfeature .DefaultFeatureGate .Enabled (kubefeatures .WindowsCPUAndMemoryAffinity ) {
309
+ if cm .cpuManager != nil {
310
+ return int64Slice (cm .cpuManager .GetAllocatableCPUs ().UnsortedList ())
311
+ }
312
+ return []int64 {}
313
+ }
261
314
return nil
262
315
}
263
316
0 commit comments