diff --git a/core/installer/cluster/kube.go b/core/installer/cluster/kube.go
index 11fe746..3391e3e 100644
--- a/core/installer/cluster/kube.go
+++ b/core/installer/cluster/kube.go
@@ -172,36 +172,38 @@
 func (m *KubeManager) RemoveServer(name string) error {
 	m.l.Lock()
 	defer m.l.Unlock()
-	client, err := kube.NewKubeClient(kube.KubeConfigOpts{
-		KubeConfig: m.kubeCfg,
-	})
-	if err != nil {
-		return err
-	}
-	helper := &drain.Helper{
-		Ctx:                 context.Background(),
-		Client:              client,
-		Force:               true,
-		GracePeriodSeconds:  -1,
-		IgnoreAllDaemonSets: true,
-		Out:                 os.Stdout,
-		ErrOut:              os.Stdout,
-		// We want to proceed even when pods are using emptyDir volumes
-		DeleteEmptyDirData: true,
-		Timeout:            10 * time.Minute,
-	}
-	node, err := client.CoreV1().Nodes().Get(context.Background(), name, metav1.GetOptions{})
-	if err != nil {
-		return err
-	}
-	if err := drain.RunCordonOrUncordon(helper, node, true); err != nil {
-		return err
-	}
-	if err := drain.RunNodeDrain(helper, name); err != nil {
-		return err
-	}
-	if err := client.CoreV1().Nodes().Delete(context.Background(), name, metav1.DeleteOptions{}); err != nil {
-		return err
+	if len(m.controllers)+len(m.workers) > 1 {
+		client, err := kube.NewKubeClient(kube.KubeConfigOpts{
+			KubeConfig: m.kubeCfg,
+		})
+		if err != nil {
+			return err
+		}
+		helper := &drain.Helper{
+			Ctx:                 context.Background(),
+			Client:              client,
+			Force:               true,
+			GracePeriodSeconds:  -1,
+			IgnoreAllDaemonSets: true,
+			Out:                 os.Stdout,
+			ErrOut:              os.Stdout,
+			// We want to proceed even when pods are using emptyDir volumes
+			DeleteEmptyDirData: true,
+			Timeout:            10 * time.Minute,
+		}
+		node, err := client.CoreV1().Nodes().Get(context.Background(), name, metav1.GetOptions{})
+		if err != nil {
+			return err
+		}
+		if err := drain.RunCordonOrUncordon(helper, node, true); err != nil {
+			return err
+		}
+		if err := drain.RunNodeDrain(helper, name); err != nil {
+			return err
+		}
+		if err := client.CoreV1().Nodes().Delete(context.Background(), name, metav1.DeleteOptions{}); err != nil {
+			return err
+		}
 	}
 	for i, s := range m.controllers {
 		if s.Name == name {
