Merge pull request #74410 from pytimer/kubeadm-fix
kubeadm: reduce the number of fetch configuration when reset
This commit is contained in:
		@@ -84,6 +84,7 @@ go_test(
 | 
				
			|||||||
    ],
 | 
					    ],
 | 
				
			||||||
    embed = [":go_default_library"],
 | 
					    embed = [":go_default_library"],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
					        "//cmd/kubeadm/app/apis/kubeadm/validation:go_default_library",
 | 
				
			||||||
        "//cmd/kubeadm/app/cmd/options:go_default_library",
 | 
					        "//cmd/kubeadm/app/cmd/options:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,7 @@ import (
 | 
				
			|||||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
						"k8s.io/apimachinery/pkg/util/sets"
 | 
				
			||||||
	clientset "k8s.io/client-go/kubernetes"
 | 
						clientset "k8s.io/client-go/kubernetes"
 | 
				
			||||||
	"k8s.io/klog"
 | 
						"k8s.io/klog"
 | 
				
			||||||
 | 
						kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
 | 
				
			||||||
	kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
 | 
						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/apis/kubeadm/validation"
 | 
				
			||||||
	"k8s.io/kubernetes/cmd/kubeadm/app/cmd/options"
 | 
						"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)
 | 
									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 == "" {
 | 
								if criSocketPath == "" {
 | 
				
			||||||
				criSocketPath, err = resetDetectCRISocket(client)
 | 
									criSocketPath, err = resetDetectCRISocket(cfg)
 | 
				
			||||||
				kubeadmutil.CheckErr(err)
 | 
									kubeadmutil.CheckErr(err)
 | 
				
			||||||
				klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
 | 
									klog.V(1).Infof("[reset] detected and using CRI socket: %s", criSocketPath)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
 | 
								r, err := NewReset(in, ignorePreflightErrorsSet, forceReset, certsDir, criSocketPath)
 | 
				
			||||||
			kubeadmutil.CheckErr(err)
 | 
								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".
 | 
					// 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
 | 
						var dirsToClean []string
 | 
				
			||||||
	// Only clear etcd data when using local etcd.
 | 
						// Only clear etcd data when using local etcd.
 | 
				
			||||||
	etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
 | 
						etcdManifestPath := filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName, "etcd.yaml")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	klog.V(1).Infof("[reset] checking for etcd config")
 | 
						klog.V(1).Infof("[reset] checking for etcd config")
 | 
				
			||||||
	etcdDataDir, err := getEtcdDataDir(etcdManifestPath, client)
 | 
						etcdDataDir, err := getEtcdDataDir(etcdManifestPath, cfg)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		dirsToClean = append(dirsToClean, etcdDataDir)
 | 
							dirsToClean = append(dirsToClean, etcdDataDir)
 | 
				
			||||||
		if err := removeEtcdMember(client); err != nil {
 | 
							if cfg != nil {
 | 
				
			||||||
			klog.Warningf("[reset] failed to remove etcd member: %v\n.Please manually remove this etcd member using etcdctl", err)
 | 
								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 {
 | 
						} else {
 | 
				
			||||||
		fmt.Println("[reset] no etcd config found. Assuming external etcd")
 | 
							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
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func removeEtcdMember(client clientset.Interface) error {
 | 
					func getEtcdDataDir(manifestPath string, cfg *kubeadmapi.InitConfiguration) (string, 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) {
 | 
					 | 
				
			||||||
	const etcdVolumeName = "etcd-data"
 | 
						const etcdVolumeName = "etcd-data"
 | 
				
			||||||
	var dataDir string
 | 
						var dataDir string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if client != nil {
 | 
						if cfg != nil && cfg.Etcd.Local != nil {
 | 
				
			||||||
		cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
 | 
							return cfg.Etcd.Local.DataDir, nil
 | 
				
			||||||
		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)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						klog.Warningln("[reset] No kubeadm config, using etcd pod spec to get data directory")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
 | 
						etcdPod, err := utilstaticpod.ReadStaticPodFromDisk(manifestPath)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -311,13 +308,10 @@ func resetConfigDir(configPathDir, pkiPathDir string) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func resetDetectCRISocket(client clientset.Interface) (string, error) {
 | 
					func resetDetectCRISocket(cfg *kubeadmapi.InitConfiguration) (string, error) {
 | 
				
			||||||
	if client != nil {
 | 
						if cfg != nil {
 | 
				
			||||||
		// first try to connect to the cluster for the CRI socket
 | 
							// first try to get the CRI socket from the cluster configuration
 | 
				
			||||||
		cfg, err := configutil.FetchInitConfigurationFromCluster(client, os.Stdout, "reset", false)
 | 
							return cfg.NodeRegistration.CRISocket, nil
 | 
				
			||||||
		if err == nil {
 | 
					 | 
				
			||||||
			return cfg.NodeRegistration.CRISocket, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if this fails, try to detect it
 | 
						// if this fails, try to detect it
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/lithammer/dedent"
 | 
						"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"
 | 
						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/apis/kubeadm/validation"
 | 
				
			||||||
	kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
						kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants"
 | 
				
			||||||
@@ -275,38 +275,38 @@ func TestGetEtcdDataDir(t *testing.T) {
 | 
				
			|||||||
		podYaml       string
 | 
							podYaml       string
 | 
				
			||||||
		expectErr     bool
 | 
							expectErr     bool
 | 
				
			||||||
		writeManifest bool
 | 
							writeManifest bool
 | 
				
			||||||
		validClient   bool
 | 
							validConfig   bool
 | 
				
			||||||
	}{
 | 
						}{
 | 
				
			||||||
		"non-existent file returns error": {
 | 
							"non-existent file returns error": {
 | 
				
			||||||
			expectErr:     true,
 | 
								expectErr:     true,
 | 
				
			||||||
			writeManifest: false,
 | 
								writeManifest: false,
 | 
				
			||||||
			validClient:   true,
 | 
								validConfig:   true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"return etcd data dir": {
 | 
							"return etcd data dir": {
 | 
				
			||||||
			dataDir:       "/path/to/etcd",
 | 
								dataDir:       "/path/to/etcd",
 | 
				
			||||||
			podYaml:       etcdPod,
 | 
								podYaml:       etcdPod,
 | 
				
			||||||
			expectErr:     false,
 | 
								expectErr:     false,
 | 
				
			||||||
			writeManifest: true,
 | 
								writeManifest: true,
 | 
				
			||||||
			validClient:   true,
 | 
								validConfig:   true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"invalid etcd pod": {
 | 
							"invalid etcd pod": {
 | 
				
			||||||
			podYaml:       etcdPodInvalid,
 | 
								podYaml:       etcdPodInvalid,
 | 
				
			||||||
			expectErr:     true,
 | 
								expectErr:     true,
 | 
				
			||||||
			writeManifest: true,
 | 
								writeManifest: true,
 | 
				
			||||||
			validClient:   true,
 | 
								validConfig:   true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"etcd pod spec without data volume": {
 | 
							"etcd pod spec without data volume": {
 | 
				
			||||||
			podYaml:       etcdPodWithoutDataVolume,
 | 
								podYaml:       etcdPodWithoutDataVolume,
 | 
				
			||||||
			expectErr:     true,
 | 
								expectErr:     true,
 | 
				
			||||||
			writeManifest: true,
 | 
								writeManifest: true,
 | 
				
			||||||
			validClient:   true,
 | 
								validConfig:   true,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"kubeconfig file doesn't exist": {
 | 
							"kubeconfig file doesn't exist": {
 | 
				
			||||||
			dataDir:       "/path/to/etcd",
 | 
								dataDir:       "/path/to/etcd",
 | 
				
			||||||
			podYaml:       etcdPod,
 | 
								podYaml:       etcdPod,
 | 
				
			||||||
			expectErr:     false,
 | 
								expectErr:     false,
 | 
				
			||||||
			writeManifest: true,
 | 
								writeManifest: true,
 | 
				
			||||||
			validClient:   false,
 | 
								validConfig:   false,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -325,9 +325,9 @@ func TestGetEtcdDataDir(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			var dataDir string
 | 
								var dataDir string
 | 
				
			||||||
			var err error
 | 
								var err error
 | 
				
			||||||
			if test.validClient {
 | 
								if test.validConfig {
 | 
				
			||||||
				client := clientsetfake.NewSimpleClientset()
 | 
									cfg := &kubeadmapi.InitConfiguration{}
 | 
				
			||||||
				dataDir, err = getEtcdDataDir(manifestPath, client)
 | 
									dataDir, err = getEtcdDataDir(manifestPath, cfg)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				dataDir, err = getEtcdDataDir(manifestPath, nil)
 | 
									dataDir, err = getEtcdDataDir(manifestPath, nil)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user