mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-11 21:12:07 +00:00
kubeadm: Make etcd member removal idempotent
If the etcd member is not found, then it has already been removed, and kubeadm reset should immediately complete the 'remove-etcd-member' phase. Previously, the phase would complete only once the exponential-backoff retry expired, up to 3 minutes duration. This commit also fixes a semantic error in etcd.GetMemberID. Previously, the function returned 0 if no member was found, but 0 is not a valid member ID.
This commit is contained in:
parent
44a93d0b9d
commit
5fd5768ef3
@ -118,6 +118,10 @@ func RemoveStackedEtcdMemberFromCluster(client clientset.Interface, cfg *kubeadm
|
|||||||
klog.V(2).Infof("[etcd] get the member id from peer: %s", etcdPeerAddress)
|
klog.V(2).Infof("[etcd] get the member id from peer: %s", etcdPeerAddress)
|
||||||
id, err := etcdClient.GetMemberID(etcdPeerAddress)
|
id, err := etcdClient.GetMemberID(etcdPeerAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(etcdutil.ErrNoMemberIDForPeerURL, err) {
|
||||||
|
klog.V(5).Infof("[etcd] member was already removed, because no member id exists for peer %s", etcdPeerAddress)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,6 +53,8 @@ var etcdBackoff = wait.Backoff{
|
|||||||
Jitter: 0.1,
|
Jitter: 0.1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrNoMemberIDForPeerURL = errors.New("no member id found for peer URL")
|
||||||
|
|
||||||
// ClusterInterrogator is an interface to get etcd cluster related information
|
// ClusterInterrogator is an interface to get etcd cluster related information
|
||||||
type ClusterInterrogator interface {
|
type ClusterInterrogator interface {
|
||||||
CheckClusterHealth() error
|
CheckClusterHealth() error
|
||||||
@ -310,7 +312,7 @@ func (c *Client) GetMemberID(peerURL string) (uint64, error) {
|
|||||||
return member.GetID(), nil
|
return member.GetID(), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0, nil
|
return 0, ErrNoMemberIDForPeerURL
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListMembers returns the member list.
|
// ListMembers returns the member list.
|
||||||
@ -346,6 +348,10 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
if errors.Is(rpctypes.ErrMemberNotFound, err) {
|
||||||
|
klog.V(5).Infof("Member was already removed, because member %016x was not found", id)
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
klog.V(5).Infof("Failed to remove etcd member: %v", err)
|
klog.V(5).Infof("Failed to remove etcd member: %v", err)
|
||||||
lastError = err
|
lastError = err
|
||||||
return false, nil
|
return false, nil
|
||||||
|
@ -423,7 +423,7 @@ func TestClient_GetMemberID(t *testing.T) {
|
|||||||
fields fields
|
fields fields
|
||||||
args args
|
args args
|
||||||
want uint64
|
want uint64
|
||||||
wantErr bool
|
wantErr error
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "member ID found",
|
name: "member ID found",
|
||||||
@ -447,7 +447,7 @@ func TestClient_GetMemberID(t *testing.T) {
|
|||||||
args: args{
|
args: args{
|
||||||
peerURL: "https://member1:2380",
|
peerURL: "https://member1:2380",
|
||||||
},
|
},
|
||||||
wantErr: false,
|
wantErr: nil,
|
||||||
want: 1,
|
want: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -472,7 +472,7 @@ func TestClient_GetMemberID(t *testing.T) {
|
|||||||
args: args{
|
args: args{
|
||||||
peerURL: "https://member2:2380",
|
peerURL: "https://member2:2380",
|
||||||
},
|
},
|
||||||
wantErr: false,
|
wantErr: ErrNoMemberIDForPeerURL,
|
||||||
want: 0,
|
want: 0,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -484,7 +484,7 @@ func TestClient_GetMemberID(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
got, err := c.GetMemberID(tt.args.peerURL)
|
got, err := c.GetMemberID(tt.args.peerURL)
|
||||||
if (err != nil) != tt.wantErr {
|
if !errors.Is(tt.wantErr, err) {
|
||||||
t.Errorf("Client.GetMemberID() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("Client.GetMemberID() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user