This commit is contained in:
Gautam Manchandani 2025-07-22 21:27:25 +08:00 committed by GitHub
commit 0d92d5bedb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 43 additions and 12 deletions

View File

@ -44,6 +44,9 @@ const (
// RollbackInBatchAnnotation is set to rollout annotations.
// RollbackInBatchAnnotation allow use disable quick rollback, and will roll back in batch style.
RollbackInBatchAnnotation = "rollouts.kruise.io/rollback-in-batch"
// RolloutFinalizer is the finalizer string that the Rollout controller adds to Rollout objects.
RolloutFinalizer = "rollouts.kruise.io/finalizer"
)
// RolloutSpec defines the desired state of Rollout

View File

@ -21,7 +21,9 @@ import (
"github.com/openkruise/rollouts/pkg/controller/batchrelease/context"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/control"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch"
"github.com/openkruise/rollouts/pkg/feature"
"github.com/openkruise/rollouts/pkg/util"
utilfeature "github.com/openkruise/rollouts/pkg/util/feature"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
@ -138,6 +140,14 @@ func (rc *realBatchControlPlane) Finalize() error {
return client.IgnoreNotFound(err)
}
// If Rollout CR was deleted and our gate is on, skip un-pause
if rc.release.DeletionTimestamp != nil &&
utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) {
klog.Infof("BatchRelease(%s/%s) deletion detected; skipping Finalize() because KeepDeploymentPausedOnDeletionGate is enabled",
rc.release.Namespace, rc.release.Name)
return nil
}
// release workload control info and clean up resources if it needs
return controller.Finalize(rc.release)
}

View File

@ -22,7 +22,9 @@ import (
"github.com/openkruise/rollouts/api/v1beta1"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/control"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch"
"github.com/openkruise/rollouts/pkg/feature"
"github.com/openkruise/rollouts/pkg/util"
utilfeature "github.com/openkruise/rollouts/pkg/util/feature"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/tools/record"
@ -152,24 +154,28 @@ func (rc *realCanaryController) EnsureBatchPodsReadyAndLabeled() error {
func (rc *realCanaryController) Finalize() error {
stable, err := rc.BuildStableController()
if client.IgnoreNotFound(err) != nil {
klog.Errorf("BatchRelease %v build stable controller err: %v", klog.KObj(rc.release), err)
klog.Errorf("…")
return err
}
err = stable.Finalize(rc.release)
if err != nil {
klog.Errorf("BatchRelease %v finalize stable err: %v", klog.KObj(rc.release), err)
return err
// If Rollout is deleted & gate is on, skip stable.Finalize()
if rc.release.DeletionTimestamp != nil &&
utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) {
klog.Infof("… skipping stable.Finalize()")
} else {
if err = stable.Finalize(rc.release); err != nil {
klog.Errorf("… finalize stable err: %v", err)
return err
}
}
canary, err := rc.BuildCanaryController(rc.release)
if client.IgnoreNotFound(err) != nil {
klog.Errorf("BatchRelease %v build canary controller err: %v", klog.KObj(rc.release), err)
klog.Errorf("… build canary err: %v", err)
return err
}
err = canary.Delete(rc.release)
if err != nil {
klog.Errorf("BatchRelease %v delete canary workload err: %v", klog.KObj(rc.release), err)
if err = canary.Delete(rc.release); err != nil {
klog.Errorf("… delete canary err: %v", err)
}
return err
}

View File

@ -24,7 +24,9 @@ import (
"github.com/openkruise/rollouts/api/v1beta1"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/control"
"github.com/openkruise/rollouts/pkg/controller/batchrelease/labelpatch"
"github.com/openkruise/rollouts/pkg/feature"
"github.com/openkruise/rollouts/pkg/util"
utilfeature "github.com/openkruise/rollouts/pkg/util/feature"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime/schema"
@ -143,6 +145,13 @@ func (rc *realBatchControlPlane) Finalize() error {
return client.IgnoreNotFound(err)
}
// If Rollout CR was deleted and our gate is on, skip un-pause
if rc.release.DeletionTimestamp != nil && utilfeature.DefaultMutableFeatureGate.Enabled(feature.KeepDeploymentPausedOnDeletionGate) {
klog.Infof("BatchRelease(%s/%s) deletion detected; skipping Finalize() because KeepDeploymentPausedOnDeletionGate is enabled",
rc.release.Namespace, rc.release.Name)
return nil
}
// release workload control info and clean up resources if it needs
return controller.Finalize(rc.release)
}

View File

@ -30,12 +30,15 @@ const (
AdvancedDeploymentGate featuregate.Feature = "AdvancedDeployment"
// AppendServiceSelectorGate enable appending pod labels from PodTemplateMetadata to the canary service selector.
AppendServiceSelectorGate featuregate.Feature = "AppendPodSelector"
// KeepDeploymentPausedOnDeletionGate prevents unpausing a Deployment when its managing Rollout CR is deleted.
KeepDeploymentPausedOnDeletionGate featuregate.Feature = "KeepDeploymentPausedOnDeletion"
)
var defaultFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
RolloutHistoryGate: {Default: false, PreRelease: featuregate.Alpha},
AdvancedDeploymentGate: {Default: false, PreRelease: featuregate.Alpha},
AppendServiceSelectorGate: {Default: false, PreRelease: featuregate.Alpha},
RolloutHistoryGate: {Default: false, PreRelease: featuregate.Alpha},
AdvancedDeploymentGate: {Default: false, PreRelease: featuregate.Alpha},
AppendServiceSelectorGate: {Default: false, PreRelease: featuregate.Alpha},
KeepDeploymentPausedOnDeletionGate: {Default: false, PreRelease: featuregate.Alpha},
}
func init() {