Skip to content

Commit

Permalink
Add ExtraEnvs and ImagePullSerial to KubeadmConfig
Browse files Browse the repository at this point in the history
  • Loading branch information
fabriziopandini committed Jul 8, 2024
1 parent d79694c commit ef3a6e9
Show file tree
Hide file tree
Showing 22 changed files with 472 additions and 534 deletions.
29 changes: 28 additions & 1 deletion bootstrap/kubeadm/api/v1beta1/kubeadm_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ type ControlPlaneComponent struct {
// ExtraVolumes is an extra set of host volumes, mounted to the control plane component.
// +optional
ExtraVolumes []HostPathMount `json:"extraVolumes,omitempty"`

// ExtraEnvs is an extra set of environment variables to pass to the control plane component.
// Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default.
// This option takes effect only on Kubernetes >=1.31.0.
// +optional
ExtraEnvs []EnvVar `json:"extraEnvs,omitempty"`
}

// APIServer holds settings necessary for API server deployments in the cluster.
Expand Down Expand Up @@ -192,7 +198,7 @@ type ImageMeta struct {
// +optional
ImageTag string `json:"imageTag,omitempty"`

//TODO: evaluate if we need also a ImageName based on user feedbacks
// TODO: evaluate if we need also a ImageName based on user feedbacks
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand Down Expand Up @@ -260,6 +266,12 @@ type NodeRegistrationOptions struct {
// +kubebuilder:validation:Enum=Always;IfNotPresent;Never
// +optional
ImagePullPolicy string `json:"imagePullPolicy,omitempty"`

// ImagePullSerial specifies if image pulling performed by kubeadm must be done serially or in parallel.
// This option takes effect only on Kubernetes >=1.31.0.
// Default: true (defaulted in kubeadm)
// +optional
ImagePullSerial *bool `json:"imagePullSerial,omitempty"`
}

// MarshalJSON marshals NodeRegistrationOptions in a way that an empty slice in Taints is preserved.
Expand All @@ -281,13 +293,15 @@ func (n *NodeRegistrationOptions) MarshalJSON() ([]byte, error) {
KubeletExtraArgs map[string]string `json:"kubeletExtraArgs,omitempty"`
IgnorePreflightErrors []string `json:"ignorePreflightErrors,omitempty"`
ImagePullPolicy string `json:"imagePullPolicy,omitempty"`
ImagePullSerial *bool `json:"imagePullSerial,omitempty"`
}{
Name: n.Name,
CRISocket: n.CRISocket,
Taints: n.Taints,
KubeletExtraArgs: n.KubeletExtraArgs,
IgnorePreflightErrors: n.IgnorePreflightErrors,
ImagePullPolicy: n.ImagePullPolicy,
ImagePullSerial: n.ImagePullSerial,
})
}

Expand All @@ -299,13 +313,15 @@ func (n *NodeRegistrationOptions) MarshalJSON() ([]byte, error) {
KubeletExtraArgs map[string]string `json:"kubeletExtraArgs,omitempty"`
IgnorePreflightErrors []string `json:"ignorePreflightErrors,omitempty"`
ImagePullPolicy string `json:"imagePullPolicy,omitempty"`
ImagePullSerial *bool `json:"imagePullSerial,omitempty"`
}{
Name: n.Name,
CRISocket: n.CRISocket,
Taints: n.Taints,
KubeletExtraArgs: n.KubeletExtraArgs,
IgnorePreflightErrors: n.IgnorePreflightErrors,
ImagePullPolicy: n.ImagePullPolicy,
ImagePullSerial: n.ImagePullSerial,
})
}

