Skip to content

Commit 02637bb

Browse files
authored
Merge pull request kubernetes#91145 from tnqn/kubeadm-reset-error
kubeadm: skip removing last etcd member in reset phase
2 parents d680e05 + 9cc416e commit 02637bb

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

cmd/kubeadm/app/phases/etcd/local.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ func RemoveStackedEtcdMemberFromCluster(client clientset.Interface, cfg *kubeadm
103103
return err
104104
}
105105

106+
members, err := etcdClient.ListMembers()
107+
if err != nil {
108+
return err
109+
}
110+
// If this is the only remaining stacked etcd member in the cluster, calling RemoveMember()
111+
// is not needed.
112+
if len(members) == 1 {
113+
etcdClientAddress := etcdutil.GetClientURL(&cfg.LocalAPIEndpoint)
114+
for _, endpoint := range etcdClient.Endpoints {
115+
if endpoint == etcdClientAddress {
116+
klog.V(1).Info("[etcd] This is the only remaining etcd member in the etcd cluster, skip removing it")
117+
return nil
118+
}
119+
}
120+
}
121+
106122
// notifies the other members of the etcd cluster about the removing member
107123
etcdPeerAddress := etcdutil.GetPeerURL(&cfg.LocalAPIEndpoint)
108124

@@ -113,7 +129,7 @@ func RemoveStackedEtcdMemberFromCluster(client clientset.Interface, cfg *kubeadm
113129
}
114130

115131
klog.V(1).Infof("[etcd] removing etcd member: %s, id: %d", etcdPeerAddress, id)
116-
members, err := etcdClient.RemoveMember(id)
132+
members, err = etcdClient.RemoveMember(id)
117133
if err != nil {
118134
return err
119135
}

cmd/kubeadm/app/phases/upgrade/staticpods_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ func (c fakeTLSEtcdClient) CheckClusterHealth() error {
246246

247247
func (c fakeTLSEtcdClient) Sync() error { return nil }
248248

249+
func (c fakeTLSEtcdClient) ListMembers() ([]etcdutil.Member, error) {
250+
return []etcdutil.Member{}, nil
251+
}
252+
249253
func (c fakeTLSEtcdClient) AddMember(name string, peerAddrs string) ([]etcdutil.Member, error) {
250254
return []etcdutil.Member{}, nil
251255
}
@@ -277,6 +281,10 @@ func (c fakePodManifestEtcdClient) CheckClusterHealth() error {
277281

278282
func (c fakePodManifestEtcdClient) Sync() error { return nil }
279283

284+
func (c fakePodManifestEtcdClient) ListMembers() ([]etcdutil.Member, error) {
285+
return []etcdutil.Member{}, nil
286+
}
287+
280288
func (c fakePodManifestEtcdClient) AddMember(name string, peerAddrs string) ([]etcdutil.Member, error) {
281289
return []etcdutil.Member{}, nil
282290
}

cmd/kubeadm/app/util/etcd/etcd.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type ClusterInterrogator interface {
5555
CheckClusterHealth() error
5656
WaitForClusterAvailable(retries int, retryInterval time.Duration) (bool, error)
5757
Sync() error
58+
ListMembers() ([]Member, error)
5859
AddMember(name string, peerAddrs string) ([]Member, error)
5960
GetMemberID(peerURL string) (uint64, error)
6061
RemoveMember(id uint64) ([]Member, error)
@@ -258,8 +259,7 @@ type Member struct {
258259
PeerURL string
259260
}
260261

261-
// GetMemberID returns the member ID of the given peer URL
262-
func (c *Client) GetMemberID(peerURL string) (uint64, error) {
262+
func (c *Client) listMembers() (*clientv3.MemberListResponse, error) {
263263
cli, err := clientv3.New(clientv3.Config{
264264
Endpoints: c.Endpoints,
265265
DialTimeout: dialTimeout,
@@ -269,7 +269,7 @@ func (c *Client) GetMemberID(peerURL string) (uint64, error) {
269269
TLS: c.TLS,
270270
})
271271
if err != nil {
272-
return 0, err
272+
return nil, err
273273
}
274274
defer cli.Close()
275275

@@ -288,7 +288,16 @@ func (c *Client) GetMemberID(peerURL string) (uint64, error) {
288288
return false, nil
289289
})
290290
if err != nil {
291-
return 0, lastError
291+
return nil, lastError
292+
}
293+
return resp, nil
294+
}
295+
296+
// GetMemberID returns the member ID of the given peer URL
297+
func (c *Client) GetMemberID(peerURL string) (uint64, error) {
298+
resp, err := c.listMembers()
299+
if err != nil {
300+
return 0, err
292301
}
293302

294303
for _, member := range resp.Members {
@@ -299,6 +308,20 @@ func (c *Client) GetMemberID(peerURL string) (uint64, error) {
299308
return 0, nil
300309
}
301310

311+
// ListMembers returns the member list.
312+
func (c *Client) ListMembers() ([]Member, error) {
313+
resp, err := c.listMembers()
314+
if err != nil {
315+
return nil, err
316+
}
317+
318+
ret := make([]Member, 0, len(resp.Members))
319+
for _, m := range resp.Members {
320+
ret = append(ret, Member{Name: m.Name, PeerURL: m.PeerURLs[0]})
321+
}
322+
return ret, nil
323+
}
324+
302325
// RemoveMember notifies an etcd cluster to remove an existing member
303326
func (c *Client) RemoveMember(id uint64) ([]Member, error) {
304327
cli, err := clientv3.New(clientv3.Config{

0 commit comments

Comments
 (0)