Skip to content

Commit 16d7356

Browse files
authored
✨ Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig (#12335)
* Add CertificateValidityPeriod type to KubeadmConfig * Add CACertificateValidityPeriod to Kubeadmconfig * Use CACertificateValidityPeriod while generating certificates * Address reveiw comments
1 parent a6d5e66 commit 16d7356

26 files changed

+467
-92
lines changed

api/bootstrap/kubeadm/v1beta1/conversion.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ func RestoreKubeadmConfigSpec(restored *bootstrapv1.KubeadmConfigSpec, dst *boot
8080
}
8181
dst.JoinConfiguration.Timeouts = restored.JoinConfiguration.Timeouts
8282
}
83+
if restored.ClusterConfiguration != nil &&
84+
(restored.ClusterConfiguration.CertificateValidityPeriodDays != 0 || restored.ClusterConfiguration.CACertificateValidityPeriodDays != 0) {
85+
if dst.ClusterConfiguration == nil {
86+
dst.ClusterConfiguration = &bootstrapv1.ClusterConfiguration{}
87+
}
88+
if restored.ClusterConfiguration.CertificateValidityPeriodDays != 0 {
89+
dst.ClusterConfiguration.CertificateValidityPeriodDays = restored.ClusterConfiguration.CertificateValidityPeriodDays
90+
}
91+
if restored.ClusterConfiguration.CACertificateValidityPeriodDays != 0 {
92+
dst.ClusterConfiguration.CACertificateValidityPeriodDays = restored.ClusterConfiguration.CACertificateValidityPeriodDays
93+
}
94+
}
8395
}
8496

8597
func RestoreBoolIntentKubeadmConfigSpec(src *KubeadmConfigSpec, dst *bootstrapv1.KubeadmConfigSpec, hasRestored bool, restored *bootstrapv1.KubeadmConfigSpec) error {
@@ -570,6 +582,10 @@ func Convert_v1beta1_Condition_To_v1_Condition(in *clusterv1beta1.Condition, out
570582
return clusterv1beta1.Convert_v1beta1_Condition_To_v1_Condition(in, out, s)
571583
}
572584

585+
func Convert_v1beta2_ClusterConfiguration_To_v1beta1_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
586+
return autoConvert_v1beta2_ClusterConfiguration_To_v1beta1_ClusterConfiguration(in, out, s)
587+
}
588+
573589
func dropEmptyStringsKubeadmConfigSpec(dst *KubeadmConfigSpec) {
574590
for i, u := range dst.Users {
575591
dropEmptyString(&u.Gecos)

api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go

Lines changed: 7 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/bootstrap/kubeadm/v1beta2/kubeadm_types.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,22 @@ type ClusterConfiguration struct {
186186
// featureGates enabled by the user.
187187
// +optional
188188
FeatureGates map[string]bool `json:"featureGates,omitempty"`
189+
190+
// certificateValidityPeriodDays specifies the validity period for non-CA certificates generated by kubeadm.
191+
// If not specified, kubeadm will use a default of 365 days (1 year).
192+
// This field is only supported with Kubernetes v1.31 or above.
193+
// +optional
194+
// +kubebuilder:validation:Minimum=1
195+
// +kubebuilder:validation:Maximum=1095
196+
CertificateValidityPeriodDays int32 `json:"certificateValidityPeriodDays,omitempty"`
197+
198+
// caCertificateValidityPeriodDays specifies the validity period for CA certificates generated by Cluster API.
199+
// If not specified, Cluster API will use a default of 3650 days (10 years).
200+
// This field cannot be modified.
201+
// +optional
202+
// +kubebuilder:validation:Minimum=1
203+
// +kubebuilder:validation:Maximum=36500
204+
CACertificateValidityPeriodDays int32 `json:"caCertificateValidityPeriodDays,omitempty"`
189205
}
190206

191207
// APIServer holds settings necessary for API server deployments in the cluster.

bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigs.yaml

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bootstrap/kubeadm/config/crd/bases/bootstrap.cluster.x-k8s.io_kubeadmconfigtemplates.yaml

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bootstrap/kubeadm/types/upstreamv1beta3/conversion.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,7 @@ func (src *ClusterConfiguration) GetAdditionalData(data *upstream.AdditionalData
307307
data.ControlPlaneComponentHealthCheckSeconds = clusterv1.ConvertToSeconds(src.APIServer.TimeoutForControlPlane)
308308
}
309309
}
310+
311+
func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
312+
return autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in, out, s)
313+
}

bootstrap/kubeadm/types/upstreamv1beta3/conversion_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
8686
hubNodeRegistrationOptionsFuzzer,
8787
hubHostPathMountFuzzer,
8888
hubBootstrapTokenDiscoveryFuzzer,
89+
hubClusterConfigurationFuzzer,
8990
}
9091
}
9192

@@ -231,3 +232,10 @@ func hubBootstrapTokenDiscoveryFuzzer(obj *bootstrapv1.BootstrapTokenDiscovery,
231232
obj.UnsafeSkipCAVerification = ptr.To(false)
232233
}
233234
}
235+
236+
func hubClusterConfigurationFuzzer(obj *bootstrapv1.ClusterConfiguration, c randfill.Continue) {
237+
c.FillNoCustom(obj)
238+
239+
obj.CertificateValidityPeriodDays = 0
240+
obj.CACertificateValidityPeriodDays = 0
241+
}

bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go

Lines changed: 7 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bootstrap/kubeadm/types/upstreamv1beta4/conversion.go

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ limitations under the License.
1717
package upstreamv1beta4
1818

1919
import (
20+
"math"
2021
"reflect"
22+
"time"
2123
"unsafe"
2224

2325
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -67,9 +69,22 @@ func Convert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguratio
6769
// Following fields do not exist in CABPK v1beta1 version:
6870
// - Proxy (Not supported yet)
6971
// - EncryptionAlgorithm (Not supported yet)
70-
// - CertificateValidityPeriod (Not supported yet)
71-
// - CACertificateValidityPeriod (Not supported yet)
72-
return autoConvert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in, out, s)
72+
if err := autoConvert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in, out, s); err != nil {
73+
return err
74+
}
75+
out.CertificateValidityPeriodDays = convertToDays(in.CertificateValidityPeriod)
76+
out.CACertificateValidityPeriodDays = convertToDays(in.CACertificateValidityPeriod)
77+
return nil
78+
}
79+
80+
// Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration is an autogenerated conversion function.
81+
func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
82+
if err := autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in, out, s); err != nil {
83+
return err
84+
}
85+
out.CertificateValidityPeriod = convertFromDays(in.CertificateValidityPeriodDays)
86+
out.CACertificateValidityPeriod = convertFromDays(in.CACertificateValidityPeriodDays)
87+
return nil
7388
}
7489

7590
func Convert_upstreamv1beta4_DNS_To_v1beta2_DNS(in *DNS, out *bootstrapv1.DNS, s apimachineryconversion.Scope) error {
@@ -311,3 +326,26 @@ func (src *ClusterConfiguration) GetAdditionalData(data *upstream.AdditionalData
311326
// NOTE: for kubeadm v1beta4 types we are not reading ControlPlaneComponentHealthCheckSeconds into additional data
312327
// because Cluster API types are aligned with kubeadm's v1beta4 API version.
313328
}
329+
330+
// convertToDays takes *metav1.Duration and returns a *int32.
331+
// Durations longer than MaxInt32 are capped.
332+
// NOTE: this is a util function intended only for usage in API conversions.
333+
func convertToDays(in *metav1.Duration) int32 {
334+
if in == nil {
335+
return 0
336+
}
337+
days := math.Trunc(in.Hours() / 24)
338+
if days > math.MaxInt32 {
339+
return math.MaxInt32
340+
}
341+
return int32(days)
342+
}
343+
344+
// convertFromDays takes *int32 and returns a *metav1.Duration.
345+
// NOTE: this is a util function intended only for usage in API conversions.
346+
func convertFromDays(in int32) *metav1.Duration {
347+
if in == 0 {
348+
return nil
349+
}
350+
return ptr.To(metav1.Duration{Duration: time.Duration(in) * time.Hour * 24})
351+
}

bootstrap/kubeadm/types/upstreamv1beta4/conversion_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
8282
hubHostPathMountFuzzer,
8383
hubBootstrapTokenDiscoveryFuzzer,
8484
hubNodeRegistrationOptionsFuzzer,
85+
hubClusterConfigurationFuzzer,
8586
}
8687
}
8788

@@ -100,8 +101,8 @@ func spokeClusterConfigurationFuzzer(obj *ClusterConfiguration, c randfill.Conti
100101

101102
obj.Proxy = Proxy{}
102103
obj.EncryptionAlgorithm = ""
103-
obj.CACertificateValidityPeriod = nil
104-
obj.CertificateValidityPeriod = nil
104+
obj.CertificateValidityPeriod = ptr.To[metav1.Duration](metav1.Duration{Duration: time.Duration(c.Int31n(3*365)+1) * time.Hour * 24})
105+
obj.CACertificateValidityPeriod = ptr.To[metav1.Duration](metav1.Duration{Duration: time.Duration(c.Int31n(100*365)+1) * time.Hour * 24})
105106

106107
// Drop the following fields as they have been removed in v1beta2, so we don't have to preserve them.
107108
obj.Networking.ServiceSubnet = ""
@@ -213,3 +214,10 @@ func hubNodeRegistrationOptionsFuzzer(obj *bootstrapv1.NodeRegistrationOptions,
213214
obj.Taints = nil
214215
}
215216
}
217+
218+
func hubClusterConfigurationFuzzer(obj *bootstrapv1.ClusterConfiguration, c randfill.Continue) {
219+
c.FillNoCustom(obj)
220+
221+
obj.CertificateValidityPeriodDays = c.Int31n(3*365 + 1)
222+
obj.CACertificateValidityPeriodDays = c.Int31n(100*365 + 1)
223+
}

0 commit comments

Comments
 (0)