Skip to content

Commit 4c2be4b

Browse files
committed
kubelet sets observedGeneration in conditions
1 parent ded2956 commit 4c2be4b

File tree

14 files changed

+216
-121
lines changed

14 files changed

+216
-121
lines changed

pkg/api/v1/pod/util.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,16 +432,16 @@ func GetPodObservedGenerationIfEnabled(pod *v1.Pod) int64 {
432432
// We will emit condition.observedGeneration if the feature is enabled OR if condition.observedGeneration is already set.
433433
// This protects against an infinite loop of kubelet trying to clear the value after the FG is turned off, and
434434
// the API server preserving existing values when an incoming update tries to clear it.
435-
func GetPodObservedGenerationIfEnabledOnCondition(pod *v1.Pod, conditionType v1.PodConditionType) int64 {
436-
if pod == nil {
435+
func GetPodObservedGenerationIfEnabledOnCondition(podStatus *v1.PodStatus, generation int64, conditionType v1.PodConditionType) int64 {
436+
if podStatus == nil {
437437
return 0
438438
}
439439
if utilfeature.DefaultFeatureGate.Enabled(features.PodObservedGenerationTracking) {
440-
return pod.Generation
440+
return generation
441441
}
442-
for _, condition := range pod.Status.Conditions {
442+
for _, condition := range podStatus.Conditions {
443443
if condition.Type == conditionType && condition.ObservedGeneration != 0 {
444-
return pod.Generation
444+
return generation
445445
}
446446
}
447447
return 0

pkg/controller/disruption/disruption.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,7 @@ func (dc *DisruptionController) syncStalePodDisruption(ctx context.Context, key
790790
newPod := pod.DeepCopy()
791791
updated := apipod.UpdatePodCondition(&newPod.Status, &v1.PodCondition{
792792
Type: v1.DisruptionTarget,
793-
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(newPod, v1.DisruptionTarget),
793+
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(&newPod.Status, newPod.Generation, v1.DisruptionTarget),
794794
Status: v1.ConditionFalse,
795795
})
796796
if !updated {

pkg/controller/podgc/gc_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func (gcc *PodGCController) gcOrphaned(ctx context.Context, pods []*v1.Pod, node
247247
logger.V(2).Info("Found orphaned Pod assigned to the Node, deleting", "pod", klog.KObj(pod), "node", klog.KRef("", pod.Spec.NodeName))
248248
condition := &v1.PodCondition{
249249
Type: v1.DisruptionTarget,
250-
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(pod, v1.DisruptionTarget),
250+
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(&pod.Status, pod.Generation, v1.DisruptionTarget),
251251
Status: v1.ConditionTrue,
252252
Reason: "DeletionByPodGC",
253253
Message: "PodGC: node no longer exists",

pkg/controller/tainteviction/taint_eviction.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func addConditionAndDeletePod(ctx context.Context, c clientset.Interface, name,
134134
newStatus := pod.Status.DeepCopy()
135135
updated := apipod.UpdatePodCondition(newStatus, &v1.PodCondition{
136136
Type: v1.DisruptionTarget,
137-
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(pod, v1.DisruptionTarget),
137+
ObservedGeneration: apipod.GetPodObservedGenerationIfEnabledOnCondition(&pod.Status, pod.Generation, v1.DisruptionTarget),
138138
Status: v1.ConditionTrue,
139139
Reason: "DeletionByTaintManager",
140140
Message: "Taint manager: deleting due to NoExecute taint",

pkg/kubelet/eviction/eviction_manager.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,10 +425,11 @@ func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc Act
425425

426426
message, annotations := evictionMessage(resourceToReclaim, pod, statsFunc, thresholds, observations)
427427
condition := &v1.PodCondition{
428-
Type: v1.DisruptionTarget,
429-
Status: v1.ConditionTrue,
430-
Reason: v1.PodReasonTerminationByKubelet,
431-
Message: message,
428+
Type: v1.DisruptionTarget,
429+
ObservedGeneration: pod.Generation,
430+
Status: v1.ConditionTrue,
431+
Reason: v1.PodReasonTerminationByKubelet,
432+
Message: message,
432433
}
433434
if m.evictPod(pod, gracePeriodOverride, message, annotations, condition) {
434435
metrics.Evictions.WithLabelValues(string(thresholdToReclaim.Signal)).Inc()
@@ -618,6 +619,7 @@ func (m *managerImpl) evictPod(pod *v1.Pod, gracePeriodOverride int64, evictMsg
618619
status.Reason = Reason
619620
status.Message = evictMsg
620621
if condition != nil {
622+
condition.ObservedGeneration = podutil.GetPodObservedGenerationIfEnabledOnCondition(status, pod.Generation, v1.DisruptionTarget)
621623
podutil.UpdatePodCondition(status, condition)
622624
}
623625
})

pkg/kubelet/kubelet_pods.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,7 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
18281828
if utilfeature.DefaultFeatureGate.Enabled(features.InPlacePodVerticalScaling) {
18291829
resizeStatus := kl.determinePodResizeStatus(pod, podIsTerminal)
18301830
for _, c := range resizeStatus {
1831+
c.ObservedGeneration = podutil.GetPodObservedGenerationIfEnabledOnCondition(&oldPodStatus, pod.Generation, c.Type)
18311832
s.Conditions = append(s.Conditions, *c)
18321833
}
18331834
}
@@ -1843,15 +1844,16 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
18431844

18441845
// set all Kubelet-owned conditions
18451846
if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) {
1846-
s.Conditions = append(s.Conditions, status.GeneratePodReadyToStartContainersCondition(pod, podStatus))
1847+
s.Conditions = append(s.Conditions, status.GeneratePodReadyToStartContainersCondition(pod, &oldPodStatus, podStatus))
18471848
}
18481849
allContainerStatuses := append(s.InitContainerStatuses, s.ContainerStatuses...)
1849-
s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(&pod.Spec, allContainerStatuses, s.Phase))
1850-
s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(&pod.Spec, s.Conditions, allContainerStatuses, s.Phase))
1851-
s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(&pod.Spec, allContainerStatuses, s.Phase))
1850+
s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(pod, &oldPodStatus, allContainerStatuses, s.Phase))
1851+
s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(pod, &oldPodStatus, s.Conditions, allContainerStatuses, s.Phase))
1852+
s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(pod, &oldPodStatus, allContainerStatuses, s.Phase))
18521853
s.Conditions = append(s.Conditions, v1.PodCondition{
1853-
Type: v1.PodScheduled,
1854-
Status: v1.ConditionTrue,
1854+
Type: v1.PodScheduled,
1855+
ObservedGeneration: podutil.GetPodObservedGenerationIfEnabledOnCondition(&oldPodStatus, pod.Generation, v1.PodScheduled),
1856+
Status: v1.ConditionTrue,
18551857
})
18561858
// set HostIP/HostIPs and initialize PodIP/PodIPs for host network pods
18571859
if kl.kubeClient != nil {

pkg/kubelet/nodeshutdown/nodeshutdown_manager.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,11 @@ func (m *podManager) killPods(activePods []*v1.Pod) error {
160160
status.Message = nodeShutdownMessage
161161
status.Reason = nodeShutdownReason
162162
podutil.UpdatePodCondition(status, &v1.PodCondition{
163-
Type: v1.DisruptionTarget,
164-
Status: v1.ConditionTrue,
165-
Reason: v1.PodReasonTerminationByKubelet,
166-
Message: nodeShutdownMessage,
163+
Type: v1.DisruptionTarget,
164+
ObservedGeneration: podutil.GetPodObservedGenerationIfEnabledOnCondition(status, pod.Generation, v1.DisruptionTarget),
165+
Status: v1.ConditionTrue,
166+
Reason: v1.PodReasonTerminationByKubelet,
167+
Message: nodeShutdownMessage,
167168
})
168169
}); err != nil {
169170
m.logger.V(1).Info("Shutdown manager failed killing pod", "pod", klog.KObj(pod), "err", err)

pkg/kubelet/preemption/preemption.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,11 @@ func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(admitPod *v1.Pod,
105105
status.Reason = events.PreemptContainer
106106
status.Message = message
107107
podutil.UpdatePodCondition(status, &v1.PodCondition{
108-
Type: v1.DisruptionTarget,
109-
Status: v1.ConditionTrue,
110-
Reason: v1.PodReasonTerminationByKubelet,
111-
Message: "Pod was preempted by Kubelet to accommodate a critical pod.",
108+
Type: v1.DisruptionTarget,
109+
ObservedGeneration: podutil.GetPodObservedGenerationIfEnabledOnCondition(status, pod.Generation, v1.DisruptionTarget),
110+
Status: v1.ConditionTrue,
111+
Reason: v1.PodReasonTerminationByKubelet,
112+
Message: "Pod was preempted by Kubelet to accommodate a critical pod.",
112113
})
113114
})
114115
if err != nil {

0 commit comments

Comments
 (0)