Use all resources to compute node reservation

This commit is contained in:
Piotr Szczesniak 2016-05-13 11:56:36 +02:00
parent ececab153b
commit 04a4810043
2 changed files with 36 additions and 10 deletions

View File

@ -18,6 +18,7 @@ package simulator
import ( import (
"fmt" "fmt"
"math"
kube_api "k8s.io/kubernetes/pkg/api" kube_api "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
@ -45,8 +46,7 @@ func FindNodeToRemove(nodes []*kube_api.Node, pods []*kube_api.Pod, client *kube
continue continue
} }
// TODO: Use other resources as well. reservation, err := calculateReservation(node, nodeInfo)
reservation, err := calculateReservation(node, nodeInfo, kube_api.ResourceCPU)
if err != nil { if err != nil {
glog.Warningf("Failed to calculate reservation for %s: %v", node.Name, err) glog.Warningf("Failed to calculate reservation for %s: %v", node.Name, err)
@ -57,7 +57,8 @@ func FindNodeToRemove(nodes []*kube_api.Node, pods []*kube_api.Pod, client *kube
glog.Infof("Node %s is not suitable for removal - reservation to big (%f)", node.Name, reservation) glog.Infof("Node %s is not suitable for removal - reservation to big (%f)", node.Name, reservation)
continue continue
} }
//Lets try to remove this one.
// Let's try to remove this one.
glog.V(2).Infof("Considering %s for removal", node.Name) glog.V(2).Infof("Considering %s for removal", node.Name)
podsToRemoveList, _, _, err := cmd.GetPodsForDeletionOnNodeDrain(client, node.Name, podsToRemoveList, _, _, err := cmd.GetPodsForDeletionOnNodeDrain(client, node.Name,
@ -89,7 +90,19 @@ func FindNodeToRemove(nodes []*kube_api.Node, pods []*kube_api.Pod, client *kube
return nil, nil return nil, nil
} }
func calculateReservation(node *kube_api.Node, nodeInfo *schedulercache.NodeInfo, resourceName kube_api.ResourceName) (float64, error) { func calculateReservation(node *kube_api.Node, nodeInfo *schedulercache.NodeInfo) (float64, error) {
cpu, err := calculateReservationOfResource(node, nodeInfo, kube_api.ResourceCPU)
if err != nil {
return 0, err
}
mem, err := calculateReservationOfResource(node, nodeInfo, kube_api.ResourceMemory)
if err != nil {
return 0, err
}
return math.Max(cpu, mem), nil
}
func calculateReservationOfResource(node *kube_api.Node, nodeInfo *schedulercache.NodeInfo, resourceName kube_api.ResourceName) (float64, error) {
nodeCapacity, found := node.Status.Capacity[resourceName] nodeCapacity, found := node.Status.Capacity[resourceName]
if !found { if !found {
return 0, fmt.Errorf("Failed to get %v from %s", resourceName, node.Name) return 0, fmt.Errorf("Failed to get %v from %s", resourceName, node.Name)

View File

@ -42,18 +42,31 @@ func TestReservation(t *testing.T) {
nodeInfo := schedulercache.NewNodeInfo(pod, pod, pod2) nodeInfo := schedulercache.NewNodeInfo(pod, pod, pod2)
node := &kube_api.Node{ node := &kube_api.Node{
ObjectMeta: kube_api.ObjectMeta{
Name: "node1",
},
Status: kube_api.NodeStatus{
Capacity: kube_api.ResourceList{
kube_api.ResourceCPU: *resource.NewMilliQuantity(2000, resource.DecimalSI),
kube_api.ResourceMemory: *resource.NewQuantity(2000000, resource.DecimalSI),
},
},
}
reservation, err := calculateReservation(node, nodeInfo)
assert.NoError(t, err)
assert.InEpsilon(t, 2.0/10, reservation, 0.01)
node2 := &kube_api.Node{
ObjectMeta: kube_api.ObjectMeta{
Name: "node2",
},
Status: kube_api.NodeStatus{ Status: kube_api.NodeStatus{
Capacity: kube_api.ResourceList{ Capacity: kube_api.ResourceList{
kube_api.ResourceCPU: *resource.NewMilliQuantity(2000, resource.DecimalSI), kube_api.ResourceCPU: *resource.NewMilliQuantity(2000, resource.DecimalSI),
}, },
}, },
} }
_, err = calculateReservation(node2, nodeInfo)
reservation, err := calculateReservation(node, nodeInfo, kube_api.ResourceCPU)
assert.NoError(t, err)
assert.InEpsilon(t, 1.0/10, reservation, 0.01)
_, err = calculateReservation(node, nodeInfo, kube_api.ResourceMemory)
assert.Error(t, err) assert.Error(t, err)
} }