@@ -270,9 +270,10 @@ func (e *EtcdMemberReconciler) watchEtcdMembers(ctx context.Context, client etcd
270270}
271271
272272// leaveIfMarked watches this node's own EtcdMember for Spec.Leave=true, then
273- // removes itself from the etcd cluster and shuts down k0s. If self-removal
274- // fails (with retries), it reports the failure in status and stays running so
275- // the leader's dead-node fallback can remove the stale membership entry.
273+ // removes itself from the etcd cluster and shuts down k0s. Status updates are
274+ // intentionally left to the leader: after DeleteMember succeeds this node is
275+ // no longer part of etcd, so any k8s API write would fail. The leader will
276+ // detect the removal on its next reconcile and update the status accordingly.
276277func (e * EtcdMemberReconciler ) leaveIfMarked (ctx context.Context , log logrus.FieldLogger , client etcdclient.EtcdMemberInterface ) {
277278 name := e .etcdConfig .GetMemberName ()
278279 name , err := nodeutil .GetHostname (name )
@@ -341,13 +342,8 @@ func (e *EtcdMemberReconciler) leaveIfMarked(ctx context.Context, log logrus.Fie
341342 return
342343 }
343344
345+ time .Sleep (5 * time .Second )
344346 log .Info ("Successfully removed self from etcd cluster; shutting down" )
345- member .Status .ReconcileStatus = etcdv1beta1 .ReconcileStatusSuccess
346- member .Status .Message = "Member removed from cluster"
347- member .Status .SetCondition (etcdv1beta1 .ConditionTypeJoined , etcdv1beta1 .ConditionFalse , member .Status .Message , time .Now ())
348- if _ , statusErr := client .UpdateStatus (ctx , member , metav1.UpdateOptions {}); statusErr != nil {
349- log .WithError (statusErr ).Warn ("Failed to update EtcdMember status after self-removal" )
350- }
351347 e .shutdown (errors .New ("etcd member leave requested" ))
352348}
353349
0 commit comments