Added sidecar support in ValidatePodResize and dropNonResizeUpdates

This commit is contained in:
vivzbansal 2024-11-06 22:31:19 +00:00
parent cdddaed841
commit 3885d2f8ab
4 changed files with 31 additions and 115 deletions

View File

@ -5654,13 +5654,15 @@ func ValidatePodResize(newPod, oldPod *core.Pod, opts PodValidationOptions) fiel
// Ensure that only CPU and memory resources are mutable for restartable init containers.
var newInitContainers []core.Container
for ix, container := range originalCPUMemPodSpec.InitContainers {
if container.RestartPolicy != nil && *container.RestartPolicy == core.ContainerRestartPolicyAlways {
lim := dropCPUMemoryUpdates(container.Resources.Limits, oldPod.Spec.InitContainers[ix].Resources.Limits)
req := dropCPUMemoryUpdates(container.Resources.Requests, oldPod.Spec.InitContainers[ix].Resources.Requests)
container.Resources = core.ResourceRequirements{Limits: lim, Requests: req}
container.ResizePolicy = oldPod.Spec.InitContainers[ix].ResizePolicy // +k8s:verify-mutation:reason=clone
newInitContainers = append(newInitContainers, container)
if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) {
for ix, container := range originalCPUMemPodSpec.InitContainers {
if container.RestartPolicy != nil && *container.RestartPolicy == core.ContainerRestartPolicyAlways { // restartable init container
lim := dropCPUMemoryUpdates(container.Resources.Limits, oldPod.Spec.InitContainers[ix].Resources.Limits)
req := dropCPUMemoryUpdates(container.Resources.Requests, oldPod.Spec.InitContainers[ix].Resources.Requests)
container.Resources = core.ResourceRequirements{Limits: lim, Requests: req}
container.ResizePolicy = oldPod.Spec.InitContainers[ix].ResizePolicy // +k8s:verify-mutation:reason=clone
newInitContainers = append(newInitContainers, container)
}
}
}
if len(newInitContainers) > 0 {

View File

@ -289,18 +289,21 @@ var ResizeStrategy = podResizeStrategy{
),
}
// dropNonResizeUpdates discards all changes except for pod.Spec.Containers[*].Resources,ResizePolicy and certain metadata
// dropNonResizeUpdates discards all changes except for pod.Spec.Containers[*].Resources, pod.Spec.InitContainers[*].Resources, ResizePolicy, and certain metadata
func dropNonResizeUpdates(newPod, oldPod *api.Pod) *api.Pod {
pod := dropPodUpdates(newPod, oldPod)
// Containers are not allowed to be re-ordered, but in case they were,
// we don't want to corrupt them here. It will get caught in validation.
oldCtrToIndex := make(map[string]int)
oldInitCtrToIndex := make(map[string]int)
for idx, ctr := range pod.Spec.Containers {
oldCtrToIndex[ctr.Name] = idx
}
// TODO: Once we add in-place pod resize support for sidecars, we need to allow
// modifying sidecar resources via resize subresource too.
for idx, ctr := range pod.Spec.InitContainers {
oldInitCtrToIndex[ctr.Name] = idx
}
for _, ctr := range newPod.Spec.Containers {
idx, ok := oldCtrToIndex[ctr.Name]
if !ok {
@ -309,6 +312,21 @@ func dropNonResizeUpdates(newPod, oldPod *api.Pod) *api.Pod {
pod.Spec.Containers[idx].Resources = ctr.Resources
pod.Spec.Containers[idx].ResizePolicy = ctr.ResizePolicy
}
if utilfeature.DefaultFeatureGate.Enabled(features.SidecarContainers) {
for _, ctr := range newPod.Spec.InitContainers {
idx, ok := oldInitCtrToIndex[ctr.Name]
if !ok {
continue
}
// Changes are only allowed for restartable init containers.
if podutil.IsRestartableInitContainer(&ctr) {
pod.Spec.InitContainers[idx].Resources = ctr.Resources
pod.Spec.InitContainers[idx].ResizePolicy = ctr.ResizePolicy
}
}
}
return pod
}

View File

@ -456,52 +456,6 @@ func TestPodResourceRequests(t *testing.T) {
},
},
},
{
description: "resized with sidecar containers, infeasible",
hasSidecarContainer: true,
expectedRequests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("5"),
},
podResizeStatus: v1.PodResizeStatusInfeasible,
options: PodResourcesOptions{UseStatusResources: true},
containers: []v1.Container{
{
Name: "container-1",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("4"),
},
},
},
},
initContainers: []v1.Container{
{
Name: "restartable-init-1",
RestartPolicy: &restartAlways,
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("10"),
},
},
},
},
containerStatus: []v1.ContainerStatus{
{
Name: "container-1",
AllocatedResources: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("2"),
},
},
},
initContainerStatus: []v1.ContainerStatus{
{
Name: "restartable-init-1",
AllocatedResources: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("5"),
},
},
},
},
{
description: "resized with no sidecar containers, no resize status",
expectedRequests: v1.ResourceList{
@ -537,53 +491,6 @@ func TestPodResourceRequests(t *testing.T) {
},
},
},
{
description: "resized with sidecar containers, no resize status",
hasSidecarContainer: true,
expectedRequests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("3"),
},
options: PodResourcesOptions{UseStatusResources: true},
/* containers: []v1.Container{
{
Name: "container-1",
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("4"),
},
},
},
}, */
initContainers: []v1.Container{
{
Name: "restartable-init-1",
RestartPolicy: &restartAlways,
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("3"),
},
},
},
},
/* containerStatus: []v1.ContainerStatus{
{
Name: "container-1",
Resources: &v1.ResourceRequirements{
Requests: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("2"),
},
},
},
}, */
initContainerStatus: []v1.ContainerStatus{
{
Name: "restartable-init-1",
AllocatedResources: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("2"),
},
},
},
},
{
description: "resized, infeasible, but don't use status",
expectedRequests: v1.ResourceList{

View File

@ -162,15 +162,10 @@ func makeResizableContainer(tcInfo ResizableContainerInfo) v1.Container {
func MakePodWithResizableContainers(ns, name, timeStamp string, tcInfo []ResizableContainerInfo) *v1.Pod {
var testContainers []v1.Container
var testInitContainers []v1.Container
for _, ci := range tcInfo {
tc := makeResizableContainer(ci)
if ci.IsRestartableInitCtr {
testInitContainers = append(testInitContainers, tc)
} else {
testContainers = append(testContainers, tc)
}
testContainers = append(testContainers, tc)
}
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
@ -186,12 +181,6 @@ func MakePodWithResizableContainers(ns, name, timeStamp string, tcInfo []Resizab
RestartPolicy: v1.RestartPolicyOnFailure,
},
}
if len(testInitContainers) > 0 {
pod.Spec.RestartPolicy = v1.RestartPolicyAlways
pod.Spec.InitContainers = testInitContainers
}
return pod
}