code: func RunUpgradeNodeConfig(flags *nodeUpgradeFlags) error {
  	if len(flags.kubeletVersionStr) == 0 {
  		return errors.New("the --kubelet-version argument is required")
  	}
  
  	// Set up the kubelet directory to use. If dry-running, use a fake directory
  	kubeletDir, err := upgrade.GetKubeletDir(flags.dryRun)
  	if err != nil {
  		return err
  	}
  
  	client, err := getClient(flags.kubeConfigPath, flags.dryRun)
  	if err != nil {
  		return errors.Wrapf(err, "couldn't create a Kubernetes client from file %q", flags.kubeConfigPath)
  	}
  
  	// Parse the desired kubelet version
  	kubeletVersion, err := version.ParseSemantic(flags.kubeletVersionStr)
  	if err != nil {
  		return err
  	}
  	// TODO: Checkpoint the current configuration first so that if something goes wrong it can be recovered
  	if err := kubeletphase.DownloadConfig(client, kubeletVersion, kubeletDir); err != nil {
  		return err
  	}
  
  	// If we're dry-running, print the generated manifests, otherwise do nothing
  	if err := printFilesIfDryRunning(flags.dryRun, kubeletDir); err != nil {
  		return errors.Wrap(err, "error printing files on dryrun")
  	}
  
  	fmt.Println("[upgrade] The configuration for this node was successfully updated!")
  	fmt.Println("[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.")
  	return nil
  }
docs: // RunUpgradeNodeConfig is executed when `kubeadm upgrade node config` runs.