From 0166d23783f678eda3dafd9ff83b5d3a5c436f4b Mon Sep 17 00:00:00 2001 From: SataQiu Date: Tue, 24 Sep 2024 22:53:42 +0800 Subject: [PATCH] kubeadm: check the member list status before adding or removing an etcd member --- cmd/kubeadm/app/util/etcd/etcd.go | 43 ++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/cmd/kubeadm/app/util/etcd/etcd.go b/cmd/kubeadm/app/util/etcd/etcd.go index 43d6cc2fce2..a1ab8897d62 100644 --- a/cmd/kubeadm/app/util/etcd/etcd.go +++ b/cmd/kubeadm/app/util/etcd/etcd.go @@ -360,8 +360,28 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) { defer func() { _ = cli.Close() }() ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout) + defer cancel() + + // List members and quickly return if the member does not exist. + listResp, err := cli.MemberList(ctx) + if err != nil { + klog.V(5).Infof("Failed to check whether the member %s exists: %v", strconv.FormatUint(id, 16), err) + lastError = err + return false, nil + } + found := false + for _, member := range listResp.Members { + if member.GetID() == id { + found = true + break + } + } + if !found { + klog.V(5).Infof("Member %s was not found; assuming it was already removed", strconv.FormatUint(id, 16)) + return true, nil + } + resp, err = cli.MemberRemove(ctx, id) - cancel() if err == nil { return true, nil } @@ -427,6 +447,27 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem true, func(_ context.Context) (bool, error) { ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout) defer cancel() + + // List members and quickly return if the member already exists. + listResp, err := cli.MemberList(ctx) + if err != nil { + klog.V(5).Infof("Failed to check whether the member %q exists: %v", peerAddrs, err) + lastError = err + return false, nil + } + found := false + for _, member := range listResp.Members { + if member.GetPeerURLs()[0] == peerAddrs { + found = true + break + } + } + if found { + klog.V(5).Infof("The peer URL %q for the added etcd member already exists. Skipping etcd member addition", peerAddrs) + respMembers = listResp.Members + return true, nil + } + if isLearner { klog.V(1).Infof("[etcd] Adding etcd member %q as learner", peerAddrs) resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs})