Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sidecar containers to resource requests computation #2099

Merged
merged 9 commits into from
May 7, 2024
22 changes: 16 additions & 6 deletions pkg/util/limitrange/limitrange.go
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -81,20 +81,30 @@ func (s Summary) validatePodSpecContainers(containers []corev1.Container, path *
}

// TotalRequests computes the total resource requests of a pod.
// total = sum(max(sum(.containers[].requests), initContainers[].requests), overhead)
// total = Sum(Max( Max(nonSidecarInitContainers) + Sum(SidecarContainers), Sum(SidecarContainers) + Sum(Containers) ), overhead)
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
func TotalRequests(ps *corev1.PodSpec) corev1.ResourceList {
total := corev1.ResourceList{}

// add the resource from the main containers
sumContainers := corev1.ResourceList{}
for i := range ps.Containers {
total = resource.MergeResourceListKeepSum(total, ps.Containers[i].Resources.Requests)
sumContainers = resource.MergeResourceListKeepSum(sumContainers, ps.Containers[i].Resources.Requests)
}

// take into account the maximum of any init containers
// take into account the maximum of any non sidecar init containers and add the sidecar containers
maxNonSidecarInitContainers := corev1.ResourceList{}
sumSidecarContainers := corev1.ResourceList{}
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
for i := range ps.InitContainers {
total = resource.MergeResourceListKeepMax(total, ps.InitContainers[i].Resources.Requests)
// Is the init container a sidecar container?
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
if ps.InitContainers[i].RestartPolicy != nil && *ps.InitContainers[i].RestartPolicy == corev1.ContainerRestartPolicyAlways {
sumSidecarContainers = resource.MergeResourceListKeepSum(sumSidecarContainers, ps.InitContainers[i].Resources.Requests)
} else {
maxNonSidecarInitContainers = resource.MergeResourceListKeepMax(maxNonSidecarInitContainers, ps.InitContainers[i].Resources.Requests)
}
}

total := resource.MergeResourceListKeepMax(
resource.MergeResourceListKeepSum(maxNonSidecarInitContainers, sumSidecarContainers),
resource.MergeResourceListKeepSum(sumSidecarContainers, sumContainers),
)
// add the overhead
total = resource.MergeResourceListKeepSum(total, ps.Overhead)
return total
Expand Down
30 changes: 26 additions & 4 deletions pkg/util/limitrange/limitrange_test.go
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/utils/field"
"k8s.io/utils/ptr"

testingutil "sigs.k8s.io/kueue/pkg/util/testing"
)
Expand Down Expand Up @@ -193,6 +194,16 @@ func TestTotalRequest(t *testing.T) {
},
},
},
{
Resources: corev1.ResourceRequirements{
Requests: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("1"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
"example.com/gpu": resource.MustParse("2"),
},
},
RestartPolicy: ptr.To(corev1.ContainerRestartPolicyAlways),
},
}
cases := map[string]struct {
podSpec *corev1.PodSpec
Expand All @@ -210,7 +221,7 @@ func TestTotalRequest(t *testing.T) {
},
"one init wants more": {
podSpec: &corev1.PodSpec{
InitContainers: containers[2:],
InitContainers: containers[2:4],
Containers: containers[:2],
},
want: corev1.ResourceList{
Expand All @@ -219,6 +230,17 @@ func TestTotalRequest(t *testing.T) {
"example.com/gpu": resource.MustParse("2"),
},
},
"include sidecar container": {
podSpec: &corev1.PodSpec{
InitContainers: containers[2:],
Containers: containers[:2],
IrvingMg marked this conversation as resolved.
Show resolved Hide resolved
},
want: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("5000m"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
"example.com/gpu": resource.MustParse("4"),
},
},
"adds overhead": {
podSpec: &corev1.PodSpec{
InitContainers: containers[2:],
Expand All @@ -230,9 +252,9 @@ func TestTotalRequest(t *testing.T) {
},
},
want: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("5000m"),
corev1.ResourceMemory: resource.MustParse("3Gi"),
"example.com/gpu": resource.MustParse("3"),
corev1.ResourceCPU: resource.MustParse("6000m"),
corev1.ResourceMemory: resource.MustParse("5Gi"),
"example.com/gpu": resource.MustParse("5"),
},
},
}
Expand Down