From 94af045324abf1c2e4312a75e2fa5c5901ef56ca Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Sat, 13 Jun 2020 22:38:05 +0300 Subject: [PATCH] kubeadm: don't re-add an etcd member if it already exists for "join" If an etcd member with the same address already exists, don't re-add it. Instead, use the existing member list for creating the "initial cluster" that is written for this etcd server instance static Pod. --- cmd/kubeadm/app/phases/etcd/local.go | 30 +++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cmd/kubeadm/app/phases/etcd/local.go b/cmd/kubeadm/app/phases/etcd/local.go index 343a8df2d1e..fd9df8f7309 100644 --- a/cmd/kubeadm/app/phases/etcd/local.go +++ b/cmd/kubeadm/app/phases/etcd/local.go @@ -149,16 +149,36 @@ func CreateStackedEtcdStaticPodManifestFile(client clientset.Interface, manifest return err } - // notifies the other members of the etcd cluster about the joining member etcdPeerAddress := etcdutil.GetPeerURL(endpoint) - klog.V(1).Infof("Adding etcd member: %s", etcdPeerAddress) - initialCluster, err := etcdClient.AddMember(nodeName, etcdPeerAddress) + klog.V(1).Infoln("[etcd] Getting the list of existing members") + initialCluster, err := etcdClient.ListMembers() if err != nil { return err } - fmt.Println("[etcd] Announced new etcd member joining to the existing etcd cluster") - klog.V(1).Infof("Updated etcd member list: %v", initialCluster) + + // only add the new member if it doesn't already exists + var exists bool + klog.V(1).Infof("[etcd] Checking if the etcd member already exists: %s", etcdPeerAddress) + for _, member := range initialCluster { + if member.PeerURL == etcdPeerAddress { + exists = true + break + } + } + + if exists { + klog.V(1).Infof("[etcd] Etcd member already exists: %s", endpoint) + } else { + klog.V(1).Infof("[etcd] Adding etcd member: %s", etcdPeerAddress) + initialCluster, err = etcdClient.AddMember(nodeName, etcdPeerAddress) + if err != nil { + return err + } + + fmt.Println("[etcd] Announced new etcd member joining to the existing etcd cluster") + klog.V(1).Infof("Updated etcd member list: %v", initialCluster) + } fmt.Printf("[etcd] Creating static Pod manifest for %q\n", kubeadmconstants.Etcd)