From a9203ebdcfd657d5b21fb4ad263a9bd4f0b1f057 Mon Sep 17 00:00:00 2001 From: Connor Doyle Date: Thu, 3 Oct 2019 19:56:29 -0700 Subject: [PATCH 1/2] Topology manager aligns pods of all QoS classes. --- .../cm/topologymanager/topology_manager.go | 26 ++---- .../topologymanager/topology_manager_test.go | 92 +++++++++++++++++++ 2 files changed, 102 insertions(+), 16 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/topology_manager.go b/pkg/kubelet/cm/topologymanager/topology_manager.go index f8e7c662f23..ca89b1bea77 100644 --- a/pkg/kubelet/cm/topologymanager/topology_manager.go +++ b/pkg/kubelet/cm/topologymanager/topology_manager.go @@ -320,23 +320,17 @@ func (m *manager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitR } pod := attrs.Pod c := make(map[string]TopologyHint) - klog.Infof("[topologymanager] Pod QoS Level: %v", pod.Status.QOSClass) - if pod.Status.QOSClass == v1.PodQOSGuaranteed { - for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { - result := m.calculateAffinity(*pod, container) - admitPod := m.policy.CanAdmitPodResult(&result) - if !admitPod.Admit { - return admitPod - } - c[container.Name] = result - } - m.podTopologyHints[string(pod.UID)] = c - klog.Infof("[topologymanager] Topology Affinity for Pod: %v are %v", pod.UID, m.podTopologyHints[string(pod.UID)]) - - } else { - klog.Infof("[topologymanager] Topology Manager only affinitises Guaranteed pods.") - } + for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { + result := m.calculateAffinity(*pod, container) + admitPod := m.policy.CanAdmitPodResult(&result) + if !admitPod.Admit { + return admitPod + } + c[container.Name] = result + } + m.podTopologyHints[string(pod.UID)] = c + klog.Infof("[topologymanager] Topology Affinity for Pod: %v are %v", pod.UID, m.podTopologyHints[string(pod.UID)]) return lifecycle.PodAdmitResult{ Admit: true, diff --git a/pkg/kubelet/cm/topologymanager/topology_manager_test.go b/pkg/kubelet/cm/topologymanager/topology_manager_test.go index ecec3e71b33..355c451ecbb 100644 --- a/pkg/kubelet/cm/topologymanager/topology_manager_test.go +++ b/pkg/kubelet/cm/topologymanager/topology_manager_test.go @@ -874,6 +874,32 @@ func TestAdmit(t *testing.T) { }, expected: true, }, + { + name: "QOSClass set as Burstable. BestEffort Policy. More than one Preferred Affinity.", + qosClass: v1.PodQOSBurstable, + policy: NewBestEffortPolicy(), + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource": { + { + NUMANodeAffinity: NewTestBitMask(0), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestBitMask(1), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestBitMask(0, 1), + Preferred: false, + }, + }, + }, + }, + }, + expected: true, + }, { name: "QOSClass set as Guaranteed. BestEffort Policy. No Preferred Affinity.", qosClass: v1.PodQOSGuaranteed, @@ -914,6 +940,28 @@ func TestAdmit(t *testing.T) { }, expected: true, }, + { + name: "QOSClass set as Burstable. Restricted Policy. Preferred Affinity.", + qosClass: v1.PodQOSBurstable, + policy: NewRestrictedPolicy(), + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource": { + { + NUMANodeAffinity: NewTestBitMask(0), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestBitMask(0, 1), + Preferred: false, + }, + }, + }, + }, + }, + expected: true, + }, { name: "QOSClass set as Guaranteed. Restricted Policy. More than one Preferred affinity.", qosClass: v1.PodQOSGuaranteed, @@ -940,6 +988,32 @@ func TestAdmit(t *testing.T) { }, expected: true, }, + { + name: "QOSClass set as Burstable. Restricted Policy. More than one Preferred affinity.", + qosClass: v1.PodQOSBurstable, + policy: NewRestrictedPolicy(), + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource": { + { + NUMANodeAffinity: NewTestBitMask(0), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestBitMask(1), + Preferred: true, + }, + { + NUMANodeAffinity: NewTestBitMask(0, 1), + Preferred: false, + }, + }, + }, + }, + }, + expected: true, + }, { name: "QOSClass set as Guaranteed. Restricted Policy. No Preferred affinity.", qosClass: v1.PodQOSGuaranteed, @@ -958,6 +1032,24 @@ func TestAdmit(t *testing.T) { }, expected: false, }, + { + name: "QOSClass set as Burstable. Restricted Policy. No Preferred affinity.", + qosClass: v1.PodQOSBurstable, + policy: NewRestrictedPolicy(), + hp: []HintProvider{ + &mockHintProvider{ + map[string][]TopologyHint{ + "resource": { + { + NUMANodeAffinity: NewTestBitMask(0, 1), + Preferred: false, + }, + }, + }, + }, + }, + expected: false, + }, } for _, tc := range tcases { man := manager{ From a598369e3c993a1605edfee45e53c2c4e8850f1d Mon Sep 17 00:00:00 2001 From: Connor Doyle Date: Thu, 10 Oct 2019 12:15:27 -0700 Subject: [PATCH 2/2] Gofmt. --- .../cm/topologymanager/topology_manager.go | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/kubelet/cm/topologymanager/topology_manager.go b/pkg/kubelet/cm/topologymanager/topology_manager.go index ca89b1bea77..0cfd0eca54b 100644 --- a/pkg/kubelet/cm/topologymanager/topology_manager.go +++ b/pkg/kubelet/cm/topologymanager/topology_manager.go @@ -321,16 +321,16 @@ func (m *manager) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitR pod := attrs.Pod c := make(map[string]TopologyHint) - for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { - result := m.calculateAffinity(*pod, container) - admitPod := m.policy.CanAdmitPodResult(&result) - if !admitPod.Admit { - return admitPod - } - c[container.Name] = result - } - m.podTopologyHints[string(pod.UID)] = c - klog.Infof("[topologymanager] Topology Affinity for Pod: %v are %v", pod.UID, m.podTopologyHints[string(pod.UID)]) + for _, container := range append(pod.Spec.InitContainers, pod.Spec.Containers...) { + result := m.calculateAffinity(*pod, container) + admitPod := m.policy.CanAdmitPodResult(&result) + if !admitPod.Admit { + return admitPod + } + c[container.Name] = result + } + m.podTopologyHints[string(pod.UID)] = c + klog.Infof("[topologymanager] Topology Affinity for Pod: %v are %v", pod.UID, m.podTopologyHints[string(pod.UID)]) return lifecycle.PodAdmitResult{ Admit: true,