diff --git a/cmd/kubeadm/app/cmd/BUILD b/cmd/kubeadm/app/cmd/BUILD index e22ef05bbd..8cd6a13108 100644 --- a/cmd/kubeadm/app/cmd/BUILD +++ b/cmd/kubeadm/app/cmd/BUILD @@ -84,6 +84,7 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library", "//cmd/kubeadm/app/cmd/options:go_default_library", diff --git a/cmd/kubeadm/app/cmd/reset.go b/cmd/kubeadm/app/cmd/reset.go index b8e2b919eb..cac15ea31e 100644 --- a/cmd/kubeadm/app/cmd/reset.go +++ b/cmd/kubeadm/app/cmd/reset.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" clientset "k8s.io/client-go/kubernetes" "k8s.io/klog" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" @@ -68,15 +69,20 @@ func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command { kubeadmutil.CheckErr(err) } + cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false) + if err != nil { + klog.Warningf("[reset] Unable to fetch the kubeadm-config ConfigMap from cluster: %v", err) + } + if criSocketPath == "" { - criSocketPath, err = resetDetectCRISocket(client) + criSocketPath, err = resetDetectCRISocket(cfg) kubeadmutil.CheckErr(err) klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath) } r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath) kubeadmutil.CheckErr(err) - kubeadmutil.CheckErr(r.Run(out, client)) + kubeadmutil.CheckErr(r.Run(out, client, cfg)) }, } @@ -131,17 +137,19 @@ func NewReset(in io.Reader, ignorePreflightErrors sets.String, forceReset bool, } // Run reverts any changes made to this host by "kubeadm init" or "kubeadm join". -func (r *Reset) Run(out io.Writer, client clientset.Interface) error { +func (r *Reset) Run(out io.Writer, client clientset.Interface, cfg *kubeadmapi.InitConfiguration) error { var dirsToClean []string // Only clear etcd data when using local etcd. etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml") klog.V(1).Infof("[reset] checking for etcd config") - etcdDataDir, err := getEtcdDataDir(etcdManifestPath, client) + etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg) if err == nil { dirsToClean = append(dirsToClean, etcdDataDir) - if err := removeEtcdMember(client); err != nil { - klog.Warningf("[reset] failed to remove etcd member: %v\n.Please manually remove this etcd member using etcdctl", err) + if cfg != nil { + if err := etcdphase.RemoveStackedEtcdMemberFromCluster(client, cfg); err != nil { + klog.Warningf("[reset] failed to remove etcd member: %v\n.Please manually remove this etcd member using etcdctl", err) + } } } else { fmt.Println("[reset] no etcd config found. Assuming external etcd") @@ -209,25 +217,14 @@ func (r *Reset) Run(out io.Writer, client clientset.Interface) error { return nil } -func removeEtcdMember(client clientset.Interface) error { - cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false) - if err != nil { - return err - } - return etcdphase.RemoveStackedEtcdMemberFromCluster(client, cfg) -} - -func getEtcdDataDir(manifestPath string, client clientset.Interface) (string, error) { +func getEtcdDataDir(manifestPath string, cfg *kubeadmapi.InitConfiguration) (string, error) { const etcdVolumeName = "etcd-data" var dataDir string - if client != nil { - cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false) - if err == nil && cfg.Etcd.Local != nil { - return cfg.Etcd.Local.DataDir, nil - } - klog.Warningf("[reset] Unable to fetch the kubeadm-config ConfigMap, using etcd pod spec as fallback: %v", err) + if cfg != nil && cfg.Etcd.Local != nil { + return cfg.Etcd.Local.DataDir, nil } + klog.Warningln("[reset] No kubeadm config, using etcd pod spec to get data directory") etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath) if err != nil { @@ -311,13 +308,10 @@ func resetConfigDir(configPathDir, pkiPathDir string) { } } -func resetDetectCRISocket(client clientset.Interface) (string, error) { - if client != nil { - // first try to connect to the cluster for the CRI socket - cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false) - if err == nil { - return cfg.NodeRegistration.CRISocket, nil - } +func resetDetectCRISocket(cfg *kubeadmapi.InitConfiguration) (string, error) { + if cfg != nil { + // first try to get the CRI socket from the cluster configuration + return cfg.NodeRegistration.CRISocket, nil } // if this fails, try to detect it diff --git a/cmd/kubeadm/app/cmd/reset_test.go b/cmd/kubeadm/app/cmd/reset_test.go index 6908b20e94..7c2e560dc8 100644 --- a/cmd/kubeadm/app/cmd/reset_test.go +++ b/cmd/kubeadm/app/cmd/reset_test.go @@ -25,7 +25,7 @@ import ( "github.com/lithammer/dedent" - clientsetfake "k8s.io/client-go/kubernetes/fake" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" @@ -275,38 +275,38 @@ func TestGetEtcdDataDir(t *testing.T) { podYaml string expectErr bool writeManifest bool - validClient bool + validConfig bool }{ "non-existent file returns error": { expectErr: true, writeManifest: false, - validClient: true, + validConfig: true, }, "return etcd data dir": { dataDir: "/path/to/etcd", podYaml: etcdPod, expectErr: false, writeManifest: true, - validClient: true, + validConfig: true, }, "invalid etcd pod": { podYaml: etcdPodInvalid, expectErr: true, writeManifest: true, - validClient: true, + validConfig: true, }, "etcd pod spec without data volume": { podYaml: etcdPodWithoutDataVolume, expectErr: true, writeManifest: true, - validClient: true, + validConfig: true, }, "kubeconfig file doesn't exist": { dataDir: "/path/to/etcd", podYaml: etcdPod, expectErr: false, writeManifest: true, - validClient: false, + validConfig: false, }, } @@ -325,9 +325,9 @@ func TestGetEtcdDataDir(t *testing.T) { var dataDir string var err error - if test.validClient { - client := clientsetfake.NewSimpleClientset() - dataDir, err = getEtcdDataDir(manifestPath, client) + if test.validConfig { + cfg := &kubeadmapi.InitConfiguration{} + dataDir, err = getEtcdDataDir(manifestPath, cfg) } else { dataDir, err = getEtcdDataDir(manifestPath, nil) }