Expand Down Expand Up @@ -382,6 +398,12 @@ type LocalEtcd struct {
// +optional
ExtraArgs map[string]string `json:"extraArgs,omitempty"`

// ExtraEnvs is an extra set of environment variables to pass to the control plane component.
// Environment variables passed using ExtraEnvs will override any existing environment variables, or *_proxy environment variables that kubeadm adds by default.
// This option takes effect only on Kubernetes >=1.31.0.
// +optional
ExtraEnvs []EnvVar `json:"extraEnvs,omitempty"`

// ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert.
// +optional
ServerCertSANs []string `json:"serverCertSANs,omitempty"`
Expand Down Expand Up @@ -735,3 +757,8 @@ type Patches struct {
// +optional
Directory string `json:"directory,omitempty"`
}

// EnvVar represents an environment variable present in a Container.
type EnvVar struct {
corev1.EnvVar `json:",inline"`
}
35 changes: 35 additions & 0 deletions bootstrap/kubeadm/api/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 13 additions & 3 deletions bootstrap/kubeadm/types/upstreamv1beta1/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,28 @@ func Convert_upstreamv1beta1_DNS_To_v1beta1_DNS(in *DNS, out *bootstrapv1.DNS, s

// Custom conversion from the hub version, CABPK v1beta1, to this API, kubeadm v1beta1.

func Convert_v1beta1_ControlPlaneComponent_To_upstreamv1beta1_ControlPlaneComponent(in *bootstrapv1.ControlPlaneComponent, out *ControlPlaneComponent, s apimachineryconversion.Scope) error {
// ControlPlaneComponent.ExtraEnvs does not exist in kubeadm v1beta1, dropping this info.
return autoConvert_v1beta1_ControlPlaneComponent_To_upstreamv1beta1_ControlPlaneComponent(in, out, s)
}

func Convert_v1beta1_LocalEtcd_To_upstreamv1beta1_LocalEtcd(in *bootstrapv1.LocalEtcd, out *LocalEtcd, s apimachineryconversion.Scope) error {
// LocalEtcd.ExtraEnvs does not exist in kubeadm v1beta1, dropping this info.
return autoConvert_v1beta1_LocalEtcd_To_upstreamv1beta1_LocalEtcd(in, out, s)
}

func Convert_v1beta1_InitConfiguration_To_upstreamv1beta1_InitConfiguration(in *bootstrapv1.InitConfiguration, out *InitConfiguration, s apimachineryconversion.Scope) error {
// InitConfiguration.SkipPhases and Patches does not exist in kubeadm v1beta1, dropping those info.
// InitConfiguration.SkipPhases and Patches do not exist in kubeadm v1beta1, dropping those info.
return autoConvert_v1beta1_InitConfiguration_To_upstreamv1beta1_InitConfiguration(in, out, s)
}

func Convert_v1beta1_JoinConfiguration_To_upstreamv1beta1_JoinConfiguration(in *bootstrapv1.JoinConfiguration, out *JoinConfiguration, s apimachineryconversion.Scope) error {
// JoinConfiguration.SkipPhases and Patches does not exist in kubeadm v1beta1, dropping those info.
// JoinConfiguration.SkipPhases and Patches do not exist in kubeadm v1beta1, dropping those info.
return autoConvert_v1beta1_JoinConfiguration_To_upstreamv1beta1_JoinConfiguration(in, out, s)
}

func Convert_v1beta1_NodeRegistrationOptions_To_upstreamv1beta1_NodeRegistrationOptions(in *bootstrapv1.NodeRegistrationOptions, out *NodeRegistrationOptions, s apimachineryconversion.Scope) error {
// NodeRegistrationOptions.IgnorePreflightErrors and ImagePullPolicy does not exist in kubeadm v1beta1, dropping those info.
// NodeRegistrationOptions.IgnorePreflightErrors, ImagePullPolicy and ImagePullSerial do not exist in kubeadm v1beta1, dropping those info.
return autoConvert_v1beta1_NodeRegistrationOptions_To_upstreamv1beta1_NodeRegistrationOptions(in, out, s)
}

Expand Down
21 changes: 15 additions & 6 deletions bootstrap/kubeadm/types/upstreamv1beta1/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
return []interface{}{
clusterConfigurationFuzzer,
dnsFuzzer,
bootstrapv1ControlPlaneComponentFuzzer,
bootstrapv1LocalEtcdFuzzer,
bootstrapv1InitConfigurationFuzzer,
bootstrapv1JoinConfigurationFuzzer,
bootstrapv1NodeRegistrationOptionsFuzzer,
Expand All @@ -88,6 +90,18 @@ func dnsFuzzer(obj *DNS, c fuzz.Continue) {
// NOTES:
// - When fields do not exist in kubeadm v1beta1 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta1 --> cabpk v1beta1 round trip errors.

func bootstrapv1ControlPlaneComponentFuzzer(obj *bootstrapv1.ControlPlaneComponent, c fuzz.Continue) {
c.FuzzNoCustom(obj)

obj.ExtraEnvs = nil
}

func bootstrapv1LocalEtcdFuzzer(obj *bootstrapv1.LocalEtcd, c fuzz.Continue) {
c.FuzzNoCustom(obj)

obj.ExtraEnvs = nil
}

func bootstrapv1InitConfigurationFuzzer(obj *bootstrapv1.InitConfiguration, c fuzz.Continue) {
c.FuzzNoCustom(obj)

Expand All @@ -98,10 +112,7 @@ func bootstrapv1InitConfigurationFuzzer(obj *bootstrapv1.InitConfiguration, c fu
func bootstrapv1JoinConfigurationFuzzer(obj *bootstrapv1.JoinConfiguration, c fuzz.Continue) {
c.FuzzNoCustom(obj)

// JoinConfiguration.Patches does not exist in kubeadm v1beta1 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta1 --> cabpk v1beta1 round trip errors.
obj.Patches = nil

// JoinConfiguration.SkipPhases does not exist in kubeadm v1beta1 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta1 --> cabpk v1beta1 round trip errors.
obj.SkipPhases = nil

if obj.Discovery.File != nil {
Expand All @@ -112,9 +123,7 @@ func bootstrapv1JoinConfigurationFuzzer(obj *bootstrapv1.JoinConfiguration, c fu
func bootstrapv1NodeRegistrationOptionsFuzzer(obj *bootstrapv1.NodeRegistrationOptions, c fuzz.Continue) {
c.FuzzNoCustom(obj)

// NodeRegistrationOptions.IgnorePreflightErrors does not exist in kubeadm v1beta1 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta1 --> cabpk v1beta1 round trip errors.
obj.IgnorePreflightErrors = nil

// NodeRegistrationOptions.ImagePullPolicy does not exist in kubeadm v1beta1 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta1 --> cabpk v1beta1 round trip errors.
obj.ImagePullPolicy = ""
obj.ImagePullSerial = nil
}
33 changes: 21 additions & 12 deletions bootstrap/kubeadm/types/upstreamv1beta1/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 13 additions & 3 deletions bootstrap/kubeadm/types/upstreamv1beta2/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,30 @@ func Convert_upstreamv1beta2_JoinControlPlane_To_v1beta1_JoinControlPlane(in *Jo
// Custom conversion from the hub version, CABPK v1beta1, to this API, kubeadm v1beta2.

func Convert_v1beta1_InitConfiguration_To_upstreamv1beta2_InitConfiguration(in *bootstrapv1.InitConfiguration, out *InitConfiguration, s apimachineryconversion.Scope) error {
// InitConfiguration.SkipPhases and Patches does not exist in kubeadm v1beta2, dropping those info.
// InitConfiguration.SkipPhases and Patches do not exist in kubeadm v1beta2, dropping those info.
return autoConvert_v1beta1_InitConfiguration_To_upstreamv1beta2_InitConfiguration(in, out, s)
}

func Convert_v1beta1_JoinConfiguration_To_upstreamv1beta2_JoinConfiguration(in *bootstrapv1.JoinConfiguration, out *JoinConfiguration, s apimachineryconversion.Scope) error {
// JoinConfiguration.SkipPhases and Patches does not exist in kubeadm v1beta2, dropping those info.
// JoinConfiguration.SkipPhases and Patches do not exist in kubeadm v1beta2, dropping those info.
return autoConvert_v1beta1_JoinConfiguration_To_upstreamv1beta2_JoinConfiguration(in, out, s)
}

func Convert_v1beta1_NodeRegistrationOptions_To_upstreamv1beta2_NodeRegistrationOptions(in *bootstrapv1.NodeRegistrationOptions, out *NodeRegistrationOptions, s apimachineryconversion.Scope) error {
// NodeRegistrationOptions.IgnorePreflightErrors and ImagePullPolicy does not exist in kubeadm v1beta2, dropping those info.
// NodeRegistrationOptions.ImagePullPolicy and ImagePullSerial do not exist in kubeadm v1beta2, dropping those info.
return autoConvert_v1beta1_NodeRegistrationOptions_To_upstreamv1beta2_NodeRegistrationOptions(in, out, s)
}

func Convert_v1beta1_ControlPlaneComponent_To_upstreamv1beta2_ControlPlaneComponent(in *bootstrapv1.ControlPlaneComponent, out *ControlPlaneComponent, s apimachineryconversion.Scope) error {
// ControlPlaneComponent.ExtraEnvs does not exist in kubeadm v1beta2, dropping this info.
return autoConvert_v1beta1_ControlPlaneComponent_To_upstreamv1beta2_ControlPlaneComponent(in, out, s)
}

func Convert_v1beta1_LocalEtcd_To_upstreamv1beta2_LocalEtcd(in *bootstrapv1.LocalEtcd, out *LocalEtcd, s apimachineryconversion.Scope) error {
// LocalEtcd.ExtraEnvs does not exist in kubeadm v1beta2, dropping this info.
return autoConvert_v1beta1_LocalEtcd_To_upstreamv1beta2_LocalEtcd(in, out, s)
}

func Convert_v1beta1_FileDiscovery_To_upstreamv1beta2_FileDiscovery(in *bootstrapv1.FileDiscovery, out *FileDiscovery, s apimachineryconversion.Scope) error {
// JoinConfiguration.Discovery.File.KubeConfig does not exist in kubeadm because it's internal to Cluster API, dropping those info.
return autoConvert_v1beta1_FileDiscovery_To_upstreamv1beta2_FileDiscovery(in, out, s)
Expand Down
15 changes: 15 additions & 0 deletions bootstrap/kubeadm/types/upstreamv1beta2/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
dnsFuzzer,
initConfigurationFuzzer,
joinControlPlanesFuzzer,
bootstrapv1ControlPlaneComponentFuzzer,
bootstrapv1LocalEtcdFuzzer,
bootstrapv1InitConfigurationFuzzer,
bootstrapv1JoinConfigurationFuzzer,
bootstrapv1NodeRegistrationOptionsFuzzer,
Expand Down Expand Up @@ -102,6 +104,18 @@ func joinControlPlanesFuzzer(obj *JoinControlPlane, c fuzz.Continue) {
// NOTES:
// - When fields do not exist in kubeadm v1beta2 types, pinning it to avoid cabpk v1beta1 --> kubeadm v1beta2 --> cabpk v1beta1 round trip errors.

func bootstrapv1ControlPlaneComponentFuzzer(obj *bootstrapv1.ControlPlaneComponent, c fuzz.Continue) {
c.FuzzNoCustom(obj)

obj.ExtraEnvs = nil
}

func bootstrapv1LocalEtcdFuzzer(obj *bootstrapv1.LocalEtcd, c fuzz.Continue) {
c.FuzzNoCustom(obj)

obj.ExtraEnvs = nil
}

func bootstrapv1InitConfigurationFuzzer(obj *bootstrapv1.InitConfiguration, c fuzz.Continue) {
c.FuzzNoCustom(obj)

Expand All @@ -124,4 +138,5 @@ func bootstrapv1NodeRegistrationOptionsFuzzer(obj *bootstrapv1.NodeRegistrationO
c.FuzzNoCustom(obj)

obj.ImagePullPolicy = ""
obj.ImagePullSerial = nil
}
Loading

0 comments on commit ef3a6e9

Please sign in to comment.