Allow adding limits

This commit is contained in:
Tim Allclair 2024-11-08 22:58:30 -08:00
parent caedccf0e4
commit 25cf2a2aac
3 changed files with 71 additions and 11 deletions

View File

@ -1791,19 +1791,31 @@ func allocatedResourcesMatchStatus(allocatedPod *v1.Pod, podStatus *kubecontaine
// Only compare resizeable resources, and only compare resources that are explicitly configured. // Only compare resizeable resources, and only compare resources that are explicitly configured.
if hasCPUReq { if hasCPUReq {
// If both allocated & status CPU requests are at or below MinShares then they are considered equal. if cs.Resources.CPURequest == nil {
if !cpuReq.Equal(*cs.Resources.CPURequest) && if !cpuReq.IsZero() {
return false
}
} else if !cpuReq.Equal(*cs.Resources.CPURequest) &&
(cpuReq.MilliValue() > cm.MinShares || cs.Resources.CPURequest.MilliValue() > cm.MinShares) { (cpuReq.MilliValue() > cm.MinShares || cs.Resources.CPURequest.MilliValue() > cm.MinShares) {
// If both allocated & status CPU requests are at or below MinShares then they are considered equal.
return false return false
} }
} }
if hasCPULim { if hasCPULim {
if !cpuLim.Equal(*cs.Resources.CPULimit) { if cs.Resources.CPULimit == nil {
if !cpuLim.IsZero() {
return false
}
} else if !cpuLim.Equal(*cs.Resources.CPULimit) {
return false return false
} }
} }
if hasMemLim { if hasMemLim {
if !memLim.Equal(*cs.Resources.MemoryLimit) { if cs.Resources.MemoryLimit == nil {
if !memLim.IsZero() {
return false
}
} else if !memLim.Equal(*cs.Resources.MemoryLimit) {
return false return false
} }
} }

View File

@ -6797,6 +6797,38 @@ func TestAllocatedResourcesMatchStatus(t *testing.T) {
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI), CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
}, },
expectMatch: true, expectMatch: true,
}, {
name: "nil status resources: cpu request mismatch",
allocatedResources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("100m"),
},
},
statusResources: &kubecontainer.ContainerResources{},
expectMatch: false,
}, {
name: "nil status resources: cpu limit mismatch",
allocatedResources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("100m"),
},
Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("100m"),
},
},
statusResources: &kubecontainer.ContainerResources{
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
},
expectMatch: false,
}, {
name: "nil status resources: memory limit mismatch",
allocatedResources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("100M"),
},
},
statusResources: &kubecontainer.ContainerResources{},
expectMatch: false,
}} }}
for _, test := range tests { for _, test := range tests {

View File

@ -584,8 +584,10 @@ func (m *kubeGenericRuntimeManager) computePodResizeAction(pod *v1.Pod, containe
cpuRequest: container.Resources.Requests.Cpu().MilliValue(), cpuRequest: container.Resources.Requests.Cpu().MilliValue(),
} }
// Default current values to the desired values so that a resize isn't triggered for missing values. currentResources := containerResources{
currentResources := desiredResources // memoryRequest isn't set by the runtime, so default it to the desired.
memoryRequest: desiredResources.memoryRequest,
}
if kubeContainerStatus.Resources.MemoryLimit != nil { if kubeContainerStatus.Resources.MemoryLimit != nil {
currentResources.memoryLimit = kubeContainerStatus.Resources.MemoryLimit.Value() currentResources.memoryLimit = kubeContainerStatus.Resources.MemoryLimit.Value()
} }
@ -839,16 +841,21 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
} }
switch resourceName { switch resourceName {
case v1.ResourceMemory: case v1.ResourceMemory:
return status.Resources.MemoryLimit.Equal(*container.Resources.Limits.Memory()) actualLimit := nonNilQuantity(status.Resources.MemoryLimit)
return actualLimit.Equal(*container.Resources.Limits.Memory())
case v1.ResourceCPU: case v1.ResourceCPU:
if !status.Resources.CPULimit.Equal(*container.Resources.Limits.Cpu()) { actualLimit := nonNilQuantity(status.Resources.CPULimit)
actualRequest := nonNilQuantity(status.Resources.CPURequest)
desiredLimit := container.Resources.Limits.Cpu()
desiredRequest := container.Resources.Requests.Cpu()
if !actualLimit.Equal(*desiredLimit) {
return false // limits don't match return false // limits don't match
} else if status.Resources.CPURequest.Equal(*container.Resources.Requests.Cpu()) { } else if actualRequest.Equal(*desiredRequest) {
return true // requests & limits both match return true // requests & limits both match
} }
// Consider requests equal if both are at or below MinShares. // Consider requests equal if both are at or below MinShares.
return status.Resources.CPURequest.MilliValue() <= cm.MinShares && return actualRequest.MilliValue() <= cm.MinShares &&
container.Resources.Requests.Cpu().MilliValue() <= cm.MinShares desiredRequest.MilliValue() <= cm.MinShares
default: default:
return true // Shouldn't happen. return true // Shouldn't happen.
} }
@ -870,6 +877,15 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
return nil return nil
} }
// nonNilQuantity returns a non-nil quantity. If the input is non-nil, it is returned. Otherwise a
// pointer to the zero value is returned.
func nonNilQuantity(q *resource.Quantity) *resource.Quantity {
if q != nil {
return q
}
return &resource.Quantity{}
}
// computePodActions checks whether the pod spec has changed and returns the changes if true. // computePodActions checks whether the pod spec has changed and returns the changes if true.
func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions { func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions {
klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod)) klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod))