Merge pull request #130509 from cici37/automated-cherry-pick-of-#130035-upstream-release-1.31
Automated cherry pick of #130035: [KEP-5080]Ordered Namespace Deletion
This commit is contained in:
@@ -32,9 +32,11 @@ import (
|
||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
"k8s.io/client-go/discovery"
|
||||
v1clientset "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
"k8s.io/client-go/metadata"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
)
|
||||
|
||||
// NamespacedResourcesDeleterInterface is the interface to delete a namespace with all resources in it.
|
||||
@@ -526,7 +528,46 @@ func (d *namespacedResourcesDeleter) deleteAllContent(ctx context.Context, ns *v
|
||||
gvrToNumRemaining: map[schema.GroupVersionResource]int{},
|
||||
finalizersToNumRemaining: map[string]int{},
|
||||
}
|
||||
|
||||
podsGVR := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
|
||||
if _, hasPods := groupVersionResources[podsGVR]; hasPods && utilfeature.DefaultFeatureGate.Enabled(features.OrderedNamespaceDeletion) {
|
||||
// Ensure all pods in the namespace are deleted first
|
||||
gvrDeletionMetadata, err := d.deleteAllContentForGroupVersionResource(ctx, podsGVR, namespace, namespaceDeletedAt)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to delete pods for namespace: %s, err: %w", namespace, err))
|
||||
conditionUpdater.ProcessDeleteContentErr(err)
|
||||
}
|
||||
if gvrDeletionMetadata.finalizerEstimateSeconds > estimate {
|
||||
estimate = gvrDeletionMetadata.finalizerEstimateSeconds
|
||||
}
|
||||
if gvrDeletionMetadata.numRemaining > 0 {
|
||||
numRemainingTotals.gvrToNumRemaining[podsGVR] = gvrDeletionMetadata.numRemaining
|
||||
for finalizer, numRemaining := range gvrDeletionMetadata.finalizersToNumRemaining {
|
||||
if numRemaining == 0 {
|
||||
continue
|
||||
}
|
||||
numRemainingTotals.finalizersToNumRemaining[finalizer] += numRemaining
|
||||
}
|
||||
}
|
||||
|
||||
// Check if any pods remain before proceeding to delete other resources
|
||||
if numRemainingTotals.gvrToNumRemaining[podsGVR] > 0 {
|
||||
logger.V(5).Info("Namespace controller - pods still remain, delaying deletion of other resources", "namespace", namespace)
|
||||
if hasChanged := conditionUpdater.Update(ns); hasChanged {
|
||||
if _, err = d.nsClient.UpdateStatus(ctx, ns, metav1.UpdateOptions{}); err != nil {
|
||||
utilruntime.HandleError(fmt.Errorf("couldn't update status condition for namespace %q: %w", namespace, err))
|
||||
}
|
||||
}
|
||||
return estimate, utilerrors.NewAggregate(errs)
|
||||
}
|
||||
}
|
||||
|
||||
// Proceed with deleting other resources in the namespace
|
||||
for gvr := range groupVersionResources {
|
||||
if utilfeature.DefaultFeatureGate.Enabled(features.OrderedNamespaceDeletion) && gvr.Group == podsGVR.Group &&
|
||||
gvr.Version == podsGVR.Version && gvr.Resource == podsGVR.Resource {
|
||||
continue
|
||||
}
|
||||
gvrDeletionMetadata, err := d.deleteAllContentForGroupVersionResource(ctx, gvr, namespace, namespaceDeletedAt)
|
||||
if err != nil {
|
||||
// If there is an error, hold on to it but proceed with all the remaining
|
||||
|
||||
@@ -546,6 +546,12 @@ const (
|
||||
// Permits kubelet to run with swap enabled.
|
||||
NodeSwap featuregate.Feature = "NodeSwap"
|
||||
|
||||
// owner: @cici37
|
||||
// kep: https://kep.k8s.io/5080
|
||||
//
|
||||
// Enables ordered namespace deletion.
|
||||
OrderedNamespaceDeletion featuregate.Feature = "OrderedNamespaceDeletion"
|
||||
|
||||
// owner: @mortent, @atiratree, @ravig
|
||||
// kep: http://kep.k8s.io/3018
|
||||
// alpha: v1.26
|
||||
@@ -1137,6 +1143,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
||||
|
||||
NodeSwap: {Default: true, PreRelease: featuregate.Beta},
|
||||
|
||||
OrderedNamespaceDeletion: {Default: false, PreRelease: featuregate.Beta},
|
||||
|
||||
PDBUnhealthyPodEvictionPolicy: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.33
|
||||
|
||||
PersistentVolumeLastPhaseTransitionTime: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.33
|
||||
|
||||
Reference in New Issue
Block a user