Releases: kubernetes-sigs/cluster-api
v1.11.2
👌 Kubernetes version support
- Management Cluster: v1.30.x -> v1.34.x
- Workload Cluster: v1.28.x -> v1.34.x
More information about version support can be found here
Changes since v1.11.1
📈 Overview
- 6 new commits merged
- 1 feature addition ✨
- 1 bug fixed 🐛
✨ New Features
- KCP: Bump coredns/corefile-migration to v1.0.28 (#12750)
🐛 Bug Fixes
- clusterctl: Verify providers need upgrade before applying (#12768)
🌱 Others
- Autoscaling: Bump autoscaler in e2e tests to v1.33.1 (#12792)
- clusterctl: Add Metal3 as an IPAMProvider (#12760)
- Dependency: Bump go to v1.24.7 (#12735)
📖 Additionally, there has been 1 contribution to our documentation and book. (#12780)
Dependencies
Added
Nothing has changed.
Changed
- github.com/coredns/corefile-migration: v1.0.27 → v1.0.28
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.10.7
👌 Kubernetes version support
- Management Cluster: v1.28.x -> v1.33.x
- Workload Cluster: v1.26.x -> v1.33.x
More information about version support can be found here
Changes since v1.10.6
📈 Overview
- 2 new commits merged
- 1 feature addition ✨
✨ New Features
- KCP: Bump coredns/corefile-migration to v1.0.28 (#12749)
🌱 Others
- e2e: Fix flaky test in extensionconfig_controller_test.go (#12783)
Dependencies
Added
Nothing has changed.
Changed
- github.com/coredns/corefile-migration: v1.0.27 → v1.0.28
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.11.1
👌 Kubernetes version support
- Management Cluster: v1.30.x -> v1.34.x
- Workload Cluster: v1.28.x -> v1.34.x
More information about version support can be found here
Changes since v1.11.0
📈 Overview
- 22 new commits merged
- 3 feature additions ✨
- 8 bugs fixed 🐛
✨ New Features
- CI: Bump autoscaler to a9cb59fdd (#12707)
- CI: Bump Kubernetes in tests to v1.34.0 and claim support for v1.34 (#12705)
- e2e: Bump Kubernetes version used for testing to v1.34.0-rc.2 (#12659)
🐛 Bug Fixes
- API: Only try to convert infraRefs if they are set (#12693)
- API: Register conversion funcs in schemes (#12697)
- CABPK: Always use latest apiVersion when getting owner of KubeadmConfig in CABPK (#12689)
- ClusterClass: Ensure holder field path in GeneratePatchRequest is set based on contract (#12691)
- ClusterClass: Fix field paths in ClusterClass compatibility validation errors (#12670)
- ClusterClass: Stop adding conversion-data annotation to Cluster object (#12721)
- e2e/CAPD: Remove finalizers during deletion if ownerRef was never set (#12678)
- Testing: Fix KubeadmConfig fuzz test flake (#12682)
🌱 Others
- clusterctl: Allow metadata.yaml's Kind to be empty (#12715)
- Dependency: Bump github.com/go-viper/mapstructure/v2 to fix CVE (#12680)
- Dependency: Bump to envtest v1.34.0 (#12706)
- e2e: Bump to kind v0.30.0 (#12708)
- e2e: Get kind mgmt cluster logs in clusterctl upgrade test (#12688)
- Misc: Log version and git commit on controller start (#12696)
- Release/clusterctl: Add CAPRKE2 to release tool’s issue-opening providers list (#12717)
📖 Additionally, there have been 4 contributions to our documentation and book. (#12667, #12668, #12671, #12674)
Dependencies
Added
Nothing has changed.
Changed
- github.com/go-viper/mapstructure/v2: v2.3.0 → v2.4.0
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.10.6
👌 Kubernetes version support
- Management Cluster: v1.28.x -> v1.33.x
- Workload Cluster: v1.26.x -> v1.33.x
More information about version support can be found here
Changes since v1.10.5
📈 Overview
- 1 new commit merged
🌱 Others
- Dependency: Bump github.com/go-viper/mapstructure/v2 to fix CVE (#12681)
Dependencies
Added
Nothing has changed.
Changed
- github.com/go-viper/mapstructure/v2: v2.3.0 → v2.4.0
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.11.0
👌 Kubernetes version support
- Management Cluster: v1.30.x -> v1.33.x
- Workload Cluster: v1.28.x -> v1.33.x
More information about version support can be found here
Highlights
- Bumped to Go 1.24, controller-runtime v0.21, k8s.io/* v0.33, controller-gen v0.18 (also moved to
sigs.k8s.io/randfill
) (#12191) - v1beta2 API version has been introduced and considering the awesome amount of improvements it marks an important
step in the journey towards graduating our API to v1.- Accordingly there is now a new v1beta2 version of our contract for providers.
- Improve status:
- The transition to the new K8s aligned conditions using
metav1.Conditions
types and the new condition semantic
has been completed. - Replica counters are now consistent with new conditions and across all resources; new replica counters have been added at cluster level.
- Semantic of contract fields in status have been improved and are now consistent across all resources.
- The confusing
FailureReason
andFailureMessage
fields have been dropped.
- The transition to the new K8s aligned conditions using
- Support CC across namespaces: API changes planned for this feature have been implemented.
- Improve object references:
- Unnecessary fields have been dropped from object reference.
- Object references are now GitOps friendly (API version is not overwritten anymore by controllers).
- KubeadmConfig and KubeadmControlPlane APIs have been aligned with kubeadm v1beta4 API.
- Additionally, fields inferred from top level objects have been removed, thus getting rid of a common source of confusion/issues.
- Compliance with K8s API guidelines:
- Thanks to the adoption of the KAL linter compliance with K8s API guidelines has been greatly improved.
- All Duration fields are now represented as
*int32
fields with units being part of the field name. - All
bool
fields have been changed to*bool
to preserve user intent. - Extensive work has been done to ensure
required
andoptional
is explicitly set in the API, and that
both serialization and validation works accordingly:- Stop rendering empty structs (review of all occurrences of
omitempty
and introduction ofomitzero
) - Do not allow
""
when it is not semantically different from value not set (either you have to provide a non-empty string value or not set the field at all). - Do not allow
0
when it is not semantically different from value not set (either you have to provide a non-0 int value or not set the field at all). - Do not allow
{}
when it is not semantically different from value not set (either you have to set at least one property in the object or not set the field at all). - Do not allow
[]
when it is not semantically different from value not set (either you have to set at least one item in the list or not set the field at all). - Ensure validation for all enum types.
- Stop rendering empty structs (review of all occurrences of
- Missing list markers have been added for SSA.
- Drop unnecessary pointers:
- After fixing
required
andoptional
according to K8s API guidelines, extensive work has been done to
drop unnecessary pointers thus improving the usability of the API's Go structs.
- After fixing
- Avoid embedding structs: Coupling between API types has been reduced by reducing the usage of embedded structs.
- Extensive work has been done to improve consistency across all resources, e.g.:
- Fields for Machine deletion are under a new
deletion
struct in all resources. - Settings about
rollout
have been logically grouped in all resources. - Settings about health checks and
remediation
have been logically grouped in all resources.
- Fields for Machine deletion are under a new
- Missing validations have been added where required.
- Tech debt has been reduced by dropping deprecated fields.
- ClusterClass: Fix continuous reconciles because of apiVersion differences in Cluster topology controller (#12341)
- KCP/CABPK: Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig (#12335)
- KCP: Fix timeout handling in GetAPIServerCertificateExpiry and DialContext (#12554)
- Machine: fallback to InfraMachine providerID during deletion if Machine providerID is not set (#11985)
- Runtime SDK:
- Improved e2e test coverage, e.g.:
- New providers in clusterctl: Scaleway (#12357), cdk8s (#12332)
See Cluster API v1.10 compared to v1.11 for more details
Notes for workload cluster upgrade to Kubernetes v1.34 with KCP
- Context: Kubernetes/kubeadm <=> etcd compatibility:
- kubeadm v1.33 only supports etcd v3.5 for Kubernetes v1.33
- kubeadm v1.34 only supports etcd v3.6 for Kubernetes v1.34
- The upgrade to etcd v3.6 requires etcd >= v3.5.20 (https://etcd.io/blog/2025/upgrade_from_3.5_to_3.6_issue/)
- Accordingly, when upgrading from Kubernetes v1.33 to v1.34:
- ensure etcd >= v3.5.20 is used with Kubernetes v1.33 before the upgrade
- upgrade to Kubernetes v1.34 and etcd v3.6 at the same time
Deprecation and Removals Warning
- Cluster: Remove deprecated index ByClusterClassName, ClusterByClusterClassClassName and ClusterClassNameField (#12269)
- ClusterClass: Remove deprecated ClusterVariable.definitionFrom field (#12202)
- ClusterClass: Remove deprecated Cluster.spec.topology.rolloutAfter field (#12268)
- ClusterClass: Remove deprecated ClusterCacheTracker and corresponding types (#12270)
- clusterctl: Remove deprecated
clusterctl alpha topology plan
command (#12283) - ClusterResourceSet: Remove deprecated ClusterResourceSetBinding.DeleteBinding method (#12267)
- MachineDeployment: Removed deprecated revisionHistory (#12274)
- MachineDeployment: Remove deprecated spec.progressDeadlineSeconds (#12232)
- KCP/CABPK: Remove deprecated KubeadmConfig useExperimentalRetryJoin (#12234)
- API: Deprecate v1alpha1 & v1beta1 API packages (#12254)
Changes since v1.10.0
📈 Overview
- 360 new commits merged
- 88 breaking changes
⚠️ - 29 feature additions ✨
- 50 bugs fixed 🐛
📝 Proposals
- Core: Update autoscaling from zero enhancement proposal with support for platform-aware autoscale from zero (#11962)
⚠️ Breaking Changes
- API: Add additional MinProperties & MinItems validation across multiple APIs (#12538)
- API: Add CAPD v1beta2 types (#12226)
- API: Add Minimum=0 marker to all MinReadySeconds fields (#12474)
- API: Add omitempty to required string without zero value (#12548)
- API: Add omitzero on struct without zero value (#12550)
- API: Add v1beta2 types (#12037)
- API: Align Spec fields to optionalfields API conventions (#12431)
- API: Align Status fields to optionalfields API conventions (#12435)
- API: Change .status.replicas fields to pointer + omitempty (#12250)
- API: Change all *metav1.Time fields to metav1.Time (#12518)
- API: Change bool to *bool for all API types (#12436)
- API: Change type of *string fields with invalid zero value to string (#12429)
- API: Change type of int32 fields with valid zero value to *int32 (#12424)
- API/Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in v1beta2 packages (#12091)
- API: Drop unnecessary fields from contract-versioned object references (#12356)
- API: Fix required fields linter findings (#12558)
- API: Improve Cluster CRD Go type (#12489)
- API: Migrate API to use *Seconds instead of metav1.Duration fields (#12327)
- API: Move APIs to ./api (#12262)
- API/Partially revert: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (#12290)
- API: Promote v1beta2 conditions (#12066)
- API: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (#12231)
- API: Remove IPFamily from public APIs (move to CAPD/kind util) (#12215)
- API: Remove pointers from ClusterClass and Cluster healthCheck fields (#12525)
- API: Remove pointers from remaining pointer struct fields (#12545)
- API: Rename namingStrategy => naming, machineNamingStrategy => machineNaming (#12524)
- API: Restructure strategy fields (#12506)
- CABPK: Align KubeadmConfig to kubeadm v1beta4 types (#12282)
- CAPD: Align CAPD conversion to conversion of other providers (#12481)
- CAPD/Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in CAPD v1beta2 packages (#12393)
- CAPD: Implement v1beta2 contract in CAPD (#12409)
- CAPD: Keep using v1beta1 condition in CAPD Docker backend (#12450)
- CAPD: Promote v1beta2 condition in CAPD (#12362)
- CAPD: Stop using v1beta1 status in CAPD controllers (#12438)
- CAPD: Update example manifests (#12480)
- Cluster: Remove deprecated index ByClusterClassName, ClusterByClusterClassClassName and ClusterClassNameField (#12269)
- ClusterClass: Drop unnecessary fields from ClusterClass template references (#12358)
- ClusterClass: Move infrastructure namingStrategy field in ClusterClass (#12216)
- ClusterClass: Remove ClusterVariable.DefinitionFrom field (#12202)
- ClusterClass: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (again) (#12404)
- ClusterClass: Remove deprecated Cluster.spec.topology.rolloutAfter field (#12268)
- ClusterClass: Remove deprecated ClusterCacheTracker and corresponding types (#12270)
- ClusterClass: Rename deprecated ClusterClass Metadata fields to DeprecatedV1Beta1Metadata (#12273)
- ClusterClass: Rename runtime extension fields in ClusterClass ExternalPatchDefinition (#12281)
- ClusterClass: Restructure class...
v1.10.5
👌 Kubernetes version support
- Management Cluster: v1.28.x -> v1.33.x
- Workload Cluster: v1.26.x -> v1.33.x
More information about version support can be found here
Changes since v1.10.4
📈 Overview
- 6 new commits merged
- 2 feature additions ✨
- 1 bug fixed 🐛
✨ New Features
- KCP: Bump corefile-migration to v1.0.27 (#12637)
- Runtime SDK: Add mTLS support to runtime extension server and client (#12519)
🐛 Bug Fixes
- MachineDeployment: Fix second rolling update for MD rolloutAfter (#12555)
🌱 Others
- Dependency: Bump Go to v1.23.11 (#12530)
- Dependency: Bump Go to v1.23.12 (#12612)
- Testing: Skipping test that is failing because of infra issues (#12566)
Dependencies
Added
Nothing has changed.
Changed
- github.com/coredns/corefile-migration: v1.0.26 → v1.0.27
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.9.11
👌 Kubernetes version support
- Management Cluster: v1.28.x -> v1.32.x
- Workload Cluster: v1.26.x -> v1.32.x
More information about version support can be found here
Changes since v1.9.10
📈 Overview
- 7 new commits merged
- 1 feature addition ✨
- 1 bug fixed 🐛
✨ New Features
- KCP: Bump corefile-migration to v1.0.27 (#12638)
🐛 Bug Fixes
- MachineDeployment: Fix second rolling update for MD rolloutAfter (#12556)
🌱 Others
- Dependency: Bump github.com/docker/docker to v28.0.2+incompatible to fix CVE (#12645)
- Dependency: Bump Go to v1.23.11 (#12531)
- Dependency: Bump Go to v1.23.12 (#12620)
- Dependency/Security: Add CVE-2025-22868 to Trivy ignore file (#12508)
- Testing: Skipping test that is failing because of infra issues (#12567)
Dependencies
Added
Nothing has changed.
Changed
- github.com/coredns/corefile-migration: v1.0.26 → v1.0.27
Removed
Nothing has changed.
Thanks to all our contributors! 😊
v1.11.0-rc.1
🚨 This is a RELEASE CANDIDATE. Use it only for testing purposes. If you find any bugs, file an issue.
Highlights
- Bumped to Go 1.24, controller-runtime v0.21, k8s.io/* v0.33, controller-gen v0.18 (also moved to
sigs.k8s.io/randfill
) (#12191) - v1beta2 API version has been introduced and considering the awesome amount of improvements it marks an important
step in the journey towards graduating our API to v1.- Accordingly there is now a new v1beta2 version of our contract for providers.
- Improve status:
- The transition to the new K8s aligned conditions using
metav1.Conditions
types and the new condition semantic
has been completed. - Replica counters are now consistent with new conditions and across all resources; new replica counters have been added at cluster level.
- Semantic of contract fields in status have been improved and are now consistent across all resources.
- The confusing
FailureReason
andFailureMessage
fields have been dropped.
- The transition to the new K8s aligned conditions using
- Support CC across namespaces: API changes planned for this feature have been implemented.
- Improve object references:
- Unnecessary fields have been dropped from object reference.
- Object references are now GitOps friendly (API version is not overwritten anymore by controllers).
- KubeadmConfig and KubeadmControlPlane APIs have been aligned with kubeadm v1beta4 API.
- Additionally, fields inferred from top level objects have been removed, thus getting rid of a common source of confusion/issues.
- Compliance with K8s API guidelines:
- Thanks to the adoption of the KAL linter compliance with K8s API guidelines has been greatly improved.
- All Duration fields are now represented as
*int32
fields with units being part of the field name. - All
bool
fields have been changed to*bool
to preserve user intent. - Extensive work has been done to ensure
required
andoptional
is explicitly set in the API, and that
both serialization and validation works accordingly:- Stop rendering empty structs (review of all occurrences of
omitempty
and introduction ofomitzero
) - Do not allow
""
when it is not semantically different from value not set (either you have to provide a non-empty string value or not set the field at all). - Do not allow
0
when it is not semantically different from value not set (either you have to provide a non-0 int value or not set the field at all). - Do not allow
{}
when it is not semantically different from value not set (either you have to set at least one property in the object or not set the field at all). - Do not allow
[]
when it is not semantically different from value not set (either you have to set at least one item in the list or not set the field at all). - Ensure validation for all enum types.
- Stop rendering empty structs (review of all occurrences of
- Missing list markers have been added for SSA.
- Drop unnecessary pointers:
- After fixing
required
andoptional
according to K8s API guidelines, extensive work has been done to
drop unnecessary pointers thus improving the usability of the API's Go structs.
- After fixing
- Avoid embedding structs: Coupling between API types has been reduced by reducing the usage of embedded structs.
- Extensive work has been done to improve consistency across all resources, e.g.:
- Fields for Machine deletion are under a new
deletion
struct in all resources. - Settings about
rollout
have been logically grouped in all resources. - Settings about health checks and
remediation
have been logically grouped in all resources.
- Fields for Machine deletion are under a new
- Missing validations have been added where required.
- Tech debt has been reduced by dropping deprecated fields.
- ClusterClass: Fix continuous reconciles because of apiVersion differences in Cluster topology controller (#12341)
- KCP/CABPK: Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig (#12335)
- KCP: Fix timeout handling in GetAPIServerCertificateExpiry and DialContext (#12554)
- Machine: fallback to InfraMachine providerID during deletion if Machine providerID is not set (#11985)
- Runtime SDK:
- Improved e2e test coverage, e.g.:
- New providers in clusterctl: Scaleway (#12357), cdk8s (#12332)
See Cluster API v1.10 compared to v1.11 for more details
Notes for workload cluster upgrade to Kubernetes v1.34 with KCP
- Context: Kubernetes/kubeadm <=> etcd compatibility:
- kubeadm v1.33 only supports etcd v3.5 for Kubernetes v1.33
- kubeadm v1.34 only supports etcd v3.6 for Kubernetes v1.34
- The upgrade to etcd v3.6 requires etcd >= v3.5.20 (https://etcd.io/blog/2025/upgrade_from_3.5_to_3.6_issue/)
- Accordingly, when upgrading from Kubernetes v1.33 to v1.34:
- ensure etcd >= v3.5.20 is used with Kubernetes v1.33 before the upgrade
- upgrade to Kubernetes v1.34 and etcd v3.6 at the same time
Deprecation and Removals Warning
- Cluster: Remove deprecated index ByClusterClassName, ClusterByClusterClassClassName and ClusterClassNameField (#12269)
- ClusterClass: Remove deprecated ClusterVariable.definitionFrom field (#12202)
- ClusterClass: Remove deprecated Cluster.spec.topology.rolloutAfter field (#12268)
- ClusterClass: Remove deprecated ClusterCacheTracker and corresponding types (#12270)
- clusterctl: Remove deprecated
clusterctl alpha topology plan
command (#12283) - ClusterResourceSet: Remove deprecated ClusterResourceSetBinding.DeleteBinding method (#12267)
- MachineDeployment: Removed deprecated revisionHistory (#12274)
- MachineDeployment: Remove deprecated spec.progressDeadlineSeconds (#12232)
- KCP/CABPK: Remove deprecated KubeadmConfig useExperimentalRetryJoin (#12234)
- API: Deprecate v1alpha1 & v1beta1 API packages (#12254)
👌 Kubernetes version support
- Management Cluster: v1.30.x -> v1.33.x
- Workload Cluster: v1.28.x -> v1.33.x
More information about version support can be found here
Changes since v1.11.0-rc.0
📈 Overview
- 21 new commits merged
- 3 feature additions ✨
- 9 bugs fixed 🐛
✨ New Features
- CAPD: Add scale from/to 0 support for CAPD (#12591)
- e2e: Bump Kubernetes version used for testing to v1.34.0-rc.1 (#12625)
- KCP/CABPK/CI: Bump KAL to pick up latest requiredfields linter, add Min/MaxLength to BootstrapToken (#12604)
🐛 Bug Fixes
- CAPD: Run CAPD conversion tests in CI (#12588)
- e2e: Fix autoscaler e2e test flake (#12627)
- KCP: Fix ControlPlaneComponentHealthCheckSeconds validation in KubeadmConfigSpec.Validate (#12624)
- KCP: Fix conversion issue in KubeadmControlPlaneTemplate with rolloutStrategy.type (#12622)
- ClusterClass/MachinePool: Fix MP error in desired state calculation during Cluster creation (#12621)
- Runtime SDK: Export ExtensionConfig webhook (#12599)
- Testing: Fix flaky TestFuzzyConversion (Cluster) test (#12630)
- Testing: Fix flaky TestReconcileMachinePhases unit test (#12632)
- Testing: Fix flaky TestReconcileState unit test (#12633)
🌱 Others
- Dependency: Bump Go to v1.24.6 (#12615)
- e2e: Add quickstart e2e test with v1beta1 with ClusterClass and RuntimeSDK (#12590)
- e2e: Improve check for Cluster Available condition in e2e tests (#12596)
- Logging: Reduce noisy logs (#12626)
- KCP/CABPK: Stop using unsafe for EnvVar conversion (#12631)
Dependencies
Added
Nothing has changed.
Changed
Nothing has changed.
Removed
Nothing has changed.
More details about the release
Changes since v1.10.0
📈 Overview
- 359 new commits merged
- 88 breaking changes
⚠️ - 28 feature additions ✨
- 50 bugs fixed 🐛
📝 Proposals
- Core: Update autoscaling from zero enhancement proposal with support for platform-aware autoscale from zero (#11962)
⚠️ Breaking Changes
- API: Add additional MinProperties & MinItems validation across multiple APIs (#12538)
- API: Add CAPD v1beta2 types (#12226)
- API: Add Minimum=0 marker to all MinReadySeconds fields (#12474)
- API: Add omitempty to required string without zero value (#12548)
- API: Add omitzero on struct without zero value (#12550)
- API: Add v1beta2 types (#12037)
- API: Align Spec fields to optionalfields API conventions (#12431)
- API: Align Status fields to optionalfields API conventions (#12435)
- API: Change .status.replicas fields to pointer + omitempty (#12250)
- API: Change all *metav1.Time fields to metav1.Time (#12518)
- API: Change bool to *bool for all API types (#12436)
- API: Change type of *string fields with invalid zero value to string (#12429)
- API: Change type of int32 fields with valid zero value to *int32 (#12424)
- API/Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in v1beta2 packages (#12091)
- API: Drop unnecessary fields from contract-versioned object references (#12356)
- API: Fix required fields linter findings (#12558)
- API: Improve Cluster CRD Go type (#12489)
- API: Migrate API to use *Seconds instead of metav1.Duration fields (#12327)
- API: Move APIs to ./api (#12262)
- API/Partially revert: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (#12290)
- API: Promote v1beta2 conditions (#12066)
- API: Remove DefaulterRemoveUnknownOrOmitabl...
v1.11.0-rc.0
🚨 This is a RELEASE CANDIDATE. Use it only for testing purposes. If you find any bugs, file an issue.
Highlights
- Bumped to Go 1.24, controller-runtime v0.21, k8s.io/* v0.33, controller-gen v0.18 (also moved to
sigs.k8s.io/randfill
) (#12191) - v1beta2 API version has been introduced and considering the awesome amount of improvements it marks an important
step in the journey towards graduating our API to v1.- Accordingly there is now a new v1beta2 version of our contract for providers.
- Improve status:
- The transition to the new K8s aligned conditions using
metav1.Conditions
types and the new condition semantic
has been completed. - Replica counters are now consistent with new conditions and across all resources; new replica counters have been added at cluster level.
- Semantic of contract fields in status have been improved and are now consistent across all resources.
- The confusing
FailureReason
andFailureMessage
fields have been dropped.
- The transition to the new K8s aligned conditions using
- Support CC across namespaces: API changes planned for this feature have been implemented.
- Improve object references:
- Unnecessary fields have been dropped from object reference.
- Object references are now GitOps friendly (API version is not overwritten anymore by controllers).
- KubeadmConfig and KubeadmControlPlane APIs have been aligned with kubeadm v1beta4 API.
- Additionally, fields inferred from top level objects have been removed, thus getting rid of a common source of confusion/issues.
- Compliance with K8s API guidelines:
- Thanks to the adoption of the KAL linter compliance with K8s API guidelines has been greatly improved.
- All Duration fields are now represented as
*int32
fields with units being part of the field name. - All
bool
fields have been changed to*bool
to preserve user intent. - Extensive work has been done to ensure
required
andoptional
is explicitly set in the API, and that
both serialization and validation works accordingly:- Stop rendering empty structs (review of all occurrences of
omitempty
and introduction ofomitzero
) - Do not allow
""
when it is not semantically different from value not set (either you have to provide a non-empty string value or not set the field at all). - Do not allow
0
when it is not semantically different from value not set (either you have to provide a non-0 int value or not set the field at all). - Do not allow
{}
when it is not semantically different from value not set (either you have to set at least one property in the object or not set the field at all). - Do not allow
[]
when it is not semantically different from value not set (either you have to set at least one item in the list or not set the field at all). - Ensure validation for all enum types.
- Stop rendering empty structs (review of all occurrences of
- Missing list markers have been added for SSA.
- Drop unnecessary pointers:
- After fixing
required
andoptional
according to K8s API guidelines, extensive work has been done to
drop unnecessary pointers thus improving the usability of the API's Go structs.
- After fixing
- Avoid embedding structs: Coupling between API types has been reduced by reducing the usage of embedded structs.
- Extensive work has been done to improve consistency across all resources, e.g.:
- Fields for Machine deletion are under a new
deletion
struct in all resources. - Settings about
rollout
have been logically grouped in all resources. - Settings about health checks and
remediation
have been logically grouped in all resources.
- Fields for Machine deletion are under a new
- Missing validations have been added where required.
- Tech debt has been reduced by dropping deprecated fields.
- ClusterClass: Fix continuous reconciles because of apiVersion differences in Cluster topology controller (#12341)
- KCP/CABPK: Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig (#12335)
- KCP: Fix timeout handling in GetAPIServerCertificateExpiry and DialContext (#12554)
- Machine: fallback to InfraMachine providerID during deletion if Machine providerID is not set (#11985)
- Runtime SDK:
- Improved e2e test coverage, e.g.:
- New providers in clusterctl: Scaleway (#12357), cdk8s (#12332)
See Cluster API v1.10 compared to v1.11 for more details
Notes for workload cluster upgrade to Kubernetes v1.34 with KCP
- Context: Kubernetes/kubeadm <=> etcd compatibility:
- kubeadm v1.33 only supports etcd v3.5 for Kubernetes v1.33
- kubeadm v1.34 only supports etcd v3.6 for Kubernetes v1.34
- The upgrade to etcd v3.6 requires etcd >= v3.5.20 (https://etcd.io/blog/2025/upgrade_from_3.5_to_3.6_issue/)
- Accordingly, when upgrading from Kubernetes v1.33 to v1.34:
- ensure etcd >= v3.5.20 is used with Kubernetes v1.33 before the upgrade
- upgrade to Kubernetes v1.34 and etcd v3.6 at the same time
Deprecation and Removals Warning
- Cluster: Remove deprecated index ByClusterClassName, ClusterByClusterClassClassName and ClusterClassNameField (#12269)
- ClusterClass: Remove deprecated ClusterVariable.definitionFrom field (#12202)
- ClusterClass: Remove deprecated Cluster.spec.topology.rolloutAfter field (#12268)
- ClusterClass: Remove deprecated ClusterCacheTracker and corresponding types (#12270)
- clusterctl: Remove deprecated
clusterctl alpha topology plan
command (#12283) - ClusterResourceSet: Remove deprecated ClusterResourceSetBinding.DeleteBinding method (#12267)
- MachineDeployment: Removed deprecated revisionHistory (#12274)
- MachineDeployment: Remove deprecated spec.progressDeadlineSeconds (#12232)
- KCP/CABPK: Remove deprecated KubeadmConfig useExperimentalRetryJoin (#12234)
- API: Deprecate v1alpha1 & v1beta1 API packages (#12254)
👌 Kubernetes version support
- Management Cluster: v1.30.x -> v1.33.x
- Workload Cluster: v1.28.x -> v1.33.x
More information about version support can be found here
Changes since v1.11.0-beta.2
📈 Overview
- 26 new commits merged
- 7 breaking changes
⚠️ - 2 feature additions ✨
- 3 bugs fixed 🐛
⚠️ Breaking Changes
- API: Add omitempty to required string without zero value (#12548)
- API: Add omitzero on struct without zero value (#12550)
- API: Fix required fields linter findings (#12558)
- API: Remove pointers from remaining pointer struct fields (#12545)
- CAPD: Update example manifests (#12480)
- KCP/CABPK: Change BootstrapToken.Token from *BootstrapTokenString to BootstrapTokenString (#12565)
- KCP/CABPK: Change User.PasswdFrom from *PasswdSource to PasswdSource + add omitzero, extend SSA patch helper to handle arrays (#12560)
✨ New Features
- CI: Add conflicting markers linter (#12569)
- MachinePool/Feat: set new replica fields for machine pools (#12528)
🐛 Bug Fixes
- e2e: Fix Available/Ready checks on E2E test (#12549)
- KCP: Fix timeout handling in GetAPIServerCertificateExpiry and DialContext (#12554)
- Testing: Fix Test_ValidateCluster unit tests for mink8s (#12564)
🌱 Others
- CI/Chore: Update golangci-lint to v2.3.0 (#12573)
- ClusterClass: Improve validation of worker topology names in Cluster resource (#12561)
- Dependency: Fix CVE-2025-54388 (#12574)
- e2e: Add resource version check to clusterctl upgrade tests (#12546)
- e2e: Fix ResourceVersion flake for MachinePools (#12552)
- e2e: Set extraArgs in test extension (#12557)
- e2e: Skipping test that is failing because of infra issues (#12496)
- Testing/CI/e2e: Add checker to validate conditions for v1beta2 (#12111)
Dependencies
Added
Nothing has changed.
Changed
- google.golang.org/grpc: v1.71.1 → v1.71.3
Removed
Nothing has changed.
More details about the release
Changes since v1.10.0
📈 Overview
- 337 new commits merged
- 88 breaking changes
⚠️ - 25 feature additions ✨
- 41 bugs fixed 🐛
📝 Proposals
- Core: Update autoscaling from zero enhancement proposal with support for platform-aware autoscale from zero (#11962)
⚠️ Breaking Changes
- API: Add additional MinProperties & MinItems validation across multiple APIs (#12538)
- API: Add CAPD v1beta2 types (#12226)
- API: Add Minimum=0 marker to all MinReadySeconds fields (#12474)
- API: Add omitempty to required string without zero value (#12548)
- API: Add omitzero on struct without zero value (#12550)
- API: Add v1beta2 types (#12037)
- API: Align Spec fields to optionalfields API conventions (#12431)
- API: Align Status fields to optionalfields API conventions (#12435)
- API: Change .status.replicas fields to pointer + omitempty (#12250)
- API: Change all *metav1.Time fields to metav1.Time (#12518)
- API: Change bool to *bool for all API types (#12436)
- API: Change type of *string fields with invalid zero value to string (#12429)
- API: Change type of int32 fields with valid zero value to *int32 (#12424)
- API/Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in v1beta2 packages (#12091)
- API: Drop unnecessary fields from contract-versioned object references (#12356)
- API: Fix required fields linter findings (#12558)
- API: Improve Cluster CRD Go type (#12489)
- API: Migrate API to use *Seconds instea...
v1.11.0-beta.2
🚨 This is a BETA RELEASE. Use it only for testing purposes. If you find any bugs, file an issue.
Changes since v1.11.0-beta.1
📈 Overview
- 23 new commits merged
- 7 breaking changes
⚠️ - 5 feature additions ✨
- 4 bugs fixed 🐛
⚠️ Breaking Changes
- API: Add additional MinProperties & MinItems validation across multiple APIs (#12538)
- API: Change all *metav1.Time fields to metav1.Time (#12518)
- API: Remove pointers from ClusterClass and Cluster healthCheck fields (#12525)
- API: Rename namingStrategy => naming, machineNamingStrategy => machineNaming (#12524)
- API: Restructure strategy fields (#12506)
- CAPD: Align CAPD conversion to conversion of other providers (#12481)
- KCP/CABPK: Change envVars fields from []EnvVar to *[]EnvVar (#12539)
✨ New Features
- CI: Bump KAL & add the notimestamps linter (#12520)
- e2e: Bump Kubernetes version used for testing to v1.34.0-beta.0 (#12516)
- KCP/CABPK: Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig (#12335)
- KCP/CABPK: Stop requiring init or cluster configuration for first CP machine (#12540)
- Runtime SDK: Add mTLS support to runtime extension server and client (#12517)
🐛 Bug Fixes
- Conditions: Fix condition handling during controller start (#12536)
- e2e: Fix e2e tests by fixing the etcd tag (#12523)
- MachineSet: Fix v1beta1 MachinesReady condition on MachineSet (#12535)
- Testing: Fix flakes in TestAPIAndWebhookChanges unit test (#12526)
🌱 Others
- API: Set print columns for v1beta2 types (#12534)
- Devtools: Fix Tiltfile (#12541)
- e2e: Print the entire object diff if resource versions are not stable in e2e tests (#12527)
- Runtime SDK: Fix lifecycle hooks conversions (#12507)
Dependencies
Added
- github.com/envoyproxy/go-control-plane/envoy: v1.32.4
- github.com/envoyproxy/go-control-plane/ratelimit: v0.1.0
Changed
- github.com/cncf/xds/go: b4127c9 → cff3c89
- github.com/envoyproxy/go-control-plane: v0.13.1 → v0.13.4
- github.com/envoyproxy/protoc-gen-validate: v1.1.0 → v1.2.1
- github.com/golang/glog: v1.2.2 → v1.2.4
- github.com/onsi/gomega: v1.37.0 → v1.38.0
- go.etcd.io/etcd/api/v3: v3.5.21 → v3.5.22
- go.etcd.io/etcd/client/pkg/v3: v3.5.21 → v3.5.22
- go.etcd.io/etcd/client/v3: v3.5.21 → v3.5.22
- go.opentelemetry.io/contrib/detectors/gcp: v1.30.0 → v1.34.0
- go.opentelemetry.io/otel/metric: v1.33.0 → v1.34.0
- go.opentelemetry.io/otel/sdk/metric: v1.30.0 → v1.34.0
- go.opentelemetry.io/otel/sdk: v1.33.0 → v1.34.0
- go.opentelemetry.io/otel/trace: v1.33.0 → v1.34.0
- go.opentelemetry.io/otel: v1.33.0 → v1.34.0
- google.golang.org/genproto/googleapis/api: e6fa225 → 5f5ef82
- google.golang.org/genproto/googleapis/rpc: 3abc09e → 1a7da9e
- google.golang.org/grpc: v1.68.2 → v1.71.1
- google.golang.org/protobuf: v1.36.5 → v1.36.6
- sigs.k8s.io/yaml: v1.5.0 → v1.6.0
Removed
Nothing has changed.
More details about the release
Changes since v1.10.0
📈 Overview
- 309 new commits merged
- 81 breaking changes
⚠️ - 23 feature additions ✨
- 38 bugs fixed 🐛
📝 Proposals
- Core: Update autoscaling from zero enhancement proposal with support for platform-aware autoscale from zero (#11962)
⚠️ Breaking Changes
- API: Add additional MinProperties & MinItems validation across multiple APIs (#12538)
- API: Add CAPD v1beta2 types (#12226)
- API: Add Minimum=0 marker to all MinReadySeconds fields (#12474)
- API: Add v1beta2 types (#12037)
- API: Align Spec fields to optionalfields API conventions (#12431)
- API: Align Status fields to optionalfields API conventions (#12435)
- API: Change .status.replicas fields to pointer + omitempty (#12250)
- API: Change all *metav1.Time fields to metav1.Time (#12518)
- API: Change bool to *bool for all API types (#12436)
- API: Change type of *string fields with invalid zero value to string (#12429)
- API: Change type of int32 fields with valid zero value to *int32 (#12424)
- API: Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in v1beta2 packages (#12091)
- API: Drop unnecessary fields from contract-versioned object references (#12356)
- API: Improve Cluster CRD Go type (#12489)
- API: Migrate API to use *Seconds instead of metav1.Duration fields (#12327)
- API: Move APIs to ./api (#12262)
- API: Partially revert: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (#12290)
- API: Promote v1beta2 conditions (#12066)
- API: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (#12231)
- API: Remove IPFamily from public APIs (move to CAPD/kind util) (#12215)
- API: Remove pointers from ClusterClass and Cluster healthCheck fields (#12525)
- API: Rename namingStrategy => naming, machineNamingStrategy => machineNaming (#12524)
- API: Restructure strategy fields (#12506)
- CABPK: Align KubeadmConfig to kubeadm v1beta4 types (#12282)
- CAPD: Align CAPD conversion to conversion of other providers (#12481)
- CAPD: Conditions: add V1Beta1 suffix and remove V1Beta2 suffix from condition types and reasons in CAPD v1beta2 packages (#12393)
- CAPD: Implement v1beta2 contract in CAPD (#12409)
- CAPD: Keep using v1beta1 condition in CAPD Docker backend (#12450)
- CAPD: Promote v1beta2 condition in CAPD (#12362)
- CAPD: Stop using v1beta1 status in CAPD controllers (#12438)
- Cluster: Remove deprecated index ByClusterClassName, ClusterByClusterClassClassName and ClusterClassNameField (#12269)
- ClusterClass: Drop unnecessary fields from ClusterClass template references (#12358)
- ClusterClass: Move infrastructure namingStrategy field in ClusterClass (#12216)
- ClusterClass: Remove ClusterVariable.DefinitionFrom field (#12202)
- ClusterClass: Remove DefaulterRemoveUnknownOrOmitableFields mutating webhook option (again) (#12404)
- ClusterClass: Remove deprecated Cluster.spec.topology.rolloutAfter field (#12268)
- ClusterClass: Remove deprecated ClusterCacheTracker and corresponding types (#12270)
- ClusterClass: Rename deprecated ClusterClass Metadata fields to DeprecatedV1Beta1Metadata (#12273)
- ClusterClass: Rename runtime extension fields in ClusterClass ExternalPatchDefinition (#12281)
- ClusterClass: Restructure classRef field in Cluster.spec.topology (#12235)
- clusterctl: Clusterctl describe defaults to v1beta2 (#12369)
- clusterctl: Remove clusterctl alpha topology plan (#12283)
- ClusterResourceSet: Change ClusterResourceSetBinding Bindings field from []*ResourceSetBinding to []ResourceSetBinding (#12476)
- ClusterResourceSet: Make clusterName field in ClusterResourceSetBinding required (#12276)
- ClusterResourceSet: Remove deprecated ClusterResourceSetBinding.DeleteBinding method (#12267)
- Conditions: Swap condition packages (#12086)
- Dependency: Bump to controller-runtime v0.21 / controller-tools v0.18 / k8s.io/* v0.33 / move to randfill (#12191)
- e2e: Migrate E2E tests to v1beta2 (#12451)
- e2e: Test/e2e: default to strict field validation & fix unknown field in ClusterClass YAML (#12501)
- IPAM: Refactor reference types for IPAM (#12365)
- KCP: KCP tolerates diff not leading to changes on machines (#12402)
- KCP: Rename LastRemediationStatus.Timestamp to Time in KCP (#12452)
- Machine: Drop unnecessary fields from Machine status.nodeRef (#12352)
- MachineDeployment: Drop revisionHistory in MachineDeployment (#12274)
- MachineDeployment: Remove MD spec.progressDeadlineSeconds (#12232)
- MachineHealthCheck: Drop unnecessary fields from remediationTemplate references (#12368)
- MachineHealthCheck: Rename MHC unhealthyConditions to unhealthyNodeConditions (#12245)
- MachineSet: Make Template in MachineSet & Spec in MachineTemplateSpec required (#12420)
- API/CAPD: Update ControlPlaneEndpoint InfraCluster contract, align CAPD to infra contracts (#12465)
- API/Cluster: Add initialization to Cluster status (#12098)
- API/Control-plane/Bootstrap/KCP/CABPK/Cluster: Implement v1beta2 contract in cluster controller, KCP, CABPK (#12094)
- API/KCP/CABPK/CI: Enable nomaps linter, Remove unused kubeadm ClusterStatus struct, Migrate Cluster.status.failureDomains to array (#12083)
- API/Machine: Add initialization to Machine Status (#12101)
- API/Machine: Move Machine deletion timeout fields into deletion group, move KCP machineTemplate spec fields to machineTemplate.spec (#12499)
- API/MachinePool: Add initialization to MachinePool Status (#12102)
- ClusterClass/MachineHealthCheck/Cluster: Restructure MHC fields in MHC, Cluster and ClusterClass CRDs (#12504)
- clusterctl/Documentation: Remove reference and configurations for Packet (Equinix Metal) (#12143)
- KCP/CABPK: Change envVars fields from []EnvVar to *[]EnvVar (#12539)
- KCP/CABPK: Inline ControlPlaneComponent struct in APIServer / ControllerManager / Scheduler in CABPK (#12446)
- KCP/CABPK: Remove KubeadmConfig UseExperimentalRetryJoin (#12234)
- KCP/CABPK: Remove more defaulting from KubeadmConfig/KubeadmConfigTemplate/KCP/KCPTemplate (#12495)
- KCP/CABPK: Remove redundant fields from CABPK / KCP ClusterConfiguration (#12319)
- KCP/CABPK: Remove TypeMeta from KubeadmConfigSpec (#12350)
- KCP/MachineSet/CABPK/CAPD/e2e/Cluster: Cleanup version handling of unsupported Kubernetes release...