diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index 45ac714402..0829848c7f 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -36,7 +36,7 @@ import ( 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" - "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" + phases "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/init" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" @@ -168,7 +168,7 @@ func NewCmdInit(out io.Writer, initOptions *initOptions) *cobra.Command { }) // initialize the workflow runner with the list of phases - initRunner.AppendPhase(phases.NewPreflightMasterPhase()) + initRunner.AppendPhase(phases.NewPreflightPhase()) initRunner.AppendPhase(phases.NewKubeletStartPhase()) initRunner.AppendPhase(phases.NewCertsPhase()) initRunner.AppendPhase(phases.NewKubeConfigPhase()) diff --git a/cmd/kubeadm/app/cmd/join.go b/cmd/kubeadm/app/cmd/join.go index 28959bcaa5..92bc369c64 100644 --- a/cmd/kubeadm/app/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -38,7 +38,7 @@ import ( 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" - "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases" + phases "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/join" "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" @@ -198,7 +198,7 @@ func NewCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command { addJoinConfigFlags(cmd.Flags(), joinOptions.externalcfg) addJoinOtherFlags(cmd.Flags(), &joinOptions.cfgPath, &joinOptions.ignorePreflightErrors, &joinOptions.controlPlane, &joinOptions.token) - joinRunner.AppendPhase(phases.NewPreflightJoinPhase()) + joinRunner.AppendPhase(phases.NewPreflightPhase()) joinRunner.AppendPhase(phases.NewControlPlanePreparePhase()) joinRunner.AppendPhase(phases.NewCheckEtcdPhase()) diff --git a/cmd/kubeadm/app/cmd/phases/addons.go b/cmd/kubeadm/app/cmd/phases/init/addons.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/addons.go rename to cmd/kubeadm/app/cmd/phases/init/addons.go diff --git a/cmd/kubeadm/app/cmd/phases/bootstraptoken.go b/cmd/kubeadm/app/cmd/phases/init/bootstraptoken.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/bootstraptoken.go rename to cmd/kubeadm/app/cmd/phases/init/bootstraptoken.go diff --git a/cmd/kubeadm/app/cmd/phases/certs.go b/cmd/kubeadm/app/cmd/phases/init/certs.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/certs.go rename to cmd/kubeadm/app/cmd/phases/init/certs.go diff --git a/cmd/kubeadm/app/cmd/phases/certs_test.go b/cmd/kubeadm/app/cmd/phases/init/certs_test.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/certs_test.go rename to cmd/kubeadm/app/cmd/phases/init/certs_test.go diff --git a/cmd/kubeadm/app/cmd/phases/init/controlplane.go b/cmd/kubeadm/app/cmd/phases/init/controlplane.go new file mode 100644 index 0000000000..b5fd2c8ff5 --- /dev/null +++ b/cmd/kubeadm/app/cmd/phases/init/controlplane.go @@ -0,0 +1,156 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "fmt" + + "github.com/pkg/errors" + + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow" + cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" + kubeadmconstants "k8s.io/kubernetes/cmd/kubeadm/app/constants" + "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane" + "k8s.io/kubernetes/pkg/util/normalizer" +) + +var ( + controlPlaneExample = normalizer.Examples(` + # Generates all static Pod manifest files for control plane components, + # functionally equivalent to what is generated by kubeadm init. + kubeadm init phase control-plane all + + # Generates all static Pod manifest files using options read from a configuration file. + kubeadm init phase control-plane all --config config.yaml + `) + + controlPlanePhaseProperties = map[string]struct { + name string + short string + }{ + kubeadmconstants.KubeAPIServer: { + name: "apiserver", + short: getPhaseDescription(kubeadmconstants.KubeAPIServer), + }, + kubeadmconstants.KubeControllerManager: { + name: "controller-manager", + short: getPhaseDescription(kubeadmconstants.KubeControllerManager), + }, + kubeadmconstants.KubeScheduler: { + name: "scheduler", + short: getPhaseDescription(kubeadmconstants.KubeScheduler), + }, + } +) + +type controlPlaneData interface { + Cfg() *kubeadmapi.InitConfiguration + KubeConfigDir() string + ManifestDir() string +} + +func getPhaseDescription(component string) string { + return fmt.Sprintf("Generates the %s static Pod manifest", component) +} + +// NewControlPlanePhase creates a kubeadm workflow phase that implements bootstrapping the control plane. +func NewControlPlanePhase() workflow.Phase { + phase := workflow.Phase{ + Name: "control-plane", + Short: "Generates all static Pod manifest files necessary to establish the control plane", + Long: cmdutil.MacroCommandLongDescription, + Phases: []workflow.Phase{ + { + Name: "all", + Short: "Generates all static Pod manifest files", + InheritFlags: getControlPlanePhaseFlags("all"), + Example: controlPlaneExample, + RunAllSiblings: true, + }, + newControlPlaneSubphase(kubeadmconstants.KubeAPIServer), + newControlPlaneSubphase(kubeadmconstants.KubeControllerManager), + newControlPlaneSubphase(kubeadmconstants.KubeScheduler), + }, + Run: runControlPlanePhase, + } + return phase +} + +func newControlPlaneSubphase(component string) workflow.Phase { + phase := workflow.Phase{ + Name: controlPlanePhaseProperties[component].name, + Short: controlPlanePhaseProperties[component].short, + Run: runControlPlaneSubphase(component), + InheritFlags: getControlPlanePhaseFlags(component), + } + return phase +} + +func getControlPlanePhaseFlags(name string) []string { + flags := []string{ + options.CfgPath, + options.CertificatesDir, + options.KubernetesVersion, + options.ImageRepository, + } + if name == "all" || name == kubeadmconstants.KubeAPIServer { + flags = append(flags, + options.APIServerAdvertiseAddress, + options.APIServerBindPort, + options.APIServerExtraArgs, + options.FeatureGatesString, + options.NetworkingServiceSubnet, + ) + } + if name == "all" || name == kubeadmconstants.KubeControllerManager { + flags = append(flags, + options.ControllerManagerExtraArgs, + options.NetworkingPodSubnet, + ) + } + if name == "all" || name == kubeadmconstants.KubeScheduler { + flags = append(flags, + options.SchedulerExtraArgs, + ) + } + return flags +} + +func runControlPlanePhase(c workflow.RunData) error { + data, ok := c.(controlPlaneData) + if !ok { + return errors.New("control-plane phase invoked with an invalid data struct") + } + + fmt.Printf("[control-plane] Using manifest folder %q\n", data.ManifestDir()) + return nil +} + +func runControlPlaneSubphase(component string) func(c workflow.RunData) error { + return func(c workflow.RunData) error { + data, ok := c.(controlPlaneData) + if !ok { + return errors.New("control-plane phase invoked with an invalid data struct") + } + cfg := data.Cfg() + + fmt.Printf("[control-plane] Creating static Pod manifest for %q\n", component) + return controlplane.CreateStaticPodFiles(data.ManifestDir(), &cfg.ClusterConfiguration, &cfg.LocalAPIEndpoint, component) + } +} diff --git a/cmd/kubeadm/app/cmd/phases/etcd.go b/cmd/kubeadm/app/cmd/phases/init/etcd.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/etcd.go rename to cmd/kubeadm/app/cmd/phases/init/etcd.go diff --git a/cmd/kubeadm/app/cmd/phases/kubeconfig.go b/cmd/kubeadm/app/cmd/phases/init/kubeconfig.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/kubeconfig.go rename to cmd/kubeadm/app/cmd/phases/init/kubeconfig.go diff --git a/cmd/kubeadm/app/cmd/phases/kubelet.go b/cmd/kubeadm/app/cmd/phases/init/kubelet.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/kubelet.go rename to cmd/kubeadm/app/cmd/phases/init/kubelet.go diff --git a/cmd/kubeadm/app/cmd/phases/markcontrolplane.go b/cmd/kubeadm/app/cmd/phases/init/markcontrolplane.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/markcontrolplane.go rename to cmd/kubeadm/app/cmd/phases/init/markcontrolplane.go diff --git a/cmd/kubeadm/app/cmd/phases/init/preflight.go b/cmd/kubeadm/app/cmd/phases/init/preflight.go new file mode 100644 index 0000000000..86d8923b9e --- /dev/null +++ b/cmd/kubeadm/app/cmd/phases/init/preflight.go @@ -0,0 +1,87 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "fmt" + + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/util/sets" + kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/options" + "k8s.io/kubernetes/cmd/kubeadm/app/cmd/phases/workflow" + "k8s.io/kubernetes/cmd/kubeadm/app/preflight" + "k8s.io/kubernetes/pkg/util/normalizer" + utilsexec "k8s.io/utils/exec" +) + +var ( + preflightExample = normalizer.Examples(` + # Run pre-flight checks for kubeadm init using a config file. + kubeadm init phase preflight --config kubeadm-config.yml + `) +) + +// preflightData defines the behavior that a runtime data struct passed to the Preflight phase +// should have. Please note that we are using an interface in order to make this phase reusable in different workflows +// (and thus with different runtime data struct, all of them requested to be compliant to this interface) +type preflightData interface { + Cfg() *kubeadmapi.InitConfiguration + DryRun() bool + IgnorePreflightErrors() sets.String +} + +// NewPreflightPhase creates a kubeadm workflow phase that implements preflight checks for a new control-plane node. +func NewPreflightPhase() workflow.Phase { + return workflow.Phase{ + Name: "preflight", + Short: "Run pre-flight checks", + Long: "Run pre-flight checks for kubeadm init.", + Example: preflightExample, + Run: runPreflight, + InheritFlags: []string{ + options.CfgPath, + options.IgnorePreflightErrors, + }, + } +} + +// runPreflight executes preflight checks logic. +func runPreflight(c workflow.RunData) error { + data, ok := c.(preflightData) + if !ok { + return errors.New("preflight phase invoked with an invalid data struct") + } + + fmt.Println("[preflight] Running pre-flight checks") + if err := preflight.RunInitMasterChecks(utilsexec.New(), data.Cfg(), data.IgnorePreflightErrors()); err != nil { + return err + } + + if !data.DryRun() { + fmt.Println("[preflight] Pulling images required for setting up a Kubernetes cluster") + fmt.Println("[preflight] This might take a minute or two, depending on the speed of your internet connection") + fmt.Println("[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'") + if err := preflight.RunPullImagesCheck(utilsexec.New(), data.Cfg(), data.IgnorePreflightErrors()); err != nil { + return err + } + } else { + fmt.Println("[preflight] Would pull the required images (like 'kubeadm config images pull')") + } + + return nil +} diff --git a/cmd/kubeadm/app/cmd/phases/uploadconfig.go b/cmd/kubeadm/app/cmd/phases/init/uploadconfig.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/uploadconfig.go rename to cmd/kubeadm/app/cmd/phases/init/uploadconfig.go diff --git a/cmd/kubeadm/app/cmd/phases/waitcontrolplane.go b/cmd/kubeadm/app/cmd/phases/init/waitcontrolplane.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/waitcontrolplane.go rename to cmd/kubeadm/app/cmd/phases/init/waitcontrolplane.go diff --git a/cmd/kubeadm/app/cmd/phases/checketcd.go b/cmd/kubeadm/app/cmd/phases/join/checketcd.go similarity index 100% rename from cmd/kubeadm/app/cmd/phases/checketcd.go rename to cmd/kubeadm/app/cmd/phases/join/checketcd.go diff --git a/cmd/kubeadm/app/cmd/phases/controlplane.go b/cmd/kubeadm/app/cmd/phases/join/controlplane.go similarity index 52% rename from cmd/kubeadm/app/cmd/phases/controlplane.go rename to cmd/kubeadm/app/cmd/phases/join/controlplane.go index 8b472b2921..b98b337584 100644 --- a/cmd/kubeadm/app/cmd/phases/controlplane.go +++ b/cmd/kubeadm/app/cmd/phases/join/controlplane.go @@ -30,77 +30,14 @@ import ( certsphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/certs" "k8s.io/kubernetes/cmd/kubeadm/app/phases/controlplane" kubeconfigphase "k8s.io/kubernetes/cmd/kubeadm/app/phases/kubeconfig" - "k8s.io/kubernetes/pkg/util/normalizer" ) -var ( - controlPlaneExample = normalizer.Examples(` - # Generates all static Pod manifest files for control plane components, - # functionally equivalent to what is generated by kubeadm init. - kubeadm init phase control-plane all - - # Generates all static Pod manifest files using options read from a configuration file. - kubeadm init phase control-plane all --config config.yaml - `) - - controlPlanePhaseProperties = map[string]struct { - name string - short string - }{ - kubeadmconstants.KubeAPIServer: { - name: "apiserver", - short: getPhaseDescription(kubeadmconstants.KubeAPIServer), - }, - kubeadmconstants.KubeControllerManager: { - name: "controller-manager", - short: getPhaseDescription(kubeadmconstants.KubeControllerManager), - }, - kubeadmconstants.KubeScheduler: { - name: "scheduler", - short: getPhaseDescription(kubeadmconstants.KubeScheduler), - }, - } -) - -type controlPlaneData interface { - Cfg() *kubeadmapi.InitConfiguration - KubeConfigDir() string - ManifestDir() string -} - type controlPlanePrepareData interface { Cfg() *kubeadmapi.JoinConfiguration ClientSetFromFile(string) (*clientset.Clientset, error) InitCfg() (*kubeadmapi.InitConfiguration, error) } -func getPhaseDescription(component string) string { - return fmt.Sprintf("Generates the %s static Pod manifest", component) -} - -// NewControlPlanePhase creates a kubeadm workflow phase that implements bootstrapping the control plane. -func NewControlPlanePhase() workflow.Phase { - phase := workflow.Phase{ - Name: "control-plane", - Short: "Generates all static Pod manifest files necessary to establish the control plane", - Long: cmdutil.MacroCommandLongDescription, - Phases: []workflow.Phase{ - { - Name: "all", - Short: "Generates all static Pod manifest files", - InheritFlags: getControlPlanePhaseFlags("all"), - Example: controlPlaneExample, - RunAllSiblings: true, - }, - newControlPlaneSubphase(kubeadmconstants.KubeAPIServer), - newControlPlaneSubphase(kubeadmconstants.KubeControllerManager), - newControlPlaneSubphase(kubeadmconstants.KubeScheduler), - }, - Run: runControlPlanePhase, - } - return phase -} - // NewControlPlanePreparePhase creates a kubeadm workflow phase that implements the preparation of the node to serve a control plane func NewControlPlanePreparePhase() workflow.Phase { return workflow.Phase{ @@ -108,6 +45,12 @@ func NewControlPlanePreparePhase() workflow.Phase { Short: "Prepares the machine for serving a control plane.", Long: cmdutil.MacroCommandLongDescription, Phases: []workflow.Phase{ + { + Name: "all", + Short: "Prepares the machine for serving a control plane.", + InheritFlags: getControlPlanePreparePhaseFlags(), + RunAllSiblings: true, + }, newControlPlanePrepareCertsSubphase(), newControlPlanePrepareKubeconfigSubphase(), newControlPlanePrepareManifestsSubphases(), @@ -115,46 +58,6 @@ func NewControlPlanePreparePhase() workflow.Phase { } } -func newControlPlaneSubphase(component string) workflow.Phase { - phase := workflow.Phase{ - Name: controlPlanePhaseProperties[component].name, - Short: controlPlanePhaseProperties[component].short, - Run: runControlPlaneSubphase(component), - InheritFlags: getControlPlanePhaseFlags(component), - } - return phase -} - -func getControlPlanePhaseFlags(name string) []string { - flags := []string{ - options.CfgPath, - options.CertificatesDir, - options.KubernetesVersion, - options.ImageRepository, - } - if name == "all" || name == kubeadmconstants.KubeAPIServer { - flags = append(flags, - options.APIServerAdvertiseAddress, - options.APIServerBindPort, - options.APIServerExtraArgs, - options.FeatureGatesString, - options.NetworkingServiceSubnet, - ) - } - if name == "all" || name == kubeadmconstants.KubeControllerManager { - flags = append(flags, - options.ControllerManagerExtraArgs, - options.NetworkingPodSubnet, - ) - } - if name == "all" || name == kubeadmconstants.KubeScheduler { - flags = append(flags, - options.SchedulerExtraArgs, - ) - } - return flags -} - func getControlPlanePreparePhaseFlags() []string { return []string{ options.APIServerAdvertiseAddress, @@ -173,7 +76,7 @@ func newControlPlanePrepareCertsSubphase() workflow.Phase { Name: "certs", Short: "Generates the certificates for the new control plane components", Run: runControlPlanePrepareCertsPhaseLocal, - InheritFlags: getControlPlanePreparePhaseFlags(), + InheritFlags: getControlPlanePreparePhaseFlags(), //NB. eventually in future we would like to break down this in sub phases for each cert or add the --csr option } } @@ -182,59 +85,37 @@ func newControlPlanePrepareKubeconfigSubphase() workflow.Phase { Name: "kubeconfig", Short: "Generates the kubeconfig for the new control plane components", Run: runControlPlanePrepareKubeconfigPhaseLocal, - InheritFlags: getControlPlanePreparePhaseFlags(), + InheritFlags: getControlPlanePreparePhaseFlags(), //NB. eventually in future we would like to break down this in sub phases for each kubeconfig } } func newControlPlanePrepareManifestsSubphases() workflow.Phase { return workflow.Phase{ - Name: "manifests", - Short: "Generates the manifests for the new control plane components", - Phases: []workflow.Phase{ - { - Name: "all", - Short: "Generates all static Pod manifest files", - InheritFlags: getControlPlanePreparePhaseFlags(), - RunAllSiblings: true, - }, - newControlPlanePrepareSubphase(kubeadmconstants.KubeAPIServer), - newControlPlanePrepareSubphase(kubeadmconstants.KubeControllerManager), - newControlPlanePrepareSubphase(kubeadmconstants.KubeScheduler), - }, - InheritFlags: getControlPlanePreparePhaseFlags(), + Name: "manifests", + Short: "Generates the manifests for the new control plane components", + Run: runControlPlaneSubphase, + InheritFlags: getControlPlanePreparePhaseFlags(), //NB. eventually in future we would like to break down this in sub phases for each component } } -func newControlPlanePrepareSubphase(component string) workflow.Phase { - return workflow.Phase{ - Name: controlPlanePhaseProperties[component].name, - Short: controlPlanePhaseProperties[component].short, - Run: runControlPlanePrepareJoinSubphase(component), - InheritFlags: getControlPlanePreparePhaseFlags(), - } -} - -func runControlPlanePhase(c workflow.RunData) error { - data, ok := c.(controlPlaneData) +func runControlPlaneSubphase(c workflow.RunData) error { + data, ok := c.(controlPlanePrepareData) if !ok { - return errors.New("control-plane phase invoked with an invalid data struct") + return errors.New("control-plane-prepare phase invoked with an invalid data struct") } - fmt.Printf("[control-plane] Using manifest folder %q\n", data.ManifestDir()) - return nil -} - -func runControlPlaneSubphase(component string) func(c workflow.RunData) error { - return func(c workflow.RunData) error { - data, ok := c.(controlPlaneData) - if !ok { - return errors.New("control-plane phase invoked with an invalid data struct") - } - cfg := data.Cfg() - - fmt.Printf("[control-plane] Creating static Pod manifest for %q\n", component) - return controlplane.CreateStaticPodFiles(data.ManifestDir(), &cfg.ClusterConfiguration, &cfg.LocalAPIEndpoint, component) + // Skip if this is not a control plane + if data.Cfg().ControlPlane == nil { + return nil } + + cfg, err := data.InitCfg() + if err != nil { + return err + } + + // Generate missing certificates (if any) + return controlplane.CreateInitStaticPodManifestFiles(kubeadmconstants.GetStaticPodDirectory(), cfg) } func runControlPlanePrepareCertsPhaseLocal(c workflow.RunData) error { diff --git a/cmd/kubeadm/app/cmd/phases/preflight.go b/cmd/kubeadm/app/cmd/phases/join/preflight.go similarity index 66% rename from cmd/kubeadm/app/cmd/phases/preflight.go rename to cmd/kubeadm/app/cmd/phases/join/preflight.go index 35c9e63e24..d83cbd33e3 100644 --- a/cmd/kubeadm/app/cmd/phases/preflight.go +++ b/cmd/kubeadm/app/cmd/phases/join/preflight.go @@ -35,11 +35,7 @@ import ( ) var ( - initPreflightExample = normalizer.Examples(` - # Run master pre-flight checks using a config file. - kubeadm init phase preflight --config kubeadm-config.yml - `) - joinPreflightExample = normalizer.Examples(` + preflightExample = normalizer.Examples(` # Run join pre-flight checks using a config file. kubeadm join phase preflight --config kubeadm-config.yml `) @@ -56,71 +52,20 @@ var ( `))) ) -// preflightMasterData defines the behavior that a runtime data struct passed to the PreflightMaster master phase -// should have. Please note that we are using an interface in order to make this phase reusable in different workflows -// (and thus with different runtime data struct, all of them requested to be compliant to this interface) -type preflightMasterData interface { - Cfg() *kubeadmapi.InitConfiguration - DryRun() bool - IgnorePreflightErrors() sets.String -} - -type preflightJoinData interface { +type preflightData interface { Cfg() *kubeadmapi.JoinConfiguration InitCfg() (*kubeadmapi.InitConfiguration, error) IgnorePreflightErrors() sets.String } -// NewPreflightMasterPhase creates a kubeadm workflow phase that implements preflight checks for a new master node. -func NewPreflightMasterPhase() workflow.Phase { - return workflow.Phase{ - Name: "preflight", - Short: "Run master pre-flight checks", - Long: "Run master pre-flight checks, functionally equivalent to what implemented by kubeadm init.", - Example: initPreflightExample, - Run: runPreflightMaster, - InheritFlags: []string{ - options.CfgPath, - options.IgnorePreflightErrors, - }, - } -} - -// TODO(dmaiocchi): rename all instances of master to controlPlane in this file. -// runPreflightMaster executes preflight checks logic. -func runPreflightMaster(c workflow.RunData) error { - data, ok := c.(preflightMasterData) - if !ok { - return errors.New("preflight phase invoked with an invalid data struct") - } - - fmt.Println("[preflight] Running pre-flight checks") - if err := preflight.RunInitMasterChecks(utilsexec.New(), data.Cfg(), data.IgnorePreflightErrors()); err != nil { - return err - } - - if !data.DryRun() { - fmt.Println("[preflight] Pulling images required for setting up a Kubernetes cluster") - fmt.Println("[preflight] This might take a minute or two, depending on the speed of your internet connection") - fmt.Println("[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'") - if err := preflight.RunPullImagesCheck(utilsexec.New(), data.Cfg(), data.IgnorePreflightErrors()); err != nil { - return err - } - } else { - fmt.Println("[preflight] Would pull the required images (like 'kubeadm config images pull')") - } - - return nil -} - -// NewPreflightJoinPhase creates a kubeadm workflow phase that implements preflight checks for a new node join -func NewPreflightJoinPhase() workflow.Phase { +// NewPreflightPhase creates a kubeadm workflow phase that implements preflight checks for a new node join +func NewPreflightPhase() workflow.Phase { return workflow.Phase{ Name: "preflight", Short: "Run join pre-flight checks", - Long: "Run join pre-flight checks, functionally equivalent to what is implemented by kubeadm join.", - Example: joinPreflightExample, - Run: runPreflightJoin, + Long: "Run pre-flight checks for kubeadm join.", + Example: preflightExample, + Run: runPreflight, InheritFlags: []string{ options.CfgPath, options.IgnorePreflightErrors, @@ -139,12 +84,14 @@ func NewPreflightJoinPhase() workflow.Phase { } } -// runPreflightJoin executes preflight checks logic. -func runPreflightJoin(c workflow.RunData) error { - j, ok := c.(preflightJoinData) +// runPreflight executes preflight checks logic. +func runPreflight(c workflow.RunData) error { + j, ok := c.(preflightData) if !ok { return errors.New("preflight phase invoked with an invalid data struct") } + fmt.Println("[preflight] Running pre-flight checks") + // Start with general checks klog.V(1).Infoln("[preflight] Running general checks") if err := preflight.RunJoinNodeChecks(utilsexec.New(), j.Cfg(), j.IgnorePreflightErrors()); err != nil { @@ -182,7 +129,9 @@ func runPreflightJoin(c workflow.RunData) error { return err } - fmt.Println("[preflight] Pulling control-plane images") + fmt.Println("[preflight] Pulling images required for setting up a Kubernetes cluster") + fmt.Println("[preflight] This might take a minute or two, depending on the speed of your internet connection") + fmt.Println("[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'") if err := preflight.RunPullImagesCheck(utilsexec.New(), initCfg, j.IgnorePreflightErrors()); err != nil { return err }