mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-12 13:31:52 +00:00
Fix ResizeStatus state transitions
This commit is contained in:
parent
04aeb40793
commit
84201658c3
@ -115,6 +115,7 @@ import (
|
|||||||
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/userns"
|
"k8s.io/kubernetes/pkg/kubelet/userns"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util"
|
"k8s.io/kubernetes/pkg/kubelet/util"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/util/format"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util/manager"
|
"k8s.io/kubernetes/pkg/kubelet/util/manager"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util/queue"
|
"k8s.io/kubernetes/pkg/kubelet/util/queue"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/util/sliceutils"
|
"k8s.io/kubernetes/pkg/kubelet/util/sliceutils"
|
||||||
@ -2813,6 +2814,14 @@ func (kl *Kubelet) canResizePod(pod *v1.Pod) (bool, v1.PodResizeStatus) {
|
|||||||
func (kl *Kubelet) handlePodResourcesResize(pod *v1.Pod) (*v1.Pod, error) {
|
func (kl *Kubelet) handlePodResourcesResize(pod *v1.Pod) (*v1.Pod, error) {
|
||||||
allocatedPod, updated := kl.statusManager.UpdatePodFromAllocation(pod)
|
allocatedPod, updated := kl.statusManager.UpdatePodFromAllocation(pod)
|
||||||
if !updated {
|
if !updated {
|
||||||
|
// Unless a resize is in-progress, clear the resize status.
|
||||||
|
resizeStatus, _ := kl.statusManager.GetPodResizeStatus(string(pod.UID))
|
||||||
|
if resizeStatus != v1.PodResizeStatusInProgress {
|
||||||
|
if err := kl.statusManager.SetPodResizeStatus(pod.UID, ""); err != nil {
|
||||||
|
klog.ErrorS(err, "Failed to clear resize status", "pod", format.Pod(pod))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Pod is not resizing, nothing more to do here.
|
// Pod is not resizing, nothing more to do here.
|
||||||
return allocatedPod, nil
|
return allocatedPod, nil
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/kubelet/metrics"
|
"k8s.io/kubernetes/pkg/kubelet/metrics"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/status"
|
"k8s.io/kubernetes/pkg/kubelet/status"
|
||||||
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/util/format"
|
||||||
utilfs "k8s.io/kubernetes/pkg/util/filesystem"
|
utilfs "k8s.io/kubernetes/pkg/util/filesystem"
|
||||||
utilkernel "k8s.io/kubernetes/pkg/util/kernel"
|
utilkernel "k8s.io/kubernetes/pkg/util/kernel"
|
||||||
utilpod "k8s.io/kubernetes/pkg/util/pod"
|
utilpod "k8s.io/kubernetes/pkg/util/pod"
|
||||||
@ -1740,19 +1741,30 @@ func getPhase(pod *v1.Pod, info []v1.ContainerStatus, podIsTerminal bool) v1.Pod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kl *Kubelet) determinePodResizeStatus(allocatedPod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodResizeStatus {
|
func (kl *Kubelet) determinePodResizeStatus(allocatedPod *v1.Pod, podStatus *kubecontainer.PodStatus, podIsTerminal bool) v1.PodResizeStatus {
|
||||||
var podResizeStatus v1.PodResizeStatus
|
if kubetypes.IsStaticPod(allocatedPod) {
|
||||||
if allocatedResourcesMatchStatus(allocatedPod, podStatus) {
|
return ""
|
||||||
// Clear last resize state from checkpoint
|
}
|
||||||
|
|
||||||
|
// If pod is terminal, clear the resize status.
|
||||||
|
if podIsTerminal {
|
||||||
if err := kl.statusManager.SetPodResizeStatus(allocatedPod.UID, ""); err != nil {
|
if err := kl.statusManager.SetPodResizeStatus(allocatedPod.UID, ""); err != nil {
|
||||||
klog.ErrorS(err, "SetPodResizeStatus failed", "pod", allocatedPod.Name)
|
klog.ErrorS(err, "SetPodResizeStatus failed for terminal pod", "pod", format.Pod(allocatedPod))
|
||||||
}
|
}
|
||||||
} else {
|
return ""
|
||||||
if resizeStatus, found := kl.statusManager.GetPodResizeStatus(string(allocatedPod.UID)); found {
|
|
||||||
podResizeStatus = resizeStatus
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resizeStatus, _ := kl.statusManager.GetPodResizeStatus(string(allocatedPod.UID))
|
||||||
|
// If the resize was in-progress and the actual resources match the allocated resources, mark
|
||||||
|
// the resize as complete by clearing the resize status.
|
||||||
|
if resizeStatus == v1.PodResizeStatusInProgress &&
|
||||||
|
allocatedResourcesMatchStatus(allocatedPod, podStatus) {
|
||||||
|
if err := kl.statusManager.SetPodResizeStatus(allocatedPod.UID, ""); err != nil {
|
||||||
|
klog.ErrorS(err, "SetPodResizeStatus failed", "pod", format.Pod(allocatedPod))
|
||||||
}
|
}
|
||||||
return podResizeStatus
|
return ""
|
||||||
|
}
|
||||||
|
return resizeStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocatedResourcesMatchStatus tests whether the resizeable resources in the pod spec match the
|
// allocatedResourcesMatchStatus tests whether the resizeable resources in the pod spec match the
|
||||||
@ -1798,7 +1810,7 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
|
|||||||
}
|
}
|
||||||
s := kl.convertStatusToAPIStatus(pod, podStatus, oldPodStatus)
|
s := kl.convertStatusToAPIStatus(pod, podStatus, oldPodStatus)
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) {
|
||||||
s.Resize = kl.determinePodResizeStatus(pod, podStatus)
|
s.Resize = kl.determinePodResizeStatus(pod, podStatus, podIsTerminal)
|
||||||
}
|
}
|
||||||
// calculate the next phase and preserve reason
|
// calculate the next phase and preserve reason
|
||||||
allStatus := append(append([]v1.ContainerStatus{}, s.ContainerStatuses...), s.InitContainerStatuses...)
|
allStatus := append(append([]v1.ContainerStatus{}, s.ContainerStatuses...), s.InitContainerStatuses...)
|
||||||
|
Loading…
Reference in New Issue
Block a user