diff --git a/api/bootstrap/kubeadm/v1beta1/kubeadm_types.go b/api/bootstrap/kubeadm/v1beta1/kubeadm_types.go index 97f7dafca20c..ef2d849e1d98 100644 --- a/api/bootstrap/kubeadm/v1beta1/kubeadm_types.go +++ b/api/bootstrap/kubeadm/v1beta1/kubeadm_types.go @@ -159,6 +159,10 @@ type ClusterConfiguration struct { // +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MaxLength=63 ClusterName string `json:"clusterName,omitempty"` + + // proxy defines the options for the proxy add-on installed in the cluster. + // +optional + Proxy *Proxy `json:"proxy,omitempty"` } // ControlPlaneComponent holds settings common to control plane component of the cluster. @@ -201,6 +205,17 @@ type APIServer struct { type DNS struct { // ImageMeta allows to customize the image used for the DNS component ImageMeta `json:",inline"` + + // disabled specifies whether to disable this addon in the cluster + // +optional + Disabled *bool `json:"disabled,omitempty"` +} + +// Proxy defines the proxy addon that should be used in the cluster +type Proxy struct { + // disabled specifies whether to disable this addon in the cluster + // +optional + Disabled *bool `json:"disabled,omitempty"` } // ImageMeta allows to customize the image used for components that are not diff --git a/api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go b/api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go index 4ee556df7ccb..546c30100e30 100644 --- a/api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go +++ b/api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go @@ -390,6 +390,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*Proxy)(nil), (*v1beta2.Proxy)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_Proxy_To_v1beta2_Proxy(a.(*Proxy), b.(*v1beta2.Proxy), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta2.Proxy)(nil), (*Proxy)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_Proxy_To_v1beta1_Proxy(a.(*v1beta2.Proxy), b.(*Proxy), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*SecretFileSource)(nil), (*v1beta2.SecretFileSource)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_SecretFileSource_To_v1beta2_SecretFileSource(a.(*SecretFileSource), b.(*v1beta2.SecretFileSource), scope) }); err != nil { @@ -669,6 +679,7 @@ func autoConvert_v1beta1_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) // WARNING: in.ClusterName requires manual conversion: does not exist in peer-type + out.Proxy = (*v1beta2.Proxy)(unsafe.Pointer(in.Proxy)) return nil } @@ -691,6 +702,7 @@ func autoConvert_v1beta2_ClusterConfiguration_To_v1beta1_ClusterConfiguration(in out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + out.Proxy = (*Proxy)(unsafe.Pointer(in.Proxy)) return nil } @@ -739,6 +751,7 @@ func autoConvert_v1beta1_DNS_To_v1beta2_DNS(in *DNS, out *v1beta2.DNS, s convers if err := Convert_v1beta1_ImageMeta_To_v1beta2_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + out.Disabled = (*bool)(unsafe.Pointer(in.Disabled)) return nil } @@ -751,6 +764,7 @@ func autoConvert_v1beta2_DNS_To_v1beta1_DNS(in *v1beta2.DNS, out *DNS, s convers if err := Convert_v1beta2_ImageMeta_To_v1beta1_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + out.Disabled = (*bool)(unsafe.Pointer(in.Disabled)) return nil } @@ -1779,6 +1793,26 @@ func Convert_v1beta2_Patches_To_v1beta1_Patches(in *v1beta2.Patches, out *Patche return autoConvert_v1beta2_Patches_To_v1beta1_Patches(in, out, s) } +func autoConvert_v1beta1_Proxy_To_v1beta2_Proxy(in *Proxy, out *v1beta2.Proxy, s conversion.Scope) error { + out.Disabled = (*bool)(unsafe.Pointer(in.Disabled)) + return nil +} + +// Convert_v1beta1_Proxy_To_v1beta2_Proxy is an autogenerated conversion function. +func Convert_v1beta1_Proxy_To_v1beta2_Proxy(in *Proxy, out *v1beta2.Proxy, s conversion.Scope) error { + return autoConvert_v1beta1_Proxy_To_v1beta2_Proxy(in, out, s) +} + +func autoConvert_v1beta2_Proxy_To_v1beta1_Proxy(in *v1beta2.Proxy, out *Proxy, s conversion.Scope) error { + out.Disabled = (*bool)(unsafe.Pointer(in.Disabled)) + return nil +} + +// Convert_v1beta2_Proxy_To_v1beta1_Proxy is an autogenerated conversion function. +func Convert_v1beta2_Proxy_To_v1beta1_Proxy(in *v1beta2.Proxy, out *Proxy, s conversion.Scope) error { + return autoConvert_v1beta2_Proxy_To_v1beta1_Proxy(in, out, s) +} + func autoConvert_v1beta1_SecretFileSource_To_v1beta2_SecretFileSource(in *SecretFileSource, out *v1beta2.SecretFileSource, s conversion.Scope) error { out.Name = in.Name out.Key = in.Key diff --git a/api/bootstrap/kubeadm/v1beta1/zz_generated.deepcopy.go b/api/bootstrap/kubeadm/v1beta1/zz_generated.deepcopy.go index 0bb852981884..482dd101b0c0 100644 --- a/api/bootstrap/kubeadm/v1beta1/zz_generated.deepcopy.go +++ b/api/bootstrap/kubeadm/v1beta1/zz_generated.deepcopy.go @@ -151,7 +151,7 @@ func (in *ClusterConfiguration) DeepCopyInto(out *ClusterConfiguration) { in.APIServer.DeepCopyInto(&out.APIServer) in.ControllerManager.DeepCopyInto(&out.ControllerManager) in.Scheduler.DeepCopyInto(&out.Scheduler) - out.DNS = in.DNS + in.DNS.DeepCopyInto(&out.DNS) if in.FeatureGates != nil { in, out := &in.FeatureGates, &out.FeatureGates *out = make(map[string]bool, len(*in)) @@ -159,6 +159,11 @@ func (in *ClusterConfiguration) DeepCopyInto(out *ClusterConfiguration) { (*out)[key] = val } } + if in.Proxy != nil { + in, out := &in.Proxy, &out.Proxy + *out = new(Proxy) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterConfiguration. @@ -263,6 +268,11 @@ func (in *ControlPlaneComponent) DeepCopy() *ControlPlaneComponent { func (in *DNS) DeepCopyInto(out *DNS) { *out = *in out.ImageMeta = in.ImageMeta + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = new(bool) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNS. @@ -1252,6 +1262,26 @@ func (in *Patches) DeepCopy() *Patches { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Proxy) DeepCopyInto(out *Proxy) { + *out = *in + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. +func (in *Proxy) DeepCopy() *Proxy { + if in == nil { + return nil + } + out := new(Proxy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SecretFileSource) DeepCopyInto(out *SecretFileSource) { *out = *in diff --git a/api/bootstrap/kubeadm/v1beta2/kubeadm_types.go b/api/bootstrap/kubeadm/v1beta2/kubeadm_types.go index 982a5f9a555a..85390b90f9c3 100644 --- a/api/bootstrap/kubeadm/v1beta2/kubeadm_types.go +++ b/api/bootstrap/kubeadm/v1beta2/kubeadm_types.go @@ -164,6 +164,10 @@ type ClusterConfiguration struct { // featureGates enabled by the user. // +optional FeatureGates map[string]bool `json:"featureGates,omitempty"` + + // proxy defines the options for the proxy add-on installed in the cluster. + // +optional + Proxy *Proxy `json:"proxy,omitempty"` } // ControlPlaneComponent holds settings common to control plane component of the cluster. @@ -209,6 +213,17 @@ type APIServer struct { type DNS struct { // ImageMeta allows to customize the image used for the DNS component ImageMeta `json:",inline"` + + // disabled specifies whether to disable this addon in the cluster + // +optional + Disabled *bool `json:"disabled,omitempty"` +} + +// Proxy defines the proxy addon that should be used in the cluster +type Proxy struct { + // disabled specifies whether to disable this addon in the cluster + // +optional + Disabled *bool `json:"disabled,omitempty"` } // ImageMeta allows to customize the image used for components that are not diff --git a/api/bootstrap/kubeadm/v1beta2/zz_generated.deepcopy.go b/api/bootstrap/kubeadm/v1beta2/zz_generated.deepcopy.go index 4e6c16ea0ee3..57a89c04b076 100644 --- a/api/bootstrap/kubeadm/v1beta2/zz_generated.deepcopy.go +++ b/api/bootstrap/kubeadm/v1beta2/zz_generated.deepcopy.go @@ -159,7 +159,7 @@ func (in *ClusterConfiguration) DeepCopyInto(out *ClusterConfiguration) { in.APIServer.DeepCopyInto(&out.APIServer) in.ControllerManager.DeepCopyInto(&out.ControllerManager) in.Scheduler.DeepCopyInto(&out.Scheduler) - out.DNS = in.DNS + in.DNS.DeepCopyInto(&out.DNS) if in.FeatureGates != nil { in, out := &in.FeatureGates, &out.FeatureGates *out = make(map[string]bool, len(*in)) @@ -167,6 +167,11 @@ func (in *ClusterConfiguration) DeepCopyInto(out *ClusterConfiguration) { (*out)[key] = val } } + if in.Proxy != nil { + in, out := &in.Proxy, &out.Proxy + *out = new(Proxy) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterConfiguration. @@ -230,6 +235,11 @@ func (in *ControlPlaneComponent) DeepCopy() *ControlPlaneComponent { func (in *DNS) DeepCopyInto(out *DNS) { *out = *in out.ImageMeta = in.ImageMeta + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = new(bool) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNS. @@ -1227,6 +1237,26 @@ func (in *Patches) DeepCopy() *Patches { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Proxy) DeepCopyInto(out *Proxy) { + *out = *in + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. +func (in *Proxy) DeepCopy() *Proxy { + if in == nil { + return nil + } + out := new(Proxy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SecretFileSource) DeepCopyInto(out *SecretFileSource) { *out = *in diff --git a/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml b/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml index e8cda57918c5..501df3f283c4 100644 --- a/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml +++ b/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml @@ -2456,6 +2456,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable this addon + in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -2758,6 +2762,15 @@ spec: minLength: 1 type: string type: object + proxy: + description: proxy defines the options for the proxy add-on installed + in the cluster. + properties: + disabled: + description: disabled specifies whether to disable this addon + in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component @@ -4555,6 +4568,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable this addon + in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -4840,6 +4857,15 @@ spec: maxLength: 512 minLength: 1 type: string + proxy: + description: proxy defines the options for the proxy add-on installed + in the cluster. + properties: + disabled: + description: disabled specifies whether to disable this addon + in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component diff --git a/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml b/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml index 2d8cd5ca7558..c162ef9396fc 100644 --- a/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml +++ b/bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml @@ -2415,6 +2415,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -2724,6 +2728,15 @@ spec: minLength: 1 type: string type: object + proxy: + description: proxy defines the options for the proxy add-on + installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component @@ -4435,6 +4448,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -4728,6 +4745,15 @@ spec: maxLength: 512 minLength: 1 type: string + proxy: + description: proxy defines the options for the proxy add-on + installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component diff --git a/bootstrap/kubeadm/types/upstreamv1beta3/conversion.go b/bootstrap/kubeadm/types/upstreamv1beta3/conversion.go index d319d875c47a..a6cea88bed59 100644 --- a/bootstrap/kubeadm/types/upstreamv1beta3/conversion.go +++ b/bootstrap/kubeadm/types/upstreamv1beta3/conversion.go @@ -59,6 +59,16 @@ func (dst *JoinConfiguration) ConvertFrom(srcRaw conversion.Hub) error { // Custom conversion from this API, kubeadm v1beta3, to the hub version, CABPK v1beta1. +func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error { + // v1beta3 has no ClusterConfiguration.Proxy + return autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in, out, s) +} + +func Convert_v1beta2_DNS_To_upstreamv1beta3_DNS(in *bootstrapv1.DNS, out *DNS, s apimachineryconversion.Scope) error { + // v1beta3 has no ClusterConfiguration.DNS.Disabled + return autoConvert_v1beta2_DNS_To_upstreamv1beta3_DNS(in, out, s) +} + func Convert_upstreamv1beta3_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in *ClusterConfiguration, out *bootstrapv1.ClusterConfiguration, s apimachineryconversion.Scope) error { return autoConvert_upstreamv1beta3_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in, out, s) } diff --git a/bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go b/bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go index 109596a83f63..52a411562784 100644 --- a/bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go +++ b/bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go @@ -73,21 +73,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DNS)(nil), (*v1beta2.DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_upstreamv1beta3_DNS_To_v1beta2_DNS(a.(*DNS), b.(*v1beta2.DNS), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DNS_To_upstreamv1beta3_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta2.Discovery)(nil), (*Discovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_Discovery_To_upstreamv1beta3_Discovery(a.(*v1beta2.Discovery), b.(*Discovery), scope) }); err != nil { @@ -208,11 +198,21 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.ControlPlaneComponent)(nil), (*ControlPlaneComponent)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_ControlPlaneComponent_To_upstreamv1beta3_ControlPlaneComponent(a.(*v1beta2.ControlPlaneComponent), b.(*ControlPlaneComponent), scope) }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DNS_To_upstreamv1beta3_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.FileDiscovery)(nil), (*FileDiscovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_FileDiscovery_To_upstreamv1beta3_FileDiscovery(a.(*v1beta2.FileDiscovery), b.(*FileDiscovery), scope) }); err != nil { @@ -399,14 +399,10 @@ func autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfigur out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + // WARNING: in.Proxy requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration is an autogenerated conversion function. -func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in *v1beta2.ClusterConfiguration, out *ClusterConfiguration, s conversion.Scope) error { - return autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in, out, s) -} - func autoConvert_upstreamv1beta3_ControlPlaneComponent_To_v1beta2_ControlPlaneComponent(in *ControlPlaneComponent, out *v1beta2.ControlPlaneComponent, s conversion.Scope) error { // WARNING: in.ExtraArgs requires manual conversion: inconvertible types (map[string]string vs []sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2.Arg) out.ExtraVolumes = *(*[]v1beta2.HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) @@ -436,14 +432,10 @@ func autoConvert_v1beta2_DNS_To_upstreamv1beta3_DNS(in *v1beta2.DNS, out *DNS, s if err := Convert_v1beta2_ImageMeta_To_upstreamv1beta3_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + // WARNING: in.Disabled requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_DNS_To_upstreamv1beta3_DNS is an autogenerated conversion function. -func Convert_v1beta2_DNS_To_upstreamv1beta3_DNS(in *v1beta2.DNS, out *DNS, s conversion.Scope) error { - return autoConvert_v1beta2_DNS_To_upstreamv1beta3_DNS(in, out, s) -} - func autoConvert_upstreamv1beta3_Discovery_To_v1beta2_Discovery(in *Discovery, out *v1beta2.Discovery, s conversion.Scope) error { out.BootstrapToken = (*v1beta2.BootstrapTokenDiscovery)(unsafe.Pointer(in.BootstrapToken)) if in.File != nil { diff --git a/bootstrap/kubeadm/types/upstreamv1beta4/conversion.go b/bootstrap/kubeadm/types/upstreamv1beta4/conversion.go index 7f74e1c1d371..22ad84d477d9 100644 --- a/bootstrap/kubeadm/types/upstreamv1beta4/conversion.go +++ b/bootstrap/kubeadm/types/upstreamv1beta4/conversion.go @@ -124,6 +124,17 @@ func Convert_v1beta2_APIServer_To_upstreamv1beta4_APIServer(in *bootstrapv1.APIS return autoConvert_v1beta2_APIServer_To_upstreamv1beta4_APIServer(in, out, s) } +func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error { + if err := autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in, out, s); err != nil { + return err + } + + if in.Proxy != nil { + return Convert_v1beta2_Proxy_To_upstreamv1beta4_Proxy(in.Proxy, &out.Proxy, s) + } + return nil +} + func Convert_v1beta2_Discovery_To_upstreamv1beta4_Discovery(in *bootstrapv1.Discovery, out *Discovery, s apimachineryconversion.Scope) error { // Following fields do not exist in kubeadm v1beta4 version: // - Timeout (this field has been migrated to JoinConfiguration.Timeouts.TLSBootstrap, the conversion is handled in Convert_v1beta2_JoinConfiguration_To_upstreamv1beta4_JoinConfiguration) diff --git a/bootstrap/kubeadm/types/upstreamv1beta4/zz_generated.conversion.go b/bootstrap/kubeadm/types/upstreamv1beta4/zz_generated.conversion.go index cfd8884939f5..ddca90a90df0 100644 --- a/bootstrap/kubeadm/types/upstreamv1beta4/zz_generated.conversion.go +++ b/bootstrap/kubeadm/types/upstreamv1beta4/zz_generated.conversion.go @@ -83,11 +83,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*ControlPlaneComponent)(nil), (*v1beta2.ControlPlaneComponent)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_upstreamv1beta4_ControlPlaneComponent_To_v1beta2_ControlPlaneComponent(a.(*ControlPlaneComponent), b.(*v1beta2.ControlPlaneComponent), scope) }); err != nil { @@ -208,6 +203,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*Proxy)(nil), (*v1beta2.Proxy)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_upstreamv1beta4_Proxy_To_v1beta2_Proxy(a.(*Proxy), b.(*v1beta2.Proxy), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta2.Proxy)(nil), (*Proxy)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_Proxy_To_upstreamv1beta4_Proxy(a.(*v1beta2.Proxy), b.(*Proxy), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*BootstrapToken)(nil), (*v1beta2.BootstrapToken)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_upstreamv1beta4_BootstrapToken_To_v1beta2_BootstrapToken(a.(*BootstrapToken), b.(*v1beta2.BootstrapToken), scope) }); err != nil { @@ -253,6 +258,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.Discovery)(nil), (*Discovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_Discovery_To_upstreamv1beta4_Discovery(a.(*v1beta2.Discovery), b.(*Discovery), scope) }); err != nil { @@ -424,7 +434,7 @@ func autoConvert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfigur if err := Convert_upstreamv1beta4_DNS_To_v1beta2_DNS(&in.DNS, &out.DNS, s); err != nil { return err } - // WARNING: in.Proxy requires manual conversion: does not exist in peer-type + // WARNING: in.Proxy requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/bootstrap/kubeadm/types/upstreamv1beta4.Proxy vs *sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2.Proxy) out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) @@ -454,14 +464,10 @@ func autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfigur out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + // WARNING: in.Proxy requires manual conversion: inconvertible types (*sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2.Proxy vs sigs.k8s.io/cluster-api/bootstrap/kubeadm/types/upstreamv1beta4.Proxy) return nil } -// Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration is an autogenerated conversion function. -func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in *v1beta2.ClusterConfiguration, out *ClusterConfiguration, s conversion.Scope) error { - return autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in, out, s) -} - func autoConvert_upstreamv1beta4_ControlPlaneComponent_To_v1beta2_ControlPlaneComponent(in *ControlPlaneComponent, out *v1beta2.ControlPlaneComponent, s conversion.Scope) error { out.ExtraArgs = *(*[]v1beta2.Arg)(unsafe.Pointer(&in.ExtraArgs)) out.ExtraVolumes = *(*[]v1beta2.HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) @@ -490,7 +496,9 @@ func autoConvert_upstreamv1beta4_DNS_To_v1beta2_DNS(in *DNS, out *v1beta2.DNS, s if err := Convert_upstreamv1beta4_ImageMeta_To_v1beta2_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } - // WARNING: in.Disabled requires manual conversion: does not exist in peer-type + if err := v1.Convert_bool_To_Pointer_bool(&in.Disabled, &out.Disabled, s); err != nil { + return err + } return nil } @@ -498,6 +506,9 @@ func autoConvert_v1beta2_DNS_To_upstreamv1beta4_DNS(in *v1beta2.DNS, out *DNS, s if err := Convert_v1beta2_ImageMeta_To_upstreamv1beta4_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + if err := v1.Convert_Pointer_bool_To_bool(&in.Disabled, &out.Disabled, s); err != nil { + return err + } return nil } @@ -922,6 +933,30 @@ func Convert_v1beta2_Patches_To_upstreamv1beta4_Patches(in *v1beta2.Patches, out return autoConvert_v1beta2_Patches_To_upstreamv1beta4_Patches(in, out, s) } +func autoConvert_upstreamv1beta4_Proxy_To_v1beta2_Proxy(in *Proxy, out *v1beta2.Proxy, s conversion.Scope) error { + if err := v1.Convert_bool_To_Pointer_bool(&in.Disabled, &out.Disabled, s); err != nil { + return err + } + return nil +} + +// Convert_upstreamv1beta4_Proxy_To_v1beta2_Proxy is an autogenerated conversion function. +func Convert_upstreamv1beta4_Proxy_To_v1beta2_Proxy(in *Proxy, out *v1beta2.Proxy, s conversion.Scope) error { + return autoConvert_upstreamv1beta4_Proxy_To_v1beta2_Proxy(in, out, s) +} + +func autoConvert_v1beta2_Proxy_To_upstreamv1beta4_Proxy(in *v1beta2.Proxy, out *Proxy, s conversion.Scope) error { + if err := v1.Convert_Pointer_bool_To_bool(&in.Disabled, &out.Disabled, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta2_Proxy_To_upstreamv1beta4_Proxy is an autogenerated conversion function. +func Convert_v1beta2_Proxy_To_upstreamv1beta4_Proxy(in *v1beta2.Proxy, out *Proxy, s conversion.Scope) error { + return autoConvert_v1beta2_Proxy_To_upstreamv1beta4_Proxy(in, out, s) +} + func autoConvert_upstreamv1beta4_Timeouts_To_v1beta2_Timeouts(in *Timeouts, out *v1beta2.Timeouts, s conversion.Scope) error { // WARNING: in.ControlPlaneComponentHealthCheck requires manual conversion: does not exist in peer-type // WARNING: in.KubeletHealthCheck requires manual conversion: does not exist in peer-type diff --git a/bootstrap/kubeadm/types/utils_test.go b/bootstrap/kubeadm/types/utils_test.go index 399651c9ec56..6894cdb2e91f 100644 --- a/bootstrap/kubeadm/types/utils_test.go +++ b/bootstrap/kubeadm/types/utils_test.go @@ -188,6 +188,38 @@ func TestMarshalClusterConfigurationForVersion(t *testing.T) { "scheduler: {}\n", wantErr: false, }, + { + name: "Allow to disable DNS or Proxy", + args: args{ + capiObj: &bootstrapv1.ClusterConfiguration{ + DNS: bootstrapv1.DNS{ + Disabled: ptr.To(true), + }, + Proxy: &bootstrapv1.Proxy{ + Disabled: ptr.To(true), + }, + }, + version: semver.MustParse("1.31.0"), + }, + want: "apiServer: {}\n" + + "apiVersion: kubeadm.k8s.io/v1beta4\n" + + "clusterName: mycluster\n" + + "controlPlaneEndpoint: myControlPlaneEndpoint:6443\n" + + "controllerManager: {}\n" + + "dns:\n" + + " disabled: true\n" + + "etcd: {}\n" + + "kind: ClusterConfiguration\n" + + "kubernetesVersion: v1.31.0\n" + + "networking:\n" + + " dnsDomain: myDNSDomain\n" + + " podSubnet: myPodSubnet\n" + + " serviceSubnet: myServiceSubnet\n" + + "proxy:\n" + + " disabled: true\n" + + "scheduler: {}\n", + wantErr: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml index 3841b59206dd..d1f628719bb6 100644 --- a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml +++ b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanes.yaml @@ -2931,6 +2931,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable this + addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -3237,6 +3241,15 @@ spec: minLength: 1 type: string type: object + proxy: + description: proxy defines the options for the proxy add-on + installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable this + addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component @@ -5481,6 +5494,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable this + addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -5770,6 +5787,15 @@ spec: maxLength: 512 minLength: 1 type: string + proxy: + description: proxy defines the options for the proxy add-on + installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable this + addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component diff --git a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml index b575572e3186..0af2f36842ee 100644 --- a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml +++ b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml @@ -1630,6 +1630,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -1944,6 +1948,15 @@ spec: minLength: 1 type: string type: object + proxy: + description: proxy defines the options for the proxy + add-on installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component @@ -3857,6 +3870,10 @@ spec: description: dns defines the options for the DNS add-on installed in the cluster. properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean imageRepository: description: |- imageRepository sets the container registry to pull images from. @@ -4157,6 +4174,15 @@ spec: maxLength: 512 minLength: 1 type: string + proxy: + description: proxy defines the options for the proxy + add-on installed in the cluster. + properties: + disabled: + description: disabled specifies whether to disable + this addon in the cluster + type: boolean + type: object scheduler: description: scheduler contains extra settings for the scheduler control plane component diff --git a/controlplane/kubeadm/internal/controllers/controller_test.go b/controlplane/kubeadm/internal/controllers/controller_test.go index 729d1ce49616..e7f605d4139c 100644 --- a/controlplane/kubeadm/internal/controllers/controller_test.go +++ b/controlplane/kubeadm/internal/controllers/controller_test.go @@ -3376,7 +3376,7 @@ kubernetesVersion: metav1.16.1`, g.Expect(workloadCluster.UpdateCoreDNS(ctx, kcp)).To(Succeed()) }) - t.Run("should not return an error when no DNS upgrade is requested", func(t *testing.T) { + t.Run("should not return an error when no DNS upgrade is requested using annotation", func(t *testing.T) { g := NewWithT(t) objs := []client.Object{ cluster.DeepCopy(), @@ -3413,6 +3413,41 @@ kubernetesVersion: metav1.16.1`, g.Expect(actualCoreDNSDeployment.Spec.Template.Spec.Containers[0].Image).ToNot(ContainSubstring("coredns")) }) + t.Run("should not return an error when no DNS upgrade is requested using spec", func(t *testing.T) { + g := NewWithT(t) + depl := depl.DeepCopy() + depl.Spec.Template.Spec.Containers[0].Image = "my-cool-image!!!!" // something very unlikely for getCoreDNSInfo to parse + kcp := kcp.DeepCopy() + kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.Disabled = ptr.To(true) + objs := []client.Object{ + cluster.DeepCopy(), + corednsCM.DeepCopy(), + kubeadmCM.DeepCopy(), + depl, + } + + fakeClient := newFakeClient(objs...) + workloadCluster := fakeWorkloadCluster{ + Workload: &internal.Workload{ + Client: fakeClient, + }, + } + + g.Expect(workloadCluster.UpdateCoreDNS(ctx, kcp)).To(Succeed()) + + var actualCoreDNSCM corev1.ConfigMap + g.Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "coredns", Namespace: metav1.NamespaceSystem}, &actualCoreDNSCM)).To(Succeed()) + g.Expect(actualCoreDNSCM.Data).To(Equal(corednsCM.Data)) + + var actualKubeadmConfig corev1.ConfigMap + g.Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "kubeadm-config", Namespace: metav1.NamespaceSystem}, &actualKubeadmConfig)).To(Succeed()) + g.Expect(actualKubeadmConfig.Data).To(Equal(kubeadmCM.Data)) + + var actualCoreDNSDeployment appsv1.Deployment + g.Expect(fakeClient.Get(ctx, client.ObjectKey{Name: "coredns", Namespace: metav1.NamespaceSystem}, &actualCoreDNSDeployment)).To(Succeed()) + g.Expect(actualCoreDNSDeployment.Spec.Template.Spec.Containers[0].Image).To(Equal("my-cool-image!!!!")) + }) + t.Run("returns error when unable to UpdateCoreDNS", func(t *testing.T) { g := NewWithT(t) objs := []client.Object{ diff --git a/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane.go b/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane.go index 83c948f94d03..c07ea3998d31 100644 --- a/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane.go +++ b/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -642,6 +643,11 @@ func (webhook *KubeadmControlPlane) validateCoreDNSVersion(oldK, newK *controlpl return allErrs } + // Skip validating if DNS is disabled. + if ptr.Deref(newK.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.Disabled, false) { + return allErrs + } + if err := migration.ValidUpMigration(version.MajorMinorPatch(fromVersion).String(), version.MajorMinorPatch(toVersion).String()); err != nil { allErrs = append( allErrs, diff --git a/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane_test.go b/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane_test.go index 7c374566e817..7b9c00769bb5 100644 --- a/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane_test.go +++ b/controlplane/kubeadm/internal/webhooks/kubeadm_control_plane_test.go @@ -577,6 +577,15 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) { controlplanev1.SkipCoreDNSAnnotation: "", } + validUnsupportedCoreDNSVersionWithDisabledDNS := dns.DeepCopy() + validUnsupportedCoreDNSVersionWithDisabledDNS.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS = bootstrapv1.DNS{ + ImageMeta: bootstrapv1.ImageMeta{ + ImageRepository: "gcr.io/capi-test", + ImageTag: "v99.99.99", + }, + Disabled: ptr.To(true), + } + unsetCoreDNSToVersion := dns.DeepCopy() unsetCoreDNSToVersion.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS = bootstrapv1.DNS{ ImageMeta: bootstrapv1.ImageMeta{ @@ -887,6 +896,11 @@ func TestKubeadmControlPlaneValidateUpdate(t *testing.T) { before: dns, kcp: validUnsupportedCoreDNSVersionWithSkipAnnotation, }, + { + name: "should succeed when upgrading to an unsupported version and KCP has DNS disabled", + before: dns, + kcp: validUnsupportedCoreDNSVersionWithDisabledDNS, + }, { name: "should fail when using an invalid DNS build", expectErr: true, diff --git a/controlplane/kubeadm/internal/workload_cluster.go b/controlplane/kubeadm/internal/workload_cluster.go index 00c52fee903e..05be5342dcec 100644 --- a/controlplane/kubeadm/internal/workload_cluster.go +++ b/controlplane/kubeadm/internal/workload_cluster.go @@ -424,6 +424,13 @@ func (w *Workload) UpdateKubeProxyImageInfo(ctx context.Context, kcp *controlpla return nil } + // Return early if Proxy is disabled + if kcp.Spec.KubeadmConfigSpec.ClusterConfiguration != nil && + kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Proxy != nil && + ptr.Deref(kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Proxy.Disabled, false) { + return nil + } + ds := &appsv1.DaemonSet{} if err := w.Client.Get(ctx, ctrlclient.ObjectKey{Name: kubeProxyKey, Namespace: metav1.NamespaceSystem}, ds); err != nil { diff --git a/controlplane/kubeadm/internal/workload_cluster_coredns.go b/controlplane/kubeadm/internal/workload_cluster_coredns.go index 7744b5abfc4c..56e33032cf8c 100644 --- a/controlplane/kubeadm/internal/workload_cluster_coredns.go +++ b/controlplane/kubeadm/internal/workload_cluster_coredns.go @@ -28,6 +28,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" bootstrapv1 "sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2" @@ -88,6 +89,11 @@ func (w *Workload) UpdateCoreDNS(ctx context.Context, kcp *controlplanev1.Kubead clusterConfig := kcp.Spec.KubeadmConfigSpec.ClusterConfiguration + // Return early if DNS is disabled + if ptr.Deref(clusterConfig.DNS.Disabled, false) { + return nil + } + // Get the CoreDNS info needed for the upgrade. info, err := w.getCoreDNSInfo(ctx, clusterConfig) if err != nil { diff --git a/controlplane/kubeadm/internal/workload_cluster_coredns_test.go b/controlplane/kubeadm/internal/workload_cluster_coredns_test.go index a459b025b42e..454a1e97c96b 100644 --- a/controlplane/kubeadm/internal/workload_cluster_coredns_test.go +++ b/controlplane/kubeadm/internal/workload_cluster_coredns_test.go @@ -26,6 +26,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -193,6 +194,23 @@ func TestUpdateCoreDNS(t *testing.T) { objs: []client.Object{badCM}, expectErr: false, }, + { + name: "returns early without error if dns is disabled in spec", + kcp: &controlplanev1.KubeadmControlPlane{ + Spec: controlplanev1.KubeadmControlPlaneSpec{ + KubeadmConfigSpec: bootstrapv1.KubeadmConfigSpec{ + ClusterConfiguration: &bootstrapv1.ClusterConfiguration{ + DNS: bootstrapv1.DNS{ + Disabled: ptr.To(true), + }, + }, + }, + Version: "v1.23.0", + }, + }, + objs: []client.Object{badCM}, + expectErr: false, + }, { name: "returns early without error if CoreDNS info is not found", kcp: validKCP, diff --git a/controlplane/kubeadm/internal/workload_cluster_test.go b/controlplane/kubeadm/internal/workload_cluster_test.go index 1f6248cb71dc..1f34ee3bec66 100644 --- a/controlplane/kubeadm/internal/workload_cluster_test.go +++ b/controlplane/kubeadm/internal/workload_cluster_test.go @@ -28,6 +28,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/yaml" @@ -186,6 +187,23 @@ func TestUpdateKubeProxyImageInfo(t *testing.T) { Version: "v1.16.3", }}, }, + { + name: "does not update image repository when DNS is disabled from spec", + ds: newKubeProxyDSWithImage(""), // Using the same image name that would otherwise lead to an error + expectErr: false, + expectImage: "", + KCP: &controlplanev1.KubeadmControlPlane{ + Spec: controlplanev1.KubeadmControlPlaneSpec{ + KubeadmConfigSpec: bootstrapv1.KubeadmConfigSpec{ + ClusterConfiguration: &bootstrapv1.ClusterConfiguration{ + DNS: bootstrapv1.DNS{ + Disabled: ptr.To(true), + }, + }, + }, + Version: "v1.16.3", + }}, + }, } for i := range tests { diff --git a/docs/book/src/reference/api/labels-and-annotations.md b/docs/book/src/reference/api/labels-and-annotations.md index fc428bd5acd6..c8db69c808af 100644 --- a/docs/book/src/reference/api/labels-and-annotations.md +++ b/docs/book/src/reference/api/labels-and-annotations.md @@ -43,8 +43,8 @@ | controlplane.cluster.x-k8s.io/kubeadm-cluster-configuration | It is a machine annotation that stores the json-marshalled string of KCP ClusterConfiguration. This annotation is used to detect any changes in ClusterConfiguration and trigger machine rollout in KCP. | Cluster API | Machines | | controlplane.cluster.x-k8s.io/remediation-for | It is a machine annotation that links a new machine to the unhealthy machine it is replacing. | Cluster API | Machines | | controlplane.cluster.x-k8s.io/remediation-in-progress | It is a KCP annotation that tracks that the system is in between having deleted an unhealthy machine and recreating its replacement. | Cluster API | KubeadmControlPlanes | -| controlplane.cluster.x-k8s.io/skip-coredns | It explicitly skips reconciling CoreDNS if set. | User | KubeadmControlPlanes | -| controlplane.cluster.x-k8s.io/skip-kube-proxy | It explicitly skips reconciling kube-proxy if set. | User | KubeadmControlPlanes | +| controlplane.cluster.x-k8s.io/skip-coredns | *Deprecated*. It explicitly skips reconciling CoreDNS if set. Set `KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.dns.disabled` and `KubeadmConfig.spec.clusterConfiguration.dns.disabled` to `true` instead. | User | KubeadmControlPlanes | +| controlplane.cluster.x-k8s.io/skip-kube-proxy | *Deprecated*. It explicitly skips reconciling kube-proxy if set. Set `KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.proxy.disabled` and `KubeadmConfig.spec.clusterConfiguration.proxy.disabled` to `true` instead. | User | KubeadmControlPlanes | | crd-migration.cluster.x-k8s.io/observed-generation | It indicates on a CRD for which generation CRD migration is completed. | Cluster API | CustomResourceDefinitions | | machine.cluster.x-k8s.io/certificates-expiry | It captures the expiry date of the machine certificates in RFC3339 format. It is used to trigger rollout of control plane machines before certificates expire. It can be set on BootstrapConfig and Machine objects. The value set on Machine object takes precedence. The annotation is only used by control plane machines. | Cluster API/User | BootstrapConfigs, Machines | | machine.cluster.x-k8s.io/exclude-node-draining | It explicitly skips node draining if set. | User | Machines | diff --git a/internal/api/bootstrap/kubeadm/v1alpha3/conversion.go b/internal/api/bootstrap/kubeadm/v1alpha3/conversion.go index 13edd04943bc..a4098779f1d3 100644 --- a/internal/api/bootstrap/kubeadm/v1alpha3/conversion.go +++ b/internal/api/bootstrap/kubeadm/v1alpha3/conversion.go @@ -286,6 +286,16 @@ func Convert_v1alpha3_BootstrapToken_To_v1beta2_BootstrapToken(in *BootstrapToke return nil } +func Convert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error { + // ClusterConfiguration.Proxy does not exist in kubeadm v1alpha3 API. + return autoConvert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(in, out, s) +} + +func Convert_v1beta2_DNS_To_v1alpha3_DNS(in *bootstrapv1.DNS, out *DNS, s apimachineryconversion.Scope) error { + // DNS.Disabled does not exist in kubeadm v1alpha3 API. + return autoConvert_v1beta2_DNS_To_v1alpha3_DNS(in, out, s) +} + func Convert_v1beta2_KubeadmConfigSpec_To_v1alpha3_KubeadmConfigSpec(in *bootstrapv1.KubeadmConfigSpec, out *KubeadmConfigSpec, s apimachineryconversion.Scope) error { // KubeadmConfigSpec.Ignition does not exist in kubeadm v1alpha3 API. return autoConvert_v1beta2_KubeadmConfigSpec_To_v1alpha3_KubeadmConfigSpec(in, out, s) diff --git a/internal/api/bootstrap/kubeadm/v1alpha3/zz_generated.conversion.go b/internal/api/bootstrap/kubeadm/v1alpha3/zz_generated.conversion.go index 43ccfd4c7ecb..df7d0037e4ac 100644 --- a/internal/api/bootstrap/kubeadm/v1alpha3/zz_generated.conversion.go +++ b/internal/api/bootstrap/kubeadm/v1alpha3/zz_generated.conversion.go @@ -74,16 +74,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DNS_To_v1alpha3_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta2.Discovery)(nil), (*Discovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_Discovery_To_v1alpha3_Discovery(a.(*v1beta2.Discovery), b.(*Discovery), scope) }); err != nil { @@ -344,11 +334,21 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.ControlPlaneComponent)(nil), (*ControlPlaneComponent)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_ControlPlaneComponent_To_v1alpha3_ControlPlaneComponent(a.(*v1beta2.ControlPlaneComponent), b.(*ControlPlaneComponent), scope) }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DNS_To_v1alpha3_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.FileDiscovery)(nil), (*FileDiscovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_FileDiscovery_To_v1alpha3_FileDiscovery(a.(*v1beta2.FileDiscovery), b.(*FileDiscovery), scope) }); err != nil { @@ -561,14 +561,10 @@ func autoConvert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(i out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + // WARNING: in.Proxy requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration is an autogenerated conversion function. -func Convert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(in *v1beta2.ClusterConfiguration, out *ClusterConfiguration, s conversion.Scope) error { - return autoConvert_v1beta2_ClusterConfiguration_To_v1alpha3_ClusterConfiguration(in, out, s) -} - func autoConvert_v1alpha3_ControlPlaneComponent_To_v1beta2_ControlPlaneComponent(in *ControlPlaneComponent, out *v1beta2.ControlPlaneComponent, s conversion.Scope) error { // WARNING: in.ExtraArgs requires manual conversion: inconvertible types (map[string]string vs []sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2.Arg) out.ExtraVolumes = *(*[]v1beta2.HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) @@ -594,14 +590,10 @@ func autoConvert_v1beta2_DNS_To_v1alpha3_DNS(in *v1beta2.DNS, out *DNS, s conver if err := Convert_v1beta2_ImageMeta_To_v1alpha3_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + // WARNING: in.Disabled requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_DNS_To_v1alpha3_DNS is an autogenerated conversion function. -func Convert_v1beta2_DNS_To_v1alpha3_DNS(in *v1beta2.DNS, out *DNS, s conversion.Scope) error { - return autoConvert_v1beta2_DNS_To_v1alpha3_DNS(in, out, s) -} - func autoConvert_v1alpha3_Discovery_To_v1beta2_Discovery(in *Discovery, out *v1beta2.Discovery, s conversion.Scope) error { out.BootstrapToken = (*v1beta2.BootstrapTokenDiscovery)(unsafe.Pointer(in.BootstrapToken)) if in.File != nil { diff --git a/internal/api/bootstrap/kubeadm/v1alpha4/conversion.go b/internal/api/bootstrap/kubeadm/v1alpha4/conversion.go index 05d17b287d0c..3ee7eb89c2a6 100644 --- a/internal/api/bootstrap/kubeadm/v1alpha4/conversion.go +++ b/internal/api/bootstrap/kubeadm/v1alpha4/conversion.go @@ -271,6 +271,16 @@ func Convert_v1alpha4_KubeadmConfigSpec_To_v1beta2_KubeadmConfigSpec(in *Kubeadm return autoConvert_v1alpha4_KubeadmConfigSpec_To_v1beta2_KubeadmConfigSpec(in, out, s) } +func Convert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error { + // NOTE: v1beta2 ClusterConfiguration does not have Proxy. + return autoConvert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(in, out, s) +} + +func Convert_v1beta2_DNS_To_v1alpha4_DNS(in *bootstrapv1.DNS, out *DNS, s apimachineryconversion.Scope) error { + // DNS.Disabled does not exist in kubeadm v1alpha4 API. + return autoConvert_v1beta2_DNS_To_v1alpha4_DNS(in, out, s) +} + // Convert_v1beta2_KubeadmConfigSpec_To_v1alpha4_KubeadmConfigSpec is an autogenerated conversion function. func Convert_v1beta2_KubeadmConfigSpec_To_v1alpha4_KubeadmConfigSpec(in *bootstrapv1.KubeadmConfigSpec, out *KubeadmConfigSpec, s apimachineryconversion.Scope) error { // KubeadmConfigSpec.Ignition does not exist in kubeadm v1alpha4 API. diff --git a/internal/api/bootstrap/kubeadm/v1alpha4/zz_generated.conversion.go b/internal/api/bootstrap/kubeadm/v1alpha4/zz_generated.conversion.go index f665baf3cee3..69c5aeaad8ea 100644 --- a/internal/api/bootstrap/kubeadm/v1alpha4/zz_generated.conversion.go +++ b/internal/api/bootstrap/kubeadm/v1alpha4/zz_generated.conversion.go @@ -74,21 +74,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DNS)(nil), (*v1beta2.DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha4_DNS_To_v1beta2_DNS(a.(*DNS), b.(*v1beta2.DNS), scope) }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DNS_To_v1alpha4_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*v1beta2.Discovery)(nil), (*Discovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_Discovery_To_v1alpha4_Discovery(a.(*v1beta2.Discovery), b.(*Discovery), scope) }); err != nil { @@ -344,11 +334,21 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.ClusterConfiguration)(nil), (*ClusterConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(a.(*v1beta2.ClusterConfiguration), b.(*ClusterConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.ControlPlaneComponent)(nil), (*ControlPlaneComponent)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_ControlPlaneComponent_To_v1alpha4_ControlPlaneComponent(a.(*v1beta2.ControlPlaneComponent), b.(*ControlPlaneComponent), scope) }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.DNS)(nil), (*DNS)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DNS_To_v1alpha4_DNS(a.(*v1beta2.DNS), b.(*DNS), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.FileDiscovery)(nil), (*FileDiscovery)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_FileDiscovery_To_v1alpha4_FileDiscovery(a.(*v1beta2.FileDiscovery), b.(*FileDiscovery), scope) }); err != nil { @@ -560,14 +560,10 @@ func autoConvert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(i out.CertificatesDir = in.CertificatesDir out.ImageRepository = in.ImageRepository out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + // WARNING: in.Proxy requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration is an autogenerated conversion function. -func Convert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(in *v1beta2.ClusterConfiguration, out *ClusterConfiguration, s conversion.Scope) error { - return autoConvert_v1beta2_ClusterConfiguration_To_v1alpha4_ClusterConfiguration(in, out, s) -} - func autoConvert_v1alpha4_ControlPlaneComponent_To_v1beta2_ControlPlaneComponent(in *ControlPlaneComponent, out *v1beta2.ControlPlaneComponent, s conversion.Scope) error { // WARNING: in.ExtraArgs requires manual conversion: inconvertible types (map[string]string vs []sigs.k8s.io/cluster-api/api/bootstrap/kubeadm/v1beta2.Arg) out.ExtraVolumes = *(*[]v1beta2.HostPathMount)(unsafe.Pointer(&in.ExtraVolumes)) @@ -597,14 +593,10 @@ func autoConvert_v1beta2_DNS_To_v1alpha4_DNS(in *v1beta2.DNS, out *DNS, s conver if err := Convert_v1beta2_ImageMeta_To_v1alpha4_ImageMeta(&in.ImageMeta, &out.ImageMeta, s); err != nil { return err } + // WARNING: in.Disabled requires manual conversion: does not exist in peer-type return nil } -// Convert_v1beta2_DNS_To_v1alpha4_DNS is an autogenerated conversion function. -func Convert_v1beta2_DNS_To_v1alpha4_DNS(in *v1beta2.DNS, out *DNS, s conversion.Scope) error { - return autoConvert_v1beta2_DNS_To_v1alpha4_DNS(in, out, s) -} - func autoConvert_v1alpha4_Discovery_To_v1beta2_Discovery(in *Discovery, out *v1beta2.Discovery, s conversion.Scope) error { out.BootstrapToken = (*v1beta2.BootstrapTokenDiscovery)(unsafe.Pointer(in.BootstrapToken)) if in.File != nil {