Cleanup etcd data dir on best effort basis
Signed-off-by: Dave Chen <dave.chen@arm.com>
This commit is contained in:
parent
f180a3f265
commit
71ef1ea68d
@ -19,6 +19,7 @@ package phases
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
@ -201,3 +202,16 @@ func CleanDir(filePath string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsDirEmpty(dir string) (bool, error) {
|
||||||
|
d, err := os.Open(dir)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
defer d.Close()
|
||||||
|
_, err = d.Readdirnames(1)
|
||||||
|
if err == io.EOF {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
@ -19,11 +19,14 @@ package phases
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
|
||||||
|
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/scheme"
|
||||||
|
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
|
||||||
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
"k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow"
|
||||||
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
|
||||||
@ -63,7 +66,9 @@ func runRemoveETCDMemberPhase(c workflow.RunData) error {
|
|||||||
klog.Warningf("[reset] Failed to remove etcd member: %v, please manually remove this etcd member using etcdctl", err)
|
klog.Warningf("[reset] Failed to remove etcd member: %v, please manually remove this etcd member using etcdctl", err)
|
||||||
} else {
|
} else {
|
||||||
if err := CleanDir(etcdDataDir); err != nil {
|
if err := CleanDir(etcdDataDir); err != nil {
|
||||||
klog.Warningf("[reset] Failed to delete contents of %q directory: %v", etcdDataDir, err)
|
klog.Warningf("[reset] Failed to delete contents of the etcd directory: %q, error: %v", etcdDataDir, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("[reset] Deleted contents of the etcd data directory: %v\n", etcdDataDir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -71,6 +76,16 @@ func runRemoveETCDMemberPhase(c workflow.RunData) error {
|
|||||||
fmt.Printf("[reset] Would delete contents of the etcd data directory: %v\n", etcdDataDir)
|
fmt.Printf("[reset] Would delete contents of the etcd data directory: %v\n", etcdDataDir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// This could happen if the phase `cleanup-node` is run before the `remove-etcd-member`.
|
||||||
|
// Cleanup the data in the etcd data dir to avoid some stale files which might cause the failure to build cluster in the next time.
|
||||||
|
empty, _ := IsDirEmpty(etcdDataDir)
|
||||||
|
if !empty && !r.DryRun() {
|
||||||
|
if err := CleanDir(etcdDataDir); err != nil {
|
||||||
|
klog.Warningf("[reset] Failed to delete contents of the etcd directory: %q, error: %v", etcdDataDir, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("[reset] Deleted contents of the etcd data directory: %v\n", etcdDataDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("[reset] No etcd config found. Assuming external etcd")
|
fmt.Println("[reset] No etcd config found. Assuming external etcd")
|
||||||
fmt.Println("[reset] Please, manually reset etcd to prevent further issues")
|
fmt.Println("[reset] Please, manually reset etcd to prevent further issues")
|
||||||
@ -88,11 +103,17 @@ func getEtcdDataDir(manifestPath string, cfg *kubeadmapi.InitConfiguration) (str
|
|||||||
}
|
}
|
||||||
klog.Warningln("[reset] No kubeadm config, using etcd pod spec to get data directory")
|
klog.Warningln("[reset] No kubeadm config, using etcd pod spec to get data directory")
|
||||||
|
|
||||||
|
if _, err := os.Stat(manifestPath); os.IsNotExist(err) {
|
||||||
|
// Fall back to use the default cluster config if etcd.yaml doesn't exist, this could happen that
|
||||||
|
// etcd.yaml is removed by other reset phases, e.g. cleanup-node.
|
||||||
|
cfg := &v1beta3.ClusterConfiguration{}
|
||||||
|
scheme.Scheme.Default(cfg)
|
||||||
|
return cfg.Etcd.Local.DataDir, nil
|
||||||
|
}
|
||||||
etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
|
etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, volumeMount := range etcdPod.Spec.Volumes {
|
for _, volumeMount := range etcdPod.Spec.Volumes {
|
||||||
if volumeMount.Name == etcdVolumeName {
|
if volumeMount.Name == etcdVolumeName {
|
||||||
dataDir = volumeMount.HostPath.Path
|
dataDir = volumeMount.HostPath.Path
|
||||||
|
@ -63,10 +63,11 @@ func TestGetEtcdDataDir(t *testing.T) {
|
|||||||
writeManifest bool
|
writeManifest bool
|
||||||
validConfig bool
|
validConfig bool
|
||||||
}{
|
}{
|
||||||
"non-existent file returns error": {
|
"non-existent file returns default data dir": {
|
||||||
expectErr: true,
|
expectErr: false,
|
||||||
writeManifest: false,
|
writeManifest: false,
|
||||||
validConfig: true,
|
validConfig: true,
|
||||||
|
dataDir: "/var/lib/etcd",
|
||||||
},
|
},
|
||||||
"return etcd data dir": {
|
"return etcd data dir": {
|
||||||
dataDir: "/path/to/etcd",
|
dataDir: "/path/to/etcd",
|
||||||
|
Loading…
Reference in New Issue
Block a user