Skip to content
This repository has been archived by the owner on May 25, 2023. It is now read-only.

Commit

Permalink
Take init containers into account when getting pod resource request
Browse files Browse the repository at this point in the history
  • Loading branch information
hex108 committed Mar 13, 2019
1 parent fb8ae80 commit 12403d7
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 6 deletions.
46 changes: 40 additions & 6 deletions pkg/scheduler/api/job_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,7 @@ func getJobID(pod *v1.Pod) JobID {
}

func NewTaskInfo(pod *v1.Pod) *TaskInfo {
req := EmptyResource()

// TODO(k82cn): also includes initContainers' resource.
for _, c := range pod.Spec.Containers {
req.Add(NewResource(c.Resources.Requests))
}
req := getResourceRequest(pod)

jobID := getJobID(pod)

Expand All @@ -89,6 +84,45 @@ func NewTaskInfo(pod *v1.Pod) *TaskInfo {
return ti
}

// Refer k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go#GetResourceRequest.
//
// GetResourceRequest returns a *Resource that covers the largest width in each resource dimension.
// Because init-containers run sequentially, we collect the max in each dimension iteratively.
// In contrast, we sum the resource vectors for regular containers since they run simultaneously.
//
// Example:
//
// Pod:
// InitContainers
// IC1:
// CPU: 2
// Memory: 1G
// IC2:
// CPU: 2
// Memory: 3G
// Containers
// C1:
// CPU: 2
// Memory: 1G
// C2:
// CPU: 1
// Memory: 1G
//
// Result: CPU: 3, Memory: 3G
func getResourceRequest(pod *v1.Pod) *Resource {
result := EmptyResource()
for _, container := range pod.Spec.Containers {
result.Add(NewResource(container.Resources.Requests))
}

// take max_resource(sum_pod, any_init_container)
for _, container := range pod.Spec.InitContainers {
result.SetMaxResource(NewResource(container.Resources.Requests))
}

return result
}

func (ti *TaskInfo) Clone() *TaskInfo {
return &TaskInfo{
UID: ti.UID,
Expand Down
69 changes: 69 additions & 0 deletions pkg/scheduler/api/job_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,72 @@ func TestDeleteTaskInfo(t *testing.T) {
}
}
}

func TestGetResourceRequest(t *testing.T) {
tests := []struct {
name string
pod *v1.Pod
expectedResource *Resource
}{
{
name: "get resource for pod without init containers",
pod: &v1.Pod{
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("1000m", "1G"),
},
},
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("2000m", "1G"),
},
},
},
},
},
expectedResource: NewResource(buildResourceList("3000m", "2G")),
},
{
name: "get resource for pod with init containers",
pod: &v1.Pod{
Spec: v1.PodSpec{
InitContainers: []v1.Container{
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("2000m", "5G"),
},
},
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("2000m", "1G"),
},
},
},
Containers: []v1.Container{
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("1000m", "1G"),
},
},
{
Resources: v1.ResourceRequirements{
Requests: buildResourceList("2000m", "1G"),
},
},
},
},
},
expectedResource: NewResource(buildResourceList("3000m", "5G")),
},
}

for i, test := range tests {
req := getResourceRequest(test.pod)
if !reflect.DeepEqual(req, test.expectedResource) {
t.Errorf("case %d(%s) failed: \n expected %v, \n got: %v \n",
i, test.name, test.expectedResource, req)
}
}
}
17 changes: 17 additions & 0 deletions pkg/scheduler/api/resource_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,23 @@ func (r *Resource) Sub(rr *Resource) *Resource {
r, rr))
}

// SetMaxResource compares with ResourceList and takes max value for each Resource.
func (r *Resource) SetMaxResource(rr *Resource) {
if r == nil {
return
}

if rr.MilliCPU > r.MilliCPU {
r.MilliCPU = rr.MilliCPU
}
if rr.Memory > r.Memory {
r.Memory = rr.Memory
}
if rr.MilliGPU > r.MilliGPU {
r.MilliGPU = rr.MilliGPU
}
}

//Computes the delta between a resource oject representing available
//resources an operand representing resources being requested. Any
//field that is less than 0 after the operation represents an
Expand Down

0 comments on commit 12403d7

Please sign in to comment.