Skip to content

Commit d702d26

Browse files
authored
Merge pull request kubernetes#127291 from zhifei92/fix-apiserver-unexpected-panic
[FG:InPlacePodVerticalScaling] Fixed the apiserver panic issue that occurred when adding a container during pod updates in the InPlacePodVerticalScaling scenario.
2 parents a0e5e24 + 5c01709 commit d702d26

File tree

2 files changed

+188
-0
lines changed

2 files changed

+188
-0
lines changed

pkg/api/pod/util.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,6 +1255,11 @@ func hasInvalidLabelValueInAffinitySelector(spec *api.PodSpec) bool {
12551255
}
12561256

12571257
func MarkPodProposedForResize(oldPod, newPod *api.Pod) {
1258+
if len(newPod.Spec.Containers) != len(oldPod.Spec.Containers) {
1259+
// Update is invalid: ignore changes and let validation handle it
1260+
return
1261+
}
1262+
12581263
for i, c := range newPod.Spec.Containers {
12591264
if c.Resources.Requests == nil {
12601265
continue

pkg/api/pod/util_test.go

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,6 +3036,189 @@ func TestMarkPodProposedForResize(t *testing.T) {
30363036
},
30373037
},
30383038
},
3039+
{
3040+
desc: "the number of containers in the pod has increased; no action should be taken.",
3041+
newPod: &api.Pod{
3042+
Spec: api.PodSpec{
3043+
Containers: []api.Container{
3044+
{
3045+
Name: "c1",
3046+
Image: "image",
3047+
Resources: api.ResourceRequirements{
3048+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3049+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3050+
},
3051+
},
3052+
{
3053+
Name: "c2",
3054+
Image: "image",
3055+
Resources: api.ResourceRequirements{
3056+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")},
3057+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("400m")},
3058+
},
3059+
},
3060+
},
3061+
},
3062+
Status: api.PodStatus{
3063+
ContainerStatuses: []api.ContainerStatus{
3064+
{
3065+
Name: "c1",
3066+
Image: "image",
3067+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3068+
},
3069+
{
3070+
Name: "c2",
3071+
Image: "image",
3072+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3073+
},
3074+
},
3075+
},
3076+
},
3077+
oldPod: &api.Pod{
3078+
Spec: api.PodSpec{
3079+
Containers: []api.Container{
3080+
{
3081+
Name: "c1",
3082+
Image: "image",
3083+
Resources: api.ResourceRequirements{
3084+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3085+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3086+
},
3087+
},
3088+
},
3089+
},
3090+
Status: api.PodStatus{
3091+
ContainerStatuses: []api.ContainerStatus{
3092+
{
3093+
Name: "c1",
3094+
Image: "image",
3095+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3096+
},
3097+
},
3098+
},
3099+
},
3100+
expectedPod: &api.Pod{
3101+
Spec: api.PodSpec{
3102+
Containers: []api.Container{
3103+
{
3104+
Name: "c1",
3105+
Image: "image",
3106+
Resources: api.ResourceRequirements{
3107+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3108+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3109+
},
3110+
},
3111+
{
3112+
Name: "c2",
3113+
Image: "image",
3114+
Resources: api.ResourceRequirements{
3115+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")},
3116+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("400m")},
3117+
},
3118+
},
3119+
},
3120+
},
3121+
Status: api.PodStatus{
3122+
ContainerStatuses: []api.ContainerStatus{
3123+
{
3124+
Name: "c1",
3125+
Image: "image",
3126+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3127+
},
3128+
{
3129+
Name: "c2",
3130+
Image: "image",
3131+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3132+
},
3133+
},
3134+
},
3135+
},
3136+
},
3137+
{
3138+
desc: "the number of containers in the pod has decreased; no action should be taken.",
3139+
newPod: &api.Pod{
3140+
Spec: api.PodSpec{
3141+
Containers: []api.Container{
3142+
{
3143+
Name: "c1",
3144+
Image: "image",
3145+
Resources: api.ResourceRequirements{
3146+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3147+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3148+
},
3149+
},
3150+
},
3151+
},
3152+
Status: api.PodStatus{
3153+
ContainerStatuses: []api.ContainerStatus{
3154+
{
3155+
Name: "c1",
3156+
Image: "image",
3157+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3158+
},
3159+
},
3160+
},
3161+
},
3162+
oldPod: &api.Pod{
3163+
Spec: api.PodSpec{
3164+
Containers: []api.Container{
3165+
{
3166+
Name: "c1",
3167+
Image: "image",
3168+
Resources: api.ResourceRequirements{
3169+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3170+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3171+
},
3172+
},
3173+
{
3174+
Name: "c2",
3175+
Image: "image",
3176+
Resources: api.ResourceRequirements{
3177+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3178+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("300m")},
3179+
},
3180+
},
3181+
},
3182+
},
3183+
Status: api.PodStatus{
3184+
ContainerStatuses: []api.ContainerStatus{
3185+
{
3186+
Name: "c1",
3187+
Image: "image",
3188+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3189+
},
3190+
{
3191+
Name: "c2",
3192+
Image: "image",
3193+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3194+
},
3195+
},
3196+
},
3197+
},
3198+
expectedPod: &api.Pod{
3199+
Spec: api.PodSpec{
3200+
Containers: []api.Container{
3201+
{
3202+
Name: "c1",
3203+
Image: "image",
3204+
Resources: api.ResourceRequirements{
3205+
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3206+
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("200m")},
3207+
},
3208+
},
3209+
},
3210+
},
3211+
Status: api.PodStatus{
3212+
ContainerStatuses: []api.ContainerStatus{
3213+
{
3214+
Name: "c1",
3215+
Image: "image",
3216+
AllocatedResources: api.ResourceList{api.ResourceCPU: resource.MustParse("100m")},
3217+
},
3218+
},
3219+
},
3220+
},
3221+
},
30393222
}
30403223
for _, tc := range testCases {
30413224
t.Run(tc.desc, func(t *testing.T) {

0 commit comments

Comments
 (0)