From a5d0d1b68dd015bc57b88aeec002e2adb73891d5 Mon Sep 17 00:00:00 2001 From: Alexey Makhov Date: Mon, 23 Dec 2024 15:16:45 +0200 Subject: [PATCH] Backport etcd join workflow fix from #5151 Signed-off-by: Alexey Makhov --- cmd/controller/controller.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/controller/controller.go b/cmd/controller/controller.go index a1999bc3a4ce..c7edb380087b 100644 --- a/cmd/controller/controller.go +++ b/cmd/controller/controller.go @@ -655,15 +655,19 @@ func (c *command) startWorker(ctx context.Context, profile string, nodeConfig *v return wc.Start(ctx) } -// If we've got CA in place we assume the node has already joined previously +// If we've got an etcd data directory in place for embedded etcd, or a ca for +// external or other storage types, we assume the node has already joined +// previously. func (c *command) needToJoin(nodeConfig *v1beta1.ClusterConfig) bool { + if nodeConfig.Spec.Storage.Type == v1beta1.EtcdStorageType && !nodeConfig.Spec.Storage.Etcd.IsExternalClusterUsed() { + // Use the main etcd data directory as the source of truth to determine if this node has already joined + // See https://etcd.io/docs/v3.5/learning/persistent-storage-files/#bbolt-btree-membersnapdb + return !file.Exists(filepath.Join(c.K0sVars.EtcdDataDir, "member", "snap", "db")) + } if file.Exists(filepath.Join(c.K0sVars.CertRootDir, "ca.key")) && file.Exists(filepath.Join(c.K0sVars.CertRootDir, "ca.crt")) { return false } - if nodeConfig.Spec.Storage.Type == v1beta1.EtcdStorageType && !nodeConfig.Spec.Storage.Etcd.IsExternalClusterUsed() { - return !file.Exists(filepath.Join(c.K0sVars.EtcdDataDir, "member", "snap", "db")) - } return true }