diff --git a/housekeeper/operator/api/v1alpha1/update_types.go b/housekeeper/operator/api/v1alpha1/update_types.go index 7351fd49089b237db86b9e55b668931fb38f21a9..300e9504320768aba18a174c46d6783462c97f8e 100644 --- a/housekeeper/operator/api/v1alpha1/update_types.go +++ b/housekeeper/operator/api/v1alpha1/update_types.go @@ -27,9 +27,10 @@ import ( type UpdateSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "make" to regenerate code after modifying this file - OSVersion string `json:"osVersion"` - OSImageURL string `json:"osImageURL"` - KubeVersion string `json:"kubeVersion"` + OSVersion string `json:"osVersion"` + OSImageURL string `json:"osImageURL"` + KubeVersion string `json:"kubeVersion"` + EvictPodForce bool `json:"evictPodForce"` } // UpdateStatus defines the observed state of Update diff --git a/housekeeper/operator/config/crd/housekeeper.io_updates.yaml b/housekeeper/operator/config/crd/housekeeper.io_updates.yaml index 53cf004a6a0115657370aad518aabff0c95b6fe5..2938aa04722d3143d32f77bb51dfb473c5197889 100644 --- a/housekeeper/operator/config/crd/housekeeper.io_updates.yaml +++ b/housekeeper/operator/config/crd/housekeeper.io_updates.yaml @@ -44,10 +44,14 @@ spec: osVersion: description: 'The version used to upgrade OS' type: string + evictPodForce: + description: 'If true, force evict the pod' + type: boolean required: - kubeVersion - osImageURL - osVersion + - evictPodForce type: object status: description: UpdateStatus defines the observed state of Update diff --git a/housekeeper/operator/housekeeper-controller/controllers/update_controller.go b/housekeeper/operator/housekeeper-controller/controllers/update_controller.go index 654645177f59fb2f2757500d079e8c99c617976a..ea4e428aa8b33d163afe8e355f7265edd8c0c30a 100644 --- a/housekeeper/operator/housekeeper-controller/controllers/update_controller.go +++ b/housekeeper/operator/housekeeper-controller/controllers/update_controller.go @@ -102,13 +102,15 @@ func (r *UpdateReconciler) upgradeNodes(ctx context.Context, upInstance *houseke drainer := &drain.Helper{ Ctx: ctx, Client: r.KubeClientSet, - Force: true, IgnoreAllDaemonSets: true, DeleteEmptyDirData: true, GracePeriodSeconds: -1, Out: os.Stdout, ErrOut: os.Stderr, } + if upInstance.Spec.EvictPodForce { + drainer.Force = true + } if err := drainNode(drainer, node); err != nil { return err } @@ -129,14 +131,11 @@ func (r *UpdateReconciler) refreshNodes(ctx context.Context, upInstance *houseke deleteLabel(ctx, r, node) if node.Spec.Unschedulable { drainer := &drain.Helper{ - Ctx: ctx, - Client: r.KubeClientSet, - Force: true, - IgnoreAllDaemonSets: true, - DeleteEmptyDirData: true, - GracePeriodSeconds: -1, - Out: os.Stdout, - ErrOut: os.Stderr, + Ctx: ctx, + Client: r.KubeClientSet, + GracePeriodSeconds: -1, + Out: os.Stdout, + ErrOut: os.Stderr, } if err := cordonOrUncordonNode(false, drainer, node); err != nil { logrus.Errorf("failed to uncordon node %s: %v", node.Name, err)