From ac161866aa73a41a33284c3bf24132ee75720c5a Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Wed, 12 May 2021 00:32:46 +0300 Subject: [PATCH 1/2] kubeadm: add SkipPhases in {Init|Join}Configuration for v1beta3 - Add the field SkipPhases in the public v1beta3 as a []string (omitempty) - Add the field in the internal type - Run generators - Adapt v1beta2 converter for JoinConfiguration --- cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go | 2 ++ cmd/kubeadm/app/apis/kubeadm/types.go | 10 ++++++++++ .../app/apis/kubeadm/v1beta2/conversion.go | 5 +++++ .../kubeadm/v1beta2/zz_generated.conversion.go | 17 +++++++---------- cmd/kubeadm/app/apis/kubeadm/v1beta3/doc.go | 4 ++++ cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go | 12 ++++++++++++ .../kubeadm/v1beta3/zz_generated.conversion.go | 4 ++++ .../kubeadm/v1beta3/zz_generated.deepcopy.go | 10 ++++++++++ .../app/apis/kubeadm/zz_generated.deepcopy.go | 10 ++++++++++ 9 files changed, 64 insertions(+), 10 deletions(-) diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go index 732cb731327..69a86c63883 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go @@ -56,6 +56,7 @@ func fuzzInitConfiguration(obj *kubeadm.InitConfiguration, c fuzz.Continue) { TTL: &metav1.Duration{Duration: 1234}, }, } + obj.SkipPhases = nil } func fuzzNodeRegistration(obj *kubeadm.NodeRegistrationOptions, c fuzz.Continue) { @@ -116,6 +117,7 @@ func fuzzJoinConfiguration(obj *kubeadm.JoinConfiguration, c fuzz.Continue) { TLSBootstrapToken: "qux", Timeout: &metav1.Duration{Duration: 1234}, } + obj.SkipPhases = nil } func fuzzJoinControlPlane(obj *kubeadm.JoinControlPlane, c fuzz.Continue) { diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index b456279bcfa..39539b774a4 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -57,6 +57,11 @@ type InitConfiguration struct { // CertificateKey sets the key with which certificates and keys are encrypted prior to being uploaded in // a secret in the cluster during the uploadcerts init phase. CertificateKey string + + // SkipPhases is a list of phases to skip during command execution. + // The list of phases can be obtained with the "kubeadm init --help" command. + // The flag "--skip-phases" takes precedence over this field. + SkipPhases []string } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -313,6 +318,11 @@ type JoinConfiguration struct { // ControlPlane defines the additional control plane instance to be deployed on the joining node. // If nil, no additional control plane instance will be deployed. ControlPlane *JoinControlPlane + + // SkipPhases is a list of phases to skip during command execution. + // The list of phases can be obtained with the "kubeadm join --help" command. + // The flag "--skip-phases" takes precedence over this field. + SkipPhases []string } // JoinControlPlane contains elements describing an additional control plane instance to be deployed on the joining node. diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go index 5fbc763d46c..896dbb3cde7 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go @@ -38,3 +38,8 @@ func Convert_v1beta2_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf func Convert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(in *ClusterConfiguration, out *kubeadm.ClusterConfiguration, s conversion.Scope) error { return autoConvert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(in, out, s) } + +// Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration is required since v1beta2 does not have SkipPhases in JoinConfiguration +func Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error { + return autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in, out, s) +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go index ff0ebd4f90f..4cc656a7fcb 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go @@ -177,11 +177,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*kubeadm.JoinConfiguration)(nil), (*JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(a.(*kubeadm.JoinConfiguration), b.(*JoinConfiguration), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*JoinControlPlane)(nil), (*kubeadm.JoinControlPlane)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(a.(*JoinControlPlane), b.(*kubeadm.JoinControlPlane), scope) }); err != nil { @@ -227,6 +222,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*kubeadm.JoinConfiguration)(nil), (*JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(a.(*kubeadm.JoinConfiguration), b.(*JoinConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*ClusterConfiguration)(nil), (*kubeadm.ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(a.(*ClusterConfiguration), b.(*kubeadm.ClusterConfiguration), scope) }); err != nil { @@ -646,6 +646,7 @@ func autoConvert_kubeadm_InitConfiguration_To_v1beta2_InitConfiguration(in *kube return err } out.CertificateKey = in.CertificateKey + // WARNING: in.SkipPhases requires manual conversion: does not exist in peer-type return nil } @@ -675,14 +676,10 @@ func autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kube return err } out.ControlPlane = (*JoinControlPlane)(unsafe.Pointer(in.ControlPlane)) + // WARNING: in.SkipPhases requires manual conversion: does not exist in peer-type return nil } -// Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration is an autogenerated conversion function. -func Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error { - return autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in, out, s) -} - func autoConvert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(in *JoinControlPlane, out *kubeadm.JoinControlPlane, s conversion.Scope) error { if err := Convert_v1beta2_APIEndpoint_To_kubeadm_APIEndpoint(&in.LocalAPIEndpoint, &out.LocalAPIEndpoint, s); err != nil { return err diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/doc.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/doc.go index 1562b7e97bd..85c963968c5 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/doc.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/doc.go @@ -29,6 +29,8 @@ limitations under the License. // DNS server type by kubeadm. // - Include "datapolicy" tags on the fields that hold secrets. // This would result in the field values to be omitted when API structures are printed with klog. +// - Add "InitConfiguration.SkipPhases", "JoinConfiguration.SkipPhases" to allow skipping +// a list of phases during kubeadm init/join command execution. // // Migration from old kubeadm config versions // @@ -177,6 +179,8 @@ limitations under the License. // advertiseAddress: "10.100.0.1" // bindPort: 6443 // certificateKey: "e6a2eb8581237ab72a4f494f30285ec12a9694d750b9785706a83bfcbbbd2204" +// skipPhases: +// - addon/kube-proxy // --- // apiVersion: kubeadm.k8s.io/v1beta3 // kind: ClusterConfiguration diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go index adcf7d5eece..12816b057e6 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/types.go @@ -50,6 +50,12 @@ type InitConfiguration struct { // CertificateKey sets the key with which certificates and keys are encrypted prior to being uploaded in // a secret in the cluster during the uploadcerts init phase. CertificateKey string `json:"certificateKey,omitempty"` + + // SkipPhases is a list of phases to skip during command execution. + // The list of phases can be obtained with the "kubeadm init --help" command. + // The flag "--skip-phases" takes precedence over this field. + // +optional + SkipPhases []string `json:"skipPhases,omitempty"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -290,6 +296,12 @@ type JoinConfiguration struct { // ControlPlane defines the additional control plane instance to be deployed on the joining node. // If nil, no additional control plane instance will be deployed. ControlPlane *JoinControlPlane `json:"controlPlane,omitempty"` + + // SkipPhases is a list of phases to skip during command execution. + // The list of phases can be obtained with the "kubeadm join --help" command. + // The flag "--skip-phases" takes precedence over this field. + // +optional + SkipPhases []string `json:"skipPhases,omitempty"` } // JoinControlPlane contains elements describing an additional control plane instance to be deployed on the joining node. diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go index 851235fc7de..cb6f338079f 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go @@ -626,6 +626,7 @@ func autoConvert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration(in *Init return err } out.CertificateKey = in.CertificateKey + out.SkipPhases = *(*[]string)(unsafe.Pointer(&in.SkipPhases)) return nil } @@ -639,6 +640,7 @@ func autoConvert_kubeadm_InitConfiguration_To_v1beta3_InitConfiguration(in *kube return err } out.CertificateKey = in.CertificateKey + out.SkipPhases = *(*[]string)(unsafe.Pointer(&in.SkipPhases)) return nil } @@ -651,6 +653,7 @@ func autoConvert_v1beta3_JoinConfiguration_To_kubeadm_JoinConfiguration(in *Join return err } out.ControlPlane = (*kubeadm.JoinControlPlane)(unsafe.Pointer(in.ControlPlane)) + out.SkipPhases = *(*[]string)(unsafe.Pointer(&in.SkipPhases)) return nil } @@ -668,6 +671,7 @@ func autoConvert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration(in *kube return err } out.ControlPlane = (*JoinControlPlane)(unsafe.Pointer(in.ControlPlane)) + out.SkipPhases = *(*[]string)(unsafe.Pointer(&in.SkipPhases)) return nil } diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.deepcopy.go index e8555c3ee2d..44c99cd79c1 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.deepcopy.go @@ -368,6 +368,11 @@ func (in *InitConfiguration) DeepCopyInto(out *InitConfiguration) { } in.NodeRegistration.DeepCopyInto(&out.NodeRegistration) out.LocalAPIEndpoint = in.LocalAPIEndpoint + if in.SkipPhases != nil { + in, out := &in.SkipPhases, &out.SkipPhases + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -400,6 +405,11 @@ func (in *JoinConfiguration) DeepCopyInto(out *JoinConfiguration) { *out = new(JoinControlPlane) **out = **in } + if in.SkipPhases != nil { + in, out := &in.SkipPhases, &out.SkipPhases + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go index da0c28d97cd..2b5975de2a4 100644 --- a/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go +++ b/cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go @@ -398,6 +398,11 @@ func (in *InitConfiguration) DeepCopyInto(out *InitConfiguration) { } in.NodeRegistration.DeepCopyInto(&out.NodeRegistration) out.LocalAPIEndpoint = in.LocalAPIEndpoint + if in.SkipPhases != nil { + in, out := &in.SkipPhases, &out.SkipPhases + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -430,6 +435,11 @@ func (in *JoinConfiguration) DeepCopyInto(out *JoinConfiguration) { *out = new(JoinControlPlane) **out = **in } + if in.SkipPhases != nil { + in, out := &in.SkipPhases, &out.SkipPhases + *out = make([]string, len(*in)) + copy(*out, *in) + } return } From 24a1f9d817ca5c2c5ec5785563457edac7b99f32 Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Wed, 12 May 2021 00:35:48 +0300 Subject: [PATCH 2/2] kubeadm: use "SkipPhases" from configuration for "init" and "join" During Runner data initialization, if the value for the flag "--skip-phases" was empty set the {init|join}Runner.Options.SkipPhases to the {Init|Join}Configuration.SkipPhases value. --- cmd/kubeadm/app/cmd/init.go | 10 +++++++++- cmd/kubeadm/app/cmd/join.go | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cmd/kubeadm/app/cmd/init.go b/cmd/kubeadm/app/cmd/init.go index b1b218ce486..593db6277dc 100644 --- a/cmd/kubeadm/app/cmd/init.go +++ b/cmd/kubeadm/app/cmd/init.go @@ -192,7 +192,15 @@ func newCmdInit(out io.Writer, initOptions *initOptions) *cobra.Command { // sets the data builder function, that will be used by the runner // both when running the entire workflow or single phases initRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) { - return newInitData(cmd, args, initOptions, out) + data, err := newInitData(cmd, args, initOptions, out) + if err != nil { + return nil, err + } + // If the flag for skipping phases was empty, use the values from config + if len(initRunner.Options.SkipPhases) == 0 { + initRunner.Options.SkipPhases = data.cfg.SkipPhases + } + return data, nil }) // binds the Runner to kubeadm init command by altering diff --git a/cmd/kubeadm/app/cmd/join.go b/cmd/kubeadm/app/cmd/join.go index e96585d6f92..ec99883f836 100644 --- a/cmd/kubeadm/app/cmd/join.go +++ b/cmd/kubeadm/app/cmd/join.go @@ -213,7 +213,15 @@ func newCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command { // sets the data builder function, that will be used by the runner // both when running the entire workflow or single phases joinRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) { - return newJoinData(cmd, args, joinOptions, out, kubeadmconstants.GetAdminKubeConfigPath()) + data, err := newJoinData(cmd, args, joinOptions, out, kubeadmconstants.GetAdminKubeConfigPath()) + if err != nil { + return nil, err + } + // If the flag for skipping phases was empty, use the values from config + if len(joinRunner.Options.SkipPhases) == 0 { + joinRunner.Options.SkipPhases = data.cfg.SkipPhases + } + return data, nil }) // binds the Runner to kubeadm join command by altering