---
# System prepended metadata

title: v1.4.0 release notes
tags: [' v1.4', v1.4.0]

---

---
tags: v1.4.0, v1.4,
---
# v1.4.0 release notes
---
## 👌 Kubernetes version support

* Management Cluster: v1.20.x -> v1.26.x [1]
* Workload Cluster: v1.18.x -> v1.26.x

[1] When using Cluster API with the experimental CLUSTER_TOPOLOGY feature, the Kubernetes version of the management cluster must be >= 1.22.0.

[More information about version support can be found here](https://release-1-4.cluster-api.sigs.k8s.io/reference/versions.html)

## Highlights
This release was focusd on adding some new awaited features, stability and continuolsy improving our release processes. This was possible by the hard work of more than 360 PRs from the awesome contributors of the community.

Some of the hightlights in this release are:

- KubeadmControlPlane has been improved allowing to automatically remedite failures when provisioning the control plane. This behaviour can be fine tuned by configuring the RemediationStrategy on KCP.
-  Cluster API now continuously sync certain labels from Machines to Nodes, allowing finer control on workload placement as well as assigning custom roles to nodes.
-  Cluster API now continuously propagate labels, annotations down the hierachy of objects - from ClusterClass to KubeadmControlPlane/MachineDeployments and ultimately to Machines - without triggering unecessary rollouts. The same improvement applies also to other fields impacting only Kubernetes objects or controller behaviour (e.g NodeDrainTimeout).
-  Cluster API now supports Variable Discovery in ClusterClass and Managed Topologies. As a consequence external patches (also known as topology mutation hooks) are now self contained, fully typed and more easily unit testable.

## Cluster API v1.3 compared to v1.4
See [the Cluster-API book](https://cluster-api.sigs.k8s.io/developer/providers/v1.3-to-v1.4.html) for an overview over relevant changes between Cluster API v1.3 and v1.4 for maintainers of providers and consumers of our Go API.

## Deprecation warning 
The api versions `v1alpha3` and `v1alpha4` are deprecated and will be removed in the follwing releases. `v1alpha3` will be removed in v1.5 and `v1alpha4` in v1.6. 
- [Version migration guide](https://cluster-api.sigs.k8s.io/developer/providers/version-migration.html)
- [GitHub issue #8038](https://github.com/kubernetes-sigs/cluster-api/issues/8038)


# Full list of changes since v1.3

## :chart_with_upwards_trend: Overview
- 361 new commits merged
- 19 breaking changes :warning:
- 40 feature additions ✨
- 56 bugs fixed 🐛

## :memo: Proposals
- Amend KCP proposal with remediation while provisioning the CP (#7855)
- Update autoscaling from zero proposal (#8036)
- Nit on KCP proposal (#8018)
- Add variable discovery to topology mutation proposal (#7932)

## :warning: Breaking Changes
- API: Drop ClusterTopologyManagedFieldsAnnotation field from v1beta1 (#7845)
- API: Removing CloneTemplate and CloneTemplateInput (#7839)
- API: Removing deprecated NewServer function (#7844)
- API: Removing deprecated healthcheck condition (#7836)
- API: Stop supporting CRDs with invalid names (#8041)
- Bump controller-runtime 0.13.1 to 0.14.1 (#7906)
- CAPD: Use Kubernetes 1.26 in Quick Start docs and CAPD. (#7799)
- clusterctl: Removing deprecated (--disable-no-echo) flag and renaming docs (#7837)
- clusterctl: Removing deprecated --list-images flag on init command (#7838)
- clusterctl: Remove clusterctl restore command and Restore function from Client interface (#7945)
- clusterctl: Refactor clusterctl alpha rollout (#7988)
- KCP: block upgrade to versions with old registry, improve registry handling (#7856)
- Machine: Add filter to associate variables with specific patches (#8128)
- Machine: Use consistent naming for API constants (#7618)
- Machine: apply `node.cluster.x-k8s.io/uninitialized` during machine creation (#7993)
- Machine: in-place propagation from MD to MS (#8110)
- Machine: in-place propagation from MS to InfraMachine and BootstrapConfig (#8060)
- Machine: in-place propagation from MS to Machines (#8111)
- Machine: in-place propagation support for KCP (#8057)


## :sparkles: New Features
- clusterctl: Add KCP feature to clusterctl alpha rollout (#6858)
- API: Add Node managed labels support (#7173)
- CAPBK: Add NodeRegistrationOptions.ImagePullPolicy Support (#7772)
- ClusterClass: Add discoverVariables runtime hook to ClusterClass reconcile loop (#8006)
- Docs: Add more reviewers and maintainers (#7996)
- clusterctl: Add output flag, change printYaml function signature (#7828)
- clusterctl: Add support for CoxEdge provider (#7770)
- KCP: Add support for KCP remediation during cluster provisioning (#7963)
- clusterctl: Add support for raw template URL in clusterctl generate yaml (#7371)
- Build: Adds a make target to generate all the release manifests (#7629)
- Build: Adds a verify script that run trivy scanner on container images (#7604)
- ClusterClass patches: Allow matching all MachineDeploymentClasses (#6930)
- Cluster: Emit Kubernetes Events when Cluster Phase, ControlPlaneReady, or InfrastructureReady change (#7786)
- E2E: Get Ginkgo version in Makefile from go.mod (#7503)
- ClusterClass: Handle variable definition conflicts for external variables (#8107)
- ClusterResourceSet: Implement Reconcile mode for ClusterResourceSet (#7497)
- clusterctl: Improve clusterctl upgrade syntax. Don't require namespace (#7376)
- ClusterResourceSet: Introduce ClusterName field to ClusterResourceSetBinding (#7680)
- lint: Introduce additional linters & bump golangci-lint to 1.50.1 (#7581)
- MachineDeployment: MachineDeployment rolloutAfter support (#8216)
- MachinePools: MachinePool annotation for externally managed autoscaler (#7107)
- CAPD: Make control plane port configurable in CAPD (#7548)
- Developer Experience: Make it possible to run envtest-based integration tests from vscode (#8088)
- ClusterClass: Managed Cluster should set labels and annotations on ControlPlane and MDs (#7917)
- Util: Move lowestNonZeroRetryAfterSeconds to util (#7542)
- Tilt: Removed the writing of os.environment by passing the 'env' parameter in cmd_button (#7574)
- SSA: Implement request caching (#8207)
- SSA: improve request caching (#8243)
- KCP: Update coredns corefile migration to v1.0.19 (#8074)
- Docs: Update support policy (#7549)
- KCP: Make kcp.skipPhases field mutable (#7646)
- RuntimeSDK: add Settings support to RuntimeExtensions (#7562)
- control-plane: add explicit securitycontexts to controllers (#7831)
- clusterctl: add kubekey k3s boostrap and control plane provider (#7528)
- RuntimeSDK: add response metrics for RuntimeSDK hook client (#7956)
- clusterctl: add command groups (#7769)
- Docs: fix command-line-tools links in book (#8162)
- E2E: Ensure OwnerRefs are consistently reconciled (#7606)
- Tilt: add podman support (#7810)
- API: Implements Getter interface for IPAddressClaim object (#8379)

## :bug: Bug Fixes
- ClusterResourceSet: : Make sure the Kubernetes API Server service already created on remote cluster before applying ClusterResourceSets (#8286)
- Testing: Add CleanupAndWait call for flaky ClusterClass test (#7589)
- API: Add deterministic prefix and suffix to label hash (#7763)
- Machine: Add finalizer reconcile for Topology MachineSets and MachineDeployments (#7536)
- KCP: Add name hashing for long MS and KCP names (#7711)
- clusterctl: Add soft ownership from clusters to ClusterResourceSetBinding (#8323)
- Machine: Added nodeVolumeDetachTimeout to CP machine (#8066)
- clusterctl: Allow using the --from flag to get a template from a github release (#7453)
- ClusterCacheTracker: fix panic in error creation (#8062)
- ClusterClass: remove empty hook entries from annotation (#7930)
- ClusterClass: run dry-run on original and modified object (#8139)
- Logging: Drop uid from error messages (#8337)
- clusterclt: Ensure all GitHub releases are fetched when searching provider versions (#8329)
- API: Ensure ownerReference apiVersions are always up to date (#8338)
- Machine: Fix Machine adoption for KCP/MachineSet-owned Machines (#7591)
- ClusterResourceSet: Fix adopting ClusterResourceSet resource by CRS when already applied (#7590)
- CAPBK: Fix adoption KubeadmControlPlane owned secrets (#7592)
- bootstrap: Fix bug in kubeadmconfig adoption (#7623)
- Testing: Fix flake in machine phases test (#8372)
- Testing: Fix flakiness in MD controller test (#7668)
- Testing: Fix flaky TestServerSideApplyWithDefaulting test (#8166)
- Testing: Fix flaky wait in CRS test (#8340)
- Build: Fix git config in release-binary builds (#8199)
- bootstrap: Fix kubeadmconfig bootstrapsecret ownerRef reconciliation (#7587)
- Build: Fix release-binary for static linking (#8219)
- clusterctl: Fix secret selection logic for ownerRef test (#7973)
- Fix spelling of requeuing across files (#8024)
- bootstrap: Fix to enable bootstrap secret rotation if the secret itself missing (#7717)
- Testing: Fix unit test coverage in KubeadmConfig (#7678)
- Build: Fix version calculation in make lint (#8003)
- KCP: Allow unsetting fields if their child fields are mutable (#8037)
- KCP: fix rollout after upgrade (#8125)
- Machine: MD controller: fix nil pointer when OnDelete policy is used (#8184)
- clusterctl: Migration github repository cluster-api-provider-outscale from organization outscale-dev to outscale (#7998)
- Testing: Remove exact path match from walkTemplate test (#8019)
- Testing: Remove inaccurate comment on KCP test (#7662)
- ClusterCacheTracker: Requeue health check during the creation of a new cluster accessor (#8122)
- CAPD: Revert: CAPD: only ignore necessary kubeadm preflight errors (#7878)
- Docs: Update comment describing controlPlaneInitialized (#8005)
- clusterctl: Use tenancy as filter in ownerReference test (#7976)
- ClusterClass: Validate MachineDeploymentTopology.Name to be valid label value (#7759)
- ClusterClass: Validate variables in defaulting webhook (#8345)
- Machine: bug fix to set node interruptible label (#8298)
- CAPBK: bugfix function aggregateFromMachinesToKCP (#8132)
- clusterctl: bugfix write-to flag should only run filepath.Clean when the output file is not "" or - (#7972)
- CAPBK: enable updates from CloudInit (mostly ubuntu) based KCPs to Ignition (flatcar) based KCPs (#8349)
- CAPBK: set uninitialized taint only on worker nodes (#8371)
- E2E: Fix cluster cleanup in self-hosted test (#7928)
- E2E: don't restart the conformance test container after ginkgo exits (#7946)
- E2E: fix ClusterClass changes flake (#7579)
- E2E: fix CoreDNS readiness validation, misc improvements (#7843)
- E2E: use topology cluster-template for clusterctl upgrade mgmt cluster (#8314)
- Bump golang and x/net (#8126)
- Bump helm dependency (#8089)
- clusterctl: Replace fixed build uid with command (#8223)
- clusterctl: clusterctl: fix goproxy to also return versions for major > 1 (#7709)

## Dependency updates
- Bump actions/cache from 3.0.11 to 3.3.1 (#7805, #7826, #7882, #8027, #8103, #8191, #8271)
- Bump actions/checkout from 3.1.0 to 3.3.0 (#7733, #7881)
- Bump actions/setup-go from 3.3.1 to 3.5.0 (#7689, #7781)
- Bump apidiff to v0.6.0 (#8230)
- Bump controller-tools 0.10.0=>0.11.1 (#7907)
- Bump controller-tools to v0.11.3 (#8056)
- Bump github.com/coredns/corefile-migration (#7652)
- Bump github.com/coredns/corefile-migration from 1.0.19 to 1.0.20 (#8193)
- Bump github.com/fatih/color from 1.13.0 to 1.15.0 (#7978, #8274)
- Bump github.com/gobuffalo/flect from 0.3.0 to 1.0.2(#7885, #8195)
- Bump github.com/onsi/ginkgo/v2 from 2.5.0 to 2.9.1 (#7649, #7735, #7883, #8029, #8104, #8143, #8237, #8273)
- Bump github.com/onsi/gomega from 1.24.1 to 1.27.4 (#7782, #7980, #8028, #8144, #8235, #8272)
- Bump github.com/prometheus/client_golang from 1.13.0 to 1.14.0 (#7651)
- Bump github.com/spf13/viper from 1.13.0 to 1.14.0 (#7650)
- Bump github.com/spf13/viper from 1.14.0 to 1.15.0 (#7979)
- Bump github.com/valyala/fastjson from 1.6.3 to 1.6.4 (#7827)
- Bump golang.org/x/oauth2 from 0.0.0-20221014153046-6fdb5e3db783 to 0.5.0 (#8194)
- Bump golang.org/x/oauth2 from 0.5.0 to 0.6.0 (#8238)
- Bump golang.org/x/text from 0.5.0 to 0.6.0 (#7884)
- Bump golangci-lint (v1.51.1) and enable some ginkgolinter checks (#8046, #8058)
- Bump golangci/golangci-lint-action from 3.3.1 to 3.4.0 (#7977)
- Bump helm and containerd in hack/tools go module (#7788)
- Bump kpromo to v3.5.1 (#8303)
- Bump kubebuilder-release-tools to v0.3.0, start running it on cherry-pick PRs (#7908)
- Bump shellcheck version (0.8.0 -> 0.9.0) (#7737)
- Bump softprops/action-gh-release from 0.1.14 to 0.1.15 (#7688)
- Bump sprig and golang/x/text (#7701)
- Bump to CR v0.14.2 (#8014)
- Bump to Go 1.19.5 (#7791, #7981)
- Bump to controller-runtime v0.14.5 (#8213)
- Bump to controller-tools v0.11.2 (#8020)
- Update cert-manager to v1.10.1 (#7705)
- Update cert-manager to v1.11.0 (#7916)
- Update conversion-gen version (v0.25.0 -> v0.26.0) (#7847)
- Update e2e components to v1.2.5 (#7550)
- Update golang.org//x/net to v0.4.0 (#7780)
- Bump go.mod: Update github.com/google/go-github to v48.2.0 (#7830)
- Update kubebuilder envtest (1.25.2 -> 1.26.0) (#7835)
- Update visualizer chart to v1.1.0 (#7857)

## :seedling: Others
- ClusterClass: Add ClusterClass generation check to Cluster Topology reconciler (#8023)
- ClusterClass: Add ClusterClass variables to status on reconcile (#7991)
- ClusterClass: Add DefinitionFrom field to ClusterVariable (#8031)
- RuntimeSDK: Add DiscoverVariables hook implementation for test extension (#8026)
- Docs: Add Jont828 to clusterctl reviewers (#7491)
- CAPD: Add category to DockerClusterTemplate (#7798)
- Clusterclass: Add clusterclass validation to topology reconciler (#7954)
- CAPBK: Add configurable etcd call timeout (#7841)
- Testing: Add envtest unit tests for node label sync (#8055)
- Machine: Add explicit length check for cluster and md names (#7712)
- Docs: Add failing/flaking test issue templates to the repository (#7778)
- hack: Add release notes pr statistics (#8187)
- CAPBK: Add template metadata to CABPK and KCP types (#8180)
- ci: Add weekly test-release action (#8203)
- clusterctl: Added WatchDeploymentLogsByLabelSelector function (#7039)
- Machine: Allow Machines in unreachable Clusters to do initial reconciliation (#7719)
- DevTools: Automate go dependency bumps (except CR/k8s.io) (#7632)
- CAPD: add env var to allow using remote Docker engines (#8177)
- CAPD: drop kubectl from image (#8182)
- CAPD: only ignore necessary kubeadm preflight errors (#7842)
- CAPD: reduce noisy error logs during machine reconciliation (#8090)
- Testing: Change test-extension pull policy to IfNotPresent (#7666)
- ClusterClass: Clarify condition message for unreconciled clusterclass (#8202)
- Tilt: Cleanup special handling for tilt_modules folder (#7774)
- API: Cluster topology: fix comment about MD replicas defaulting (#7779)
- ClusterClass: ClusterClass & test/framework: consider replicas for control plane readiness (#7914)
- Docs: ClusterClass proposal: Clean up outdated implementation details by linking the book's page (#7790)
- ClusterClass: Allow fine-granular control of MachineDeployment upgrades (#8102)
- ClusterClass: also consider MD unavailableReplicas for rollout (#8063)
- ClusterClass: catch panics when applying patches (#8067)
- ClusterClass: don't propagate MD upgrade annotations (#8261)
- ClusterClass: extend engine unit tests to cover applying builtin variables (#8183)
- ClusterClass: Default and Validate Cluster variables based on ClusterClass status (#8076)
- API: Deprecate v1alpha3 & v1alpha4 (#8071)
- lint: Enable ginkgolinter len assertion check and fix findings (#8087)
- Machine: Ensure infra and bootstrap objects are owned by Machines (#7593)
- Machine: Fix an error message of the failure domain field in the Machine controller (#7583)
- CI: Fix sha of kubebuilder-release-tools GitHub action (#7953)
- Developer Experience: Fix verify boilerplate on mac (#7866)
- Developer Experience: Fix verify-shellcheck script and fix findings (#7755)
- E2E: Improve quick-start test supporting scenarios with more than one infrastructure provider (#7969)
- Tilt: Improve tilt-prepare for testing providers outside of the CAPI repository (#7968)
- KCP: KCP should avoid to reconcile certificates too early (#7727)
- KCP: remove unused code (#7598)
- Testing: MD reconciler: improve integration test (#7596)
- Machine Deployment: improve replica defaulting for autoscaler (#7990)
- MachinePools: automatically bump apiVersions like in our other controllers (#7995)
- API: Make 'inline' a reserved name for patches (#8025)
- ClusterClass: Make Cluster webhook less strict for out of date ClusterClasses (#8136)
- CAPD: Make load balancer first-party package in CAPD (#8246)
- E2E: Merge ownerReference tests with quick start (#8287)
- Machine: Move machine controller tests to envtest, drop disableNodeLabelSync (#8044)
- Machine: New Filter NeedsRollout to determine if a machine needs rollout. (#7571)
- MachineDeployment: Remove PopulateDefaultsMachineDeployment and fix how MD controller set revision (#7992)
- clusterctl: Remove `clusterctl backup` command and Backup function from Client interface (#7752)
- clusterctl: Remove fix RBAC from component management in clusterctl (#7339)
- E2E: Remove generation check for clusterclass to fix e2e test (#8133)
- API: Remove omitempty tag from definitionsConflict (#8201)
- cluterctl: Remove redirection handling in repository_github client (#7951)
- util: Replace deprecated string set through generic set (#8004)
- CI: Run weekly markdown check against all supported branches (#7960)
- CI: Set fail-fast: false for weekly md link check (#8161)
- Docs: Small improvement to the backport policy (#7823)
- Tilt: Tilt must show templates for enabled providers only (#7724)
- RuntimeSDK: Update handler name validation rules (#8283)
- Docs: Update versions doc adding Kubernetes 1.26 (#7801)
- Docs: Use GitHub forms for issue templates (#7819)
- Controller Runtime: Use Lazy Restmapper (#8091)
- Error: Use errors.Is to check for a specific error (#8130)
- CAPD: Use latest kind images for CAPD (#7621)
- ClusterClass: Weaken ClusterClass webhook variable validation on update (#8153)
- Build: `make promote-images` should also work if the user uses a SSH style URL (#7715)
- CI: actions: use go version from Makefile (#8002)
- clusterctl: add clusterctl label to providers deployed with tilt (#7551)
- Machine: add comment to disableNodeLabelSync (#7965)
- CAPD: align CAPD docker run flags with kind (#8157)
- Controller Runtime: setup controller in a consistent way (#8226)
- CI: Set fail-fast false for all GH actions using matrix (#8275)
- ClusterClass: deprecate rolloutAfter in cluster topology (#8326)
- CI: drop the draft release notes step from github workflow (#7893)
- E2E: Add init versions for providers (#7628)
- envtest: add env var to allow writing envtest kubeconfig (#8042)
- Testing: fix `TestKubeadmControlPlaneReconciler_initializeControlPlane` flake (#8259)
- Testing: fix incorrect assertion (#8206)
- hack: add support for date ranges to notes.go script (#8094)
- Logging: improve logging during Machine deletion (#8108)
- Metrics: improves the existing capi metrics (#7886)
- lint: enable revive if-return check and fix findings (#7682)
- logging: add removal note, cleanup no-op code (#7955)
- Developer Experience: make ensure scripts fail if GOPATH/bin not in PATH (#8017)
- prepare main branch for v1.4 development (#7692)
- clusterctl: remove KCP as a valid resource type for rollback (#8035)
- E2E: self-hosted e2e should check managed fields (#7513)
- CI: setup Trivy scanning for supported release branches (#7874)
- E2E: Use informer to stream pod logs (#7935)
- E2E: Add ClusterClass rollout test, extend MD rollout test (#8171)
- E2E: Add v1.0=>main clusterctl upgrade test (#8072)
- E2E: Cleanup test files & update doc (#7825)
- E2E: Bump Ginkgo binary to v2.5.0 (#7580)
- E2E: Disable rollout check for ClusterClass-based cluster in clusterctl ugprade tests II (#8140)
- E2E: Disable rollout check for ClusterClass-based cluster in clusterctl upgrade test (#8138)
- E2E: Increase Ginkgo poll progress after to 1h (#7888)
- E2E: Run clusterctl v0.4=>main test with v1.23.13 (#7899)
- test/extension: push to staging registry (#8181)
- test/framework: don't fix kubeconfig for remote CAPD clusters (#8241)
- test/framework: ensure ApplyClusterTemplateAndWait always returns a cluster (#8142)
- Tilt: remove securityContext for live_update (#7846)
- Util: update const strings for util.secret (#7997)
- code-organization: Rename md parameters for consistency (#8244)
- RuntimeSDK: Add API types for DiscoverVariables hook (#7986)
- RuntimeSDK: Add observedGeneration to ClusterClass status (#7987)
- Testing: Update e2e upgrade test versions (#8364)
    

:book: Additionally, there have been 67 contributions to our documentation and book. (#8369, #8368, #8367, #8353, #8296, #8290, #8234, #8239, #8232, #8220, #8189, #8169, #8168, #8165, #8134, #8148, #8156, #8118, #8117, #8073, #8079, #8015, #8034, #8030, #7902, #7983, #7967, #7566, #7950, #7922, #7943, #7933, #7934, #7912, #7802, #7894, #7867, #7546, #7822, #7817, #7814, #7803, #7706, #7767, #7726, #7718, #7720, #7714, #7698, #7696, #7681, #7667, #7331, #7675, #7595, #7645, #7605, #7561, #7570, #7526, #7499, #7444, #7545, #8145, #8043, #8382, #8399)

    
## Release
https://github.com/kubernetes-sigs/cluster-api/releases/tag/v1.4.0

<br/>

_Thanks to all our contributors!_ 😊
