code: func (d *initData) Client() (clientset.Interface, error) {
  	if d.client == nil {
  		if d.dryRun {
  			// If we're dry-running, we should create a faked client that answers some GETs in order to be able to do the full init flow and just logs the rest of requests
  			dryRunGetter := apiclient.NewInitDryRunGetter(d.cfg.NodeRegistration.Name, d.cfg.Networking.ServiceSubnet)
  			d.client = apiclient.NewDryRunClient(dryRunGetter, os.Stdout)
  		} else {
  			// If we're acting for real, we should create a connection to the API server and wait for it to come up
  			var err error
  			d.client, err = kubeconfigutil.ClientSetFromFile(d.KubeConfigPath())
  			if err != nil {
  				return nil, err
  			}
  		}
  	}
  	return d.client, nil
  }
docs: // Client returns a Kubernetes client to be used by kubeadm.
  // This function is implemented as a singleton, thus avoiding to recreate the client when it is used by different phases.
  // Important. This function must be called after the admin.conf kubeconfig file is created.