code: func RunJoinNodeChecks(execer utilsexec.Interface, cfg *kubeadmapi.JoinConfiguration, ignorePreflightErrors sets.String) error {
  	// First, check if we're root separately from the other preflight checks and fail fast
  	if err := RunRootCheckOnly(ignorePreflightErrors); err != nil {
  		return err
  	}
  
  	checks := []Checker{
  		DirAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.ManifestsSubDirName)},
  		FileAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.KubeletKubeConfigFileName)},
  		FileAvailableCheck{Path: filepath.Join(kubeadmconstants.KubernetesDir, kubeadmconstants.KubeletBootstrapKubeConfigFileName)},
  	}
  	checks = addCommonChecks(execer, "", &cfg.NodeRegistration, checks)
  	if cfg.ControlPlane == nil {
  		checks = append(checks, FileAvailableCheck{Path: cfg.CACertPath})
  	}
  
  	addIPv6Checks := false
  	if cfg.Discovery.BootstrapToken != nil {
  		ipstr, _, err := net.SplitHostPort(cfg.Discovery.BootstrapToken.APIServerEndpoint)
  		if err == nil {
  			checks = append(checks,
  				HTTPProxyCheck{Proto: "https", Host: ipstr},
  			)
  			if !addIPv6Checks {
  				if ip := net.ParseIP(ipstr); ip != nil {
  					if ip.To4() == nil && ip.To16() != nil {
  						addIPv6Checks = true
  					}
  				}
  			}
  		}
  	}
  	if addIPv6Checks {
  		checks = append(checks,
  			FileContentCheck{Path: bridgenf6, Content: []byte{'1'}},
  			FileContentCheck{Path: ipv6DefaultForwarding, Content: []byte{'1'}},
  		)
  	}
  
  	return RunChecks(checks, os.Stderr, ignorePreflightErrors)
  }
docs: // RunJoinNodeChecks executes all individual, applicable to node checks.