diff --git a/docs/book/src/SUMMARY.md b/docs/book/src/SUMMARY.md
index 7ef102c1c58f..80c40d543a93 100644
--- a/docs/book/src/SUMMARY.md
+++ b/docs/book/src/SUMMARY.md
@@ -89,14 +89,6 @@
- [Tuning controllers](./developer/architecture/controllers/tuning.md)
- [Provider Implementers](./developer/providers/implementers.md)
- [Version migration](./developer/providers/version-migration.md)
- - [v0.3 to v0.4](./developer/providers/migrations/v0.3-to-v0.4.md)
- - [v0.4 to v1.0](./developer/providers/migrations/v0.4-to-v1.0.md)
- - [v1.0 to v1.1](./developer/providers/migrations/v1.0-to-v1.1.md)
- - [v1.1 to v1.2](./developer/providers/migrations/v1.1-to-v1.2.md)
- - [v1.2 to v1.3](./developer/providers/migrations/v1.2-to-v1.3.md)
- - [v1.3 to v1.4](./developer/providers/migrations/v1.3-to-v1.4.md)
- - [v1.4 to v1.5](./developer/providers/migrations/v1.4-to-v1.5.md)
- - [v1.5 to v1.6](./developer/providers/migrations/v1.5-to-v1.6.md)
- [v1.6 to v1.7](./developer/providers/migrations/v1.6-to-v1.7.md)
- [v1.7 to v1.8](./developer/providers/migrations/v1.7-to-v1.8.md)
- [v1.8 to v1.9](./developer/providers/migrations/v1.8-to-v1.9.md)
diff --git a/docs/book/src/developer/providers/migrations/v0.3-to-v0.4.md b/docs/book/src/developer/providers/migrations/v0.3-to-v0.4.md
deleted file mode 100644
index 769d6dc56eb1..000000000000
--- a/docs/book/src/developer/providers/migrations/v0.3-to-v0.4.md
+++ /dev/null
@@ -1,358 +0,0 @@
-# Cluster API v0.3 compared to v0.4
-
-## Minimum Go version
-
-- The Go version used by Cluster API is now Go 1.16+
- - In case cloudbuild is used to push images, please upgrade to `gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20211013-1be7868d8b`
- in the cloudbuild YAML files.
-
-## Controller Runtime version
-
-- The Controller Runtime version is now v0.9.+
-
-## Controller Tools version (if used)
-
-- The Controller Tools version is now v0.6.+
-
-## Kind version
-
-- The KIND version used for this release is v0.11.x
-
-## ⚠ Go Module changes ⚠
-
-- The `test` folder now ships with its own Go module `sigs.k8s.io/cluster-api/test`.
-- The module is going to be tagged and versioned as part of the release.
-- Folks importing the test e2e framework or the Docker infrastructure provider need to import the new module.
- - When imported, the test module version should always match the Cluster API one.
- - Add the following line in `go.mod` to replace the cluster-api dependency in the test module (change the version to your current Cluster API version):
- ```
- replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v0.4.x
- ```
-- The CAPD go module in test/infrastructure/docker has been removed.
-
-## Klog version
-
-- The klog package used has been upgraded to v2.5.x. It is recommended that
- all providers also switch to using v2.
-
- - Change `import k8s.io/klog` to `import k8s.io/klog/v2`
- - Change `import k8s.io/klog/klogr` to `import k8s.io/klog/v2/klogr`
- - Update `go.mod` to `k8s.io/klog/v2 v2.5.0`
- - Run `go mod tidy` to ensure all dependencies are updated.
-
-## The controllers.DeleteNodeAnnotation constant has been removed
-
-- This annotation `cluster.k8s.io/delete-machine` was originally deprecated a while ago when we moved our types under the `x-k8s.io` domain.
-
-## The controllers.DeleteMachineAnnotation has been moved to v1alpha4.DeleteMachineAnnotation
-
-- This annotation was previously exported as part of the controllers package, instead this should be a versioned annotation under the api packages.
-
-## Align manager flag names with upstream Kubernetes components
-
-- Rename `--metrics-addr` to `--metrics-bind-addr`
-- Rename `--leader-election` to `--leader-elect`
-
-## util.ManagerDelegatingClientFunc has been removed
-
-This function was originally used to generate a delegating client when creating a new manager.
-
-Controller Runtime v0.9.x now uses a `ClientBuilder` in its Options struct and it uses
-the delegating client by default under the hood, so this can be now removed.
-
-## Use to Controller Runtime's new fake client builder
-
-- The functions `fake.NewFakeClientWithScheme` and `fake.NewFakeClient` have been deprecated.
-- Switch to `fake.NewClientBuilder().WithObjects().Build()` instead, which provides a cleaner interface
- to create a new fake client with objects, lists, or a scheme.
-
-## Multi tenancy
-
-Up until v1alpha3, the need of supporting multiple credentials was addressed by running multiple
-instances of the same provider, each one with its own set of credentials while watching different namespaces.
-
-Starting from v1alpha4 instead we are going require that an infrastructure provider should manage different credentials,
-each one of them corresponding to an infrastructure tenant.
-
-see [Multi-tenancy](../../architecture/controllers/multi-tenancy.md) and [Support multiple instances](../../architecture/controllers/support-multiple-instances.md) for
-more details.
-
-Specific changes related to this topic will be detailed in this document.
-
-## Change types with arrays of pointers to custom objects
-
-The conversion-gen code from the `1.20.x` release onward generates incorrect conversion functions for types having arrays of pointers to custom objects. Change the existing types to contain objects instead of pointer references.
-
-## Optional flag for specifying webhook certificates dir
-Add optional flag `--webhook-cert-dir={string-value}` which allows user to specify directory where webhooks will get tls certificates.
-If flag has not provided, default value from `controller-runtime` should be used.
-
-## Required kustomize changes to have a single manager watching all namespaces and answer to webhook calls
-
-In an effort to simplify the management of Cluster API components, and realign with Kubebuilder configuration,
-we're requiring some changes to move all webhooks back into a single deployment manager, and to allow Cluster
-API watch all namespaces it manages.
-For a `/config` folder reference, please use the testdata in the Kubebuilder project: https://github.com/kubernetes-sigs/kubebuilder/tree/release-3.15/testdata/project-v3/config
-
-**Pre-requisites**
-
-Provider's `/config` folder has the same structure of `/config` folder in CAPI controllers.
-
-**Changes in the `/config/webhook` folder:**
-
-1. Edit the `/config/webhook/kustomization.yaml` file:
- - Remove the `namespace:` configuration
- - In the `resources:` list, remove the following items:
- ```
- - ../certmanager
- - ../manager
- ```
- - Remove the `patchesStrategicMerge` list
- - Copy the `vars` list into a temporary file to be used later in the process
- - Remove the `vars` list
-1. Edit the `config/webhook/kustomizeconfig.yaml` file:
- - In the `varReference:` list, remove the item with `kind: Deployment`
-1. Edit the `/config/webhook/manager_webhook_patch.yaml` file and remove
- the `args` list from the `manager` container.
-1. Move the following files to the `/config/default` folder
- - `/config/webhook/manager_webhook_patch.yaml`
- - `/config/webhook/webhookcainjection_patch.yaml`
-
-**Changes in the `/config/manager` folder:**
-
-1. Edit the `/config/manager/kustomization.yaml` file:
- - Remove the `patchesStrategicMerge` list
-1. Edit the `/config/manager/manager.yaml` file:
- - Add the following items to the `args` list for the `manager` container list
- ```
- - "--metrics-bind-addr=127.0.0.1:8080"
- ```
- - Verify that feature flags required by your container are properly set
- (as it was in `/config/webhook/manager_webhook_patch.yaml`).
-1. Edit the `/config/manager/manager_auth_proxy_patch.yaml` file:
- - Remove the patch for the container with name `manager`
-1. Move the following files to the `/config/default` folder
- - `/config/manager/manager_auth_proxy_patch.yaml`
- - `/config/manager/manager_image_patch.yaml`
- - `/config/manager/manager_pull_policy.yaml`
-
-**Changes in the `/config/default` folder:**
-1. Create a file named `/config/default/kustomizeconfig.yaml` with the following content:
- ```
- # This configuration is for teaching kustomize how to update name ref and var substitution
- varReference:
- - kind: Deployment
- path: spec/template/spec/volumes/secret/secretName
- ```
-1. Edit the `/config/default/kustomization.yaml` file:
- - Add the `namePrefix` and the `commonLabels` configuration values copying values from the `/config/kustomization.yaml` file
- - In the `bases:` list, add the following items:
- ```
- - ../crd
- - ../certmanager
- - ../webhook
- ```
- - Add the `patchesStrategicMerge:` list, with the following items:
- ```
- - manager_auth_proxy_patch.yaml
- - manager_image_patch.yaml
- - manager_pull_policy.yaml
- - manager_webhook_patch.yaml
- - webhookcainjection_patch.yaml
- ```
- - Add a `vars:` configuration using the value from the temporary file created while modifying `/config/webhook/kustomization.yaml`
- - Add the `configurations:` list with the following items:
- ```
- - kustomizeconfig.yaml
- ```
-
-**Changes in the `/config` folder:**
-
-1. Remove the `/config/kustomization.yaml` file
-1. Remove the `/config/patch_crd_webhook_namespace.yaml` file
-
-**Changes in the `main.go` file:**
-
-1. Change default value for the flags `webhook-port` flag to `9443`
-1. Change your code so all the controllers and the webhooks are started no matter if the webhooks port selected.
-
-**Other changes:**
-
-- makefile
- - update all the references for `/config/manager/manager_image_patch.yaml` to `/config/default/manager_image_patch.yaml`
- - update all the references for `/config/manager/manager_pull_policy.yaml` to `/config/default/manager_pull_policy.yaml`
- - update all the call to `kustomize` targeting `/config` to target `/config/default` instead.
-- E2E config files
- - update provider sources reading from `/config` to read from `/config/default` instead.
-- clusterctl-settings.json file
- - if the `configFolder` value is defined, update from `/config` to `/config/default`.
-
-## Upgrade cert-manager to v1.1.0
-
-NB. instructions assumes "Required kustomize changes to have a single manager watching all namespaces and answer to webhook calls"
-should be executed before this changes.
-
-**Changes in the `/config/certmanager` folder:**
-
-1. Edit the `/config/certmanager/certificate.yaml` file and replace all the occurrences of `cert-manager.io/v1alpha2`
- with `cert-manager.io/v1`
-
-**Changes in the `/config/default` folder:**
-
-1. Edit the `/config/default/kustomization.yaml` file and replace all the occurrences of
- ```
- kind: Certificate
- group: cert-manager.io
- version: v1alpha2
- ```
- with
- ```
- kind: Certificate
- group: cert-manager.io
- version: v1
- ```
-## Support the cluster.x-k8s.io/watch-filter label and watch-filter flag.
-
-- A new label `cluster.x-k8s.io/watch-filter` provides the ability to filter the controllers to only reconcile objects with a specific label.
-- A new flag `watch-filter` enables users to specify the label value for the `cluster.x-k8s.io/watch-filter` label on controller boot.
-- The flag which enables users to set the flag value can be structured like this:
- ```go
- fs.StringVar(&watchFilterValue, "watch-filter", "", fmt.Sprintf("Label value that the controller watches to reconcile cluster-api objects. Label key is always %s. If unspecified, the controller watches for all cluster-api objects.", clusterv1.WatchLabel))
- ```
-- The `ResourceNotPausedAndHasFilterLabel` predicate is a useful helper to check for the pause annotation and the filter label easily:
- ```go
- c, err := ctrl.NewControllerManagedBy(mgr).
- For(&clusterv1.MachineSet{}).
- Owns(&clusterv1.Machine{}).
- Watches(
- &source.Kind{Type: &clusterv1.Machine{}},
- handler.EnqueueRequestsFromMapFunc(r.MachineToMachineSets),
- ).
- WithOptions(options).
- WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), r.WatchFilterValue)).
- Build(r)
- if err != nil {
- return errors.Wrap(err, "failed setting up with a controller manager")
- }
- ```
-
-## Required changes to have individual service accounts for controllers.
-
-1. Create a new service account such as:
- ```yaml
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: manager
- namespace: system
- ```
-2. Change the `subject` of the managers `ClusterRoleBinding` to match:
- ```yaml
- subjects:
- - kind: ServiceAccount
- name: manager
- namespace: system
- ```
-3. Add the correct `serviceAccountName` to the manager deployment:
- ```yaml
- serviceAccountName: manager
- ```
-
-## Percentage String or Int API input will fail with a string different from an integer with % appended.
-
-`MachineDeployment.Spec.Strategy.RollingUpdate.MaxSurge`, `MachineDeployment.Spec.Strategy.RollingUpdate.MaxUnavailable` and `MachineHealthCheck.Spec.MaxUnhealthy` would have previously taken a String value with an integer character in it e.g "3" as a valid input and process it as a percentage value.
-Only String values like "3%" or Int values e.g 3 are valid input values now. A string not matching the percentage format will fail, e.g "3".
-
-## Required change to support externally managed infrastructure.
-
-- A new annotation `cluster.x-k8s.io/managed-by` has been introduced that allows cluster infrastructure to be managed
- externally.
-- When this annotation is added to an `InfraCluster` resource, the controller for these resources should not reconcile
- the resource.
-- The `ResourceIsNotExternallyManaged` predicate is a useful helper to check for the annotation and the filter the resource easily:
- ```go
- c, err := ctrl.NewControllerManagedBy(mgr).
- For(&providerv1.InfraCluster{}).
- Watches(...).
- WithOptions(options).
- WithEventFilter(predicates.ResourceIsNotExternallyManaged(ctrl.LoggerFrom(ctx))).
- Build(r)
- if err != nil {
- return errors.Wrap(err, "failed setting up with a controller manager")
- }
- ```
-- Note: this annotation also has to be checked in other cases, e.g. when watching for the Cluster resource.
-
-## MachinePool API group changed to `cluster.x-k8s.io`
-
-MachinePool is today an experiment, and the API group we originally decided to pick was `exp.cluster.x-k8s.io`. Given that the intent is in the future to move MachinePool to the core API group, we changed the experiment to use `cluster.x-k8s.io` group to avoid future breaking changes.
-
-All InfraMachinePool implementations should be moved to `infrastructure.cluster.x-k8s.io`. See `DockerMachinePool` for an example.
-
-Note that MachinePools are still experimental after this change and should still be feature gated.
-
-## Golangci-lint configuration
-
-There were a lot of new useful linters added to `.golangci.yml`. Of course it's not mandatory to use `golangci-lint` or
-a similar configuration, but it might make sense regardless. Please note there was previously an error in
-the `exclude` configuration which has been fixed in [#4657](https://github.com/kubernetes-sigs/cluster-api/pull/4657). As
-this configuration has been duplicated in a few other providers, it could be that you're also affected.
-
-# test/helpers.NewFakeClientWithScheme has been removed
-
-This function used to create a new fake client with the given scheme for testing,
-and all the objects given as input were initialized with a resource version of "1".
-The behavior of having a resource version in fake client has been fixed in controller-runtime,
-and this function isn't needed anymore.
-
-## Required kustomize changes to remove kube-rbac-proxy
-
-NB. instructions assumes "Required kustomize changes to have a single manager watching all namespaces and answer to webhook calls"
-should be executed before this changes.
-
-**Changes in the `/config/default` folder:**
-1. Edit `/config/default/kustomization.yaml` and remove the `manager_auth_proxy_patch.yaml` item from the `patchesStrategicMerge` list.
-1. Delete the `/config/default/manager_auth_proxy_patch.yaml` file.
-
-**Changes in the `/config/manager` folder:**
-1. Edit `/config/manager/manager.yaml` and remove the `--metrics-bind-addr=127.0.0.1:8080` arg from the `args` list.
-
-**Changes in the `/config/rbac` folder:**
-1. Edit `/config/rbac/kustomization.yaml` and remove following items from the `resources` list.
- - `auth_proxy_service.yaml`
- - `auth_proxy_role.yaml`
- - `auth_proxy_role_binding.yaml`
-1. Delete the `/config/rbac/auth_proxy_service.yaml` file.
-1. Delete the `/config/rbac/auth_proxy_role.yaml` file.
-1. Delete the `/config/rbac/auth_proxy_role_binding.yaml` file.
-
-**Changes in the `main.go` file:**
-1. Change the default value for the `metrics-bind-addr` from `:8080` to `localhost:8080`
-
-## Required cluster template changes
-
-- `spec.infrastructureTemplate` has been moved to `spec.machineTemplate.infrastructureRef`. Thus, cluster templates which include `KubeadmControlPlane`
-have to be adjusted accordingly.
-- `spec.nodeDrainTimeout` has been moved to `spec.machineTemplate.nodeDrainTimeout`.
-
-## Required spec and status fields for Control Planes using 'version' for ClusterClass support
-ControlPlane implementations using version must now [include a 'version' field as defined below in both its spec and its status](../../architecture/controllers/control-plane.md#required-spec-fields-for-implementations-using-version).
-
- `spec.version` - is a string representing the Kubernetes version to be used
- by the control plane machines. The value must be a valid semantic version;
- also if the value provided by the user does not start with the v prefix, it
- must be added.
-
-`status.version` - is a string representing the minimum Kubernetes version for the control plane machines in the cluster.
-
-Please note that implementing these fields are a requirement for a control plane provider to be used with ClusterClass and managed topologies.
-
-## Required spec fields for Control Planes using 'Machines' for ClusterClass support
-ControlPlane implementations that use an underlying MachineInfrastructure must now [include a 'machineTemplate' as defined below, with subordinate fields, in its Spec.](../../architecture/controllers/control-plane.md#required-spec-fields-for-implementations-using-machines)
-
-
- `machineTemplate` - is a struct containing details of the control plane
- machine template.
-
- Please note that implementing this field for control plane providers using machines is a requirement for ClusterClass and managed topologies to work consistently across all providers.
-
diff --git a/docs/book/src/developer/providers/migrations/v0.4-to-v1.0.md b/docs/book/src/developer/providers/migrations/v0.4-to-v1.0.md
deleted file mode 100644
index f22654466dbe..000000000000
--- a/docs/book/src/developer/providers/migrations/v0.4-to-v1.0.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# Cluster API v0.4 compared to v1.0
-
-## Minimum Go version
-
-- The Go version used by Cluster API is still Go 1.16+
-
-## Controller Runtime version
-
-- The Controller Runtime version is now v0.10.+
-
-## Controller Tools version (if used)
-
-- The Controller Tools version is now v0.7.+
-
-## Kind version
-
-- The KIND version used for this release is still v0.11.x
-
-## Conversion from v1alpha3 and v1alpha4 to v1beta1 types
-
-The core ClusterAPI providers will support upgrade from v1alpha3 **and** v1alpha4 to v1beta1. Thus, conversions of API types
-from v1alpha3 and v1alpha4 to v1beta1 have been implemented. If other providers also want to support the upgrade from v1alpha3 **and**
-v1alpha4, the same conversions have to be implemented.
-
-## Certificates
-
-The `serving-cert` certificates now have organization set to `k8s-sig-cluster-lifecycle`.
-
-## Removed items
-
-### API Fields
-
-- **ClusterTopologyLabelName**, a ClusterClass related constant has been deprecated and removed. This label has been replaced by `ClusterTopologyOwnedLabel`.
-
-- **MachineNodeNameIndex** has been removed from the common types in favor of `api/v1beta1/index.MachineNodeNameField`.
-
-- **MachineProviderNameIndex** has been removed from common types in favor of `api/v1beta1/index.MachineProviderIDField`.
-
-### Clusterctl
-
-- **clusterctl config provider** has been removed in favor of `clusterctl generate provider`.
-
-- **clusterctl config cluster** has been removed in favor of `clusterctl generate cluster`.
-
-### Utils and other
-
-- **TemplateSuffix** has been removed in favor of `api/v1alpha4.TemplatePrefix`.
-- **AddMachineNodeIndex** has been removed in favor of `api/v1alpha4/index.ByMachineNode`
-- **GetMachineFromNode** has been removed. This functionality is now private in the controllers package.
-- **ConverReferenceAPIContract** has been removed in favor of `UpdateReferenceAPIContract` in the util/conversion package.
-- **ParseMajorMinorPatch** has been removed in favor of `ParseMajorMinorPatch` in the util/version package.
-- **GetMachinesForCluster** has been removed in favor of `GetFilteredMachinesForCluster` in the util/collection package.
-- **GetControlPlaneMachines** has been removed in favor of `FromMachines(machine).Filter(collections.ControlPlaneMachines(cluster.Name))` in the util/collection package.
-- **GetControlPlaneMachinesFromList** has been removed in favor of `FromMachineList(machines).Filter(collections.ControlPlaneMachines(cluster.Name))` in the util/collection package.
-- **GetCRDMetadataFromGVK** has been removed in favor of `GetGVKMetadata`.
-- Ensure your template resources support `template.meta` fields. Refer to the [cluster][cluster-contract] and
- [machine][machine-contract] provider contract docs for more information. This is not required, but is recommended for
- consistency across the infrastructure providers as Cluster API graduates and opens up use cases where coordinating
- controllers can use labels and annotations from template infrastructure resources to do external provisioning or
- provide configuration information, e.g. [IPAM support for vSphere / bare-metal][capv-ipam].
-- Labels and annotations from KubeadmControlPlane, MachineDeployment and MachineSet and their `.spec.template.metadata` fields are now selectively propagated to objects controlled by their respective controllers. Refer to [metadata-propagation] for more information.
-
-## ⚠ LeaderElectionResourceLock change ⚠
-
-The v1beta1 release uses "leases" instead of "configmapsleases" as the LeaderElectionResourceLock for all managers leader election including the core controllers, bootstrap and control plane kubeadm and the Docker provider.
-This has no user facing impact on brand-new clusters created as v1beta1.
-For Cluster API running clusters upgraded through clusterctl this should be ok given that we stop the old controllers.
-Users relying on custom upgrades procedures should ensure a migration to v1alpha4 (multilock "configmapsleases") first, which will acquire a leader lock on both resources. After that, they can proceed migrating to v1beta1 ("leases"). As an additional safety step, these users should ensure the old controllers are stopped before running the new ones with the new lock mechanism.
-Otherwise, your controller might end up with multiple running instances that each acquired leadership through different resource locks during upgrades and thus act on the same resources concurrently.
-
-
-[cluster-contract]: ./../cluster-infrastructure.md
-[machine-contract]: ./../machine-infrastructure.md
-[metadata-propagation]: ../../../developer/architecture/controllers/metadata-propagation.md
-[capv-ipam]: https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/pull/1210
diff --git a/docs/book/src/developer/providers/migrations/v1.0-to-v1.1.md b/docs/book/src/developer/providers/migrations/v1.0-to-v1.1.md
deleted file mode 100644
index e819afc8e052..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.0-to-v1.1.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Cluster API v1.0 compared to v1.1
-
-This document provides an overview over relevant changes between ClusterAPI v1.0 and v1.1 for
-maintainer of other providers and consumers of our Go API.
-
-## Minimum Go version
-
-* The Go version used by Cluster API is now Go 1.17+
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies
-are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/controller-runtime: v0.10.x => v0.11.x
-- k8s.io/*: v0.22.x => v0.23.x (derived from controller-runtime)
-- github.com/go-logr/logr: v0.4.0 => v1.2.0 (derived from controller-runtime)
-- k8s.io/klog/v2: v2.9.0 => v2.30.0 (derived from controller-runtime)
-- sigs.k8s.io/controller-tools: v0.7.x => v0.8.x
-- sigs.k8s.io/kind: v0.11.x => v0.11.x
-
-## Changes by Kind
-
-### Deprecation
-
-* The Cluster and ClusterClass webhooks have been moved to the `webhooks` package. Thus, the following methods on `Cluster` and `ClusterClass`
- in `api/v1beta1` are deprecated: `SetupWebhookWithManager`, `Default`, `ValidateCreate`, `ValidateUpdate` and `ValidateDelete`.
-* The `third_party/kubernetes-drain` package is deprecated, as we're now using `k8s.io/kubectl/pkg/drain` instead ([PR](https://github.com/kubernetes-sigs/cluster-api/pull/5440)).
-* `util/version.CompareWithBuildIdentifiers` has been deprecated, please use `util/version.Compare(a, b, WithBuildTags())` instead.
-* The functions `annotations.HasPausedAnnotation` and `annotations.HasSkipRemediationAnnotation` have been deprecated, please use
- `annotations.HasPaused` and `annotations.HasSkipRemediation` respectively instead.
-
-### Removals
-
-* `KCPUpgradeSpec` has been removed. Please use `ClusterUpgradeConformanceSpec` instead.
-
-### API Change
-
-* Some controllers have been moved to internal to reduce their API surface. We now only
- surface what is necessary, e.g. the reconciler and the `SetupWithManager` func:
- * [bootstrap/kubeadm/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5493)
- * controllers [part1](https://github.com/kubernetes-sigs/cluster-api/pull/5899) [part2](https://github.com/kubernetes-sigs/cluster-api/pull/5913) [part3](https://github.com/kubernetes-sigs/cluster-api/pull/5917)
- * [controlplane/kubeadm/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5929)
- * [exp/addons/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5639)
- * [test/infrastructure/docker/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5595)
- * [test/infrastructure/docker/exp/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5690)
- * [exp/controllers](https://github.com/kubernetes-sigs/cluster-api/pull/5651)
-
-* Following packages have been moved to internal
- * [/test/infrastructure/docker/cloudinit](https://github.com/kubernetes-sigs/cluster-api/pull/5795)
- * [/test/infrastructure/docker/docker](https://github.com/kubernetes-sigs/cluster-api/pull/5795)
- * [/test/infrastructure/docker/third_party](https://github.com/kubernetes-sigs/cluster-api/pull/5795)
- * [/test/infrastructure/docker/exp/docker](https://github.com/kubernetes-sigs/cluster-api/pull/5795)
-
-### Other
-
-* ClusterClass:
- * `clusterctl` is now able to handle cluster templates with ClusterClasses ([PR](https://github.com/kubernetes-sigs/cluster-api/pull/5351)).
- Please check out the corresponding documentation in [clusterctl provider contract](../../../clusterctl/provider-contract.md#clusterclass-definitions)
- If you have any further questions about writing ClusterClasses, please let us know.
- * e2e tests:
- * `QuickStartSpec` is now able to test clusters using ClusterClass. Please see this [PR](https://github.com/kubernetes-sigs/cluster-api/pull/5423) for an example on how to use it.
- * `SelfHostedSpec` is now able to test clusters using ClusterClass. Please see this [PR](https://github.com/kubernetes-sigs/cluster-api/pull/5600) for an example on how to use it.
-* Test framework provides better logging in case of failures when creating the bootstrap kind cluster; in order to
- fully exploit this feature, it is required to pass the `LogFolder` parameter when calling `CreateKindBootstrapClusterAndLoadImages`. Please see this [PR](https://github.com/kubernetes-sigs/cluster-api/pull/5910) for an example on how to use it.
-* The `gci` linter has been enabled to enforce consistent imports. As usual, feel free to take a look at our linter config, but of course it's not mandatory to adopt it.
-* The Tilt dev setup has been extended with:
- * [an option to deploy Grafana, Loki and Promtail](https://github.com/kubernetes-sigs/cluster-api/pull/5336)
- * [options to ease debugging of controllers (delve, profiler, metrics)](https://github.com/kubernetes-sigs/cluster-api/pull/5485)
diff --git a/docs/book/src/developer/providers/migrations/v1.1-to-v1.2.md b/docs/book/src/developer/providers/migrations/v1.1-to-v1.2.md
deleted file mode 100644
index 05675c70d6fa..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.1-to-v1.2.md
+++ /dev/null
@@ -1,206 +0,0 @@
-# Cluster API v1.1 compared to v1.2
-
-This document provides an overview over relevant changes between ClusterAPI v1.1 and v1.2 for
-maintainers of providers and consumers of our Go API.
-
-## Minimum Kubernetes version for the management cluster
-
-* The minimum Kubernetes version that can be used for a management cluster is now 1.20.0
-* The minimum Kubernetes version that can be used for a management cluster with ClusterClass is now 1.22.0
-
-NOTE: compliance with minimum Kubernetes version is enforced both by clusterctl and when the CAPI controller starts.
-
-## Minimum Go version
-
-* The Go version used by Cluster API is now Go 1.18.x
- * If you are using the gcb-docker-gcloud image in cloudbuild, bump to an image which is using
- Go 1.18, e.g.: `gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20220609-2e4c91eb7e`.
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies
-in ClusterAPI are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/controller-runtime: v0.11.x => v0.12.3
-- sigs.k8s.io/controller-tools: v0.8.x => v0.9.x
-- sigs.k8s.io/kind: v0.11.x => v0.14.x
-- k8s.io/*: v0.23.x => v0.24.x (derived from controller-runtime)
-- github.com/onsi/gomega: v0.17.0 => v0.18.1 (derived from controller-runtime)
-- k8s.io/kubectl: v0.23.5 => 0.24.0
-
-## Changes by Kind
-
-### Deprecation
-
-* `util.MachinesByCreationTimestamp` has been deprecated and will be removed in a future release.
-* the `topology.cluster.x-k8s.io/managed-field-paths` annotation has been deprecated and will be removed in a future release.
-* the `experimentalRetryJoin` field in the KubeadmConfig and, as they compose the same types, KubeadmConfigTemplate, KubeadmControlPlane and KubeadmControlPlaneTemplate, has been deprecated and will be removed in a future release.
-*
-### Removals
-* The `third_party/kubernetes-drain` package has been removed, as we're now using `k8s.io/kubectl/pkg/drain` instead ([PR](https://github.com/kubernetes-sigs/cluster-api/pull/5440)).
-* `util/version.CompareWithBuildIdentifiers` has been removed, please use `util/version.Compare(a, b, WithBuildTags())` instead.
-* The functions `annotations.HasPausedAnnotation` and `annotations.HasSkipRemediationAnnotation` have been removed, please use
- `annotations.HasPaused` and `annotations.HasSkipRemediation` respectively instead.
-* `ObjectMeta.ClusterName` has been removed from `k8s.io/apimachinery/pkg/apis/meta/v1`.
-
-### golang API Changes
-
-- `util.ClusterToInfrastructureMapFuncWithExternallyManagedCheck` was removed and the externally managed check was added to `util.ClusterToInfrastructureMapFunc`, which required changing its signature.
- Users of the former simply need to start using the latter and users of the latter need to add the new arguments to their call.
-- `conditions.NewPatch` from the "sigs.k8s.io/cluster-api/util/conditions" package has had its return type modified. Previously the function returned `Patch`. It now returns `(Patch, error)`. Users of `NewPatch` need to be update usages to handle the error.
-
-### Required API Changes for providers
-
-- ClusterClass and managed topologies are now using [Server Side Apply](https://kubernetes.io/docs/reference/using-api/server-side-apply/)
- to properly manage other controllers like CAPA/CAPZ coauthoring slices, see [#6320](https://github.com/kubernetes-sigs/cluster-api/issues/6320).
- In order to take advantage of this feature providers are required to add marker to their API types as described in
- [merge-strategy](https://kubernetes.io/docs/reference/using-api/server-side-apply/#merge-strategy).
- NOTE: the change will cause a rollout on existing clusters created with ClusterClass
-
- E.g. in CAPA
-
- ```go
- // +optional
- Subnets Subnets `json:"subnets,omitempty"
- ```
- Must be modified into:
-
- ```go
- // +optional
- // +listType=map
- // +listMapKey=id
- Subnets Subnets `json:"subnets,omitempty"
- ```
-
-- [Server Side Apply](https://kubernetes.io/docs/reference/using-api/server-side-apply/) implementation in ClusterClass and managed topologies
- requires to dry-run changes on templates. If infrastructure or bootstrap providers have implemented immutability checks
- in their InfrastructureMachineTemplate or BootstrapConfigTemplate webhooks,
- it is required to implement the following changes in order to prevent dry-run to return errors.
- The implementation requires `sigs.k8s.io/controller-runtime` in version `>= v0.12.3`.
-
- E.g. in CAPD following changes should be applied to the DockerMachineTemplate webhook:
-
- ```diff
- + type DockerMachineTemplateWebhook struct{}
-
- + func (m *DockerMachineTemplateWebhook) SetupWebhookWithManager(mgr ctrl.Manager) error {
- - func (m *DockerMachineTemplate) SetupWebhookWithManager(mgr ctrl.Manager) error {
- return ctrl.NewWebhookManagedBy(mgr).
- - For(m).
- + For(&DockerMachineTemplate{}).
- + WithValidator(m).
- Complete()
- }
-
- // +kubebuilder:webhook:verbs=create;update,path=/validate-infrastructure-cluster-x-k8s-io-v1beta1-dockermachinetemplate,mutating=false,failurePolicy=fail,matchPolicy=Equivalent,groups=infrastructure.cluster.x-k8s.io,resources=dockermachinetemplates,versions=v1beta1,name=validation.dockermachinetemplate.infrastructure.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1
-
- + var _ webhook.CustomValidator = &DockerMachineTemplateWebhook{}
- - var _ webhook.Validator = &DockerMachineTemplate{}
-
- + func (*DockerMachineTemplateWebhook) ValidateCreate(ctx context.Context, _ runtime.Object) error {
- - func (m *DockerMachineTemplate) ValidateCreate() error {
- ...
- }
-
- + func (*DockerMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldRaw runtime.Object, newRaw runtime.Object) error {
- + newObj, ok := newRaw.(*DockerMachineTemplate)
- + if !ok {
- + return apierrors.NewBadRequest(fmt.Sprintf("expected a DockerMachineTemplate but got a %T", newRaw))
- + }
- - func (m *DockerMachineTemplate) ValidateUpdate(oldRaw runtime.Object) error {
- oldObj, ok := oldRaw.(*DockerMachineTemplate)
- if !ok {
- return apierrors.NewBadRequest(fmt.Sprintf("expected a DockerMachineTemplate but got a %T", oldRaw))
- }
- + req, err := admission.RequestFromContext(ctx)
- + if err != nil {
- + return apierrors.NewBadRequest(fmt.Sprintf("expected a admission.Request inside context: %v", err))
- + }
- ...
- // Immutability check
- + if !topology.ShouldSkipImmutabilityChecks(req, newObj) &&
- + !reflect.DeepEqual(newObj.Spec.Template.Spec, oldObj.Spec.Template.Spec) {
- - if !reflect.DeepEqual(m.Spec.Template.Spec, old.Spec.Template.Spec) {
- allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "template", "spec"), m, dockerMachineTemplateImmutableMsg))
- }
- ...
- }
-
- + func (*DockerMachineTemplateWebhook) ValidateDelete(ctx context.Context, _ runtime.Object) error {
- - func (m *DockerMachineTemplate) ValidateDelete() error {
- ...
- }
- ```
-
-NOTES:
-- We are introducing a `DockerMachineTemplateWebhook` struct because we are going to use a controller runtime
- `CustomValidator`. This will allow to skip the immutability check only when the topology controller is dry running
- while preserving the validation behaviour for all other cases.
-- By using `CustomValidators` it is possible to move webhooks to other packages, thus removing some controller
- runtime dependency from the API types. However, choosing to do so or not is up to the provider implementers
- and independent of this change.
-
-### Other
-
-- Logging:
- - To align with the upstream Kubernetes community CAPI now configures logging via `component-base/logs`.
- This provides advantages like support for the JSON logging format (via `--logging-format=json`) and automatic
- deprecation of klog flags aligned to the upstream Kubernetes deprecation period.
-
- View main.go
diff
-
- ```diff
- import (
- ...
- + "k8s.io/component-base/logs"
- + _ "k8s.io/component-base/logs/json/register"
- )
-
- var (
- ...
- + logOptions = logs.NewOptions()
- )
-
- func init() {
- - klog.InitFlags(nil)
-
- func InitFlags(fs *pflag.FlagSet) {
- + logs.AddFlags(fs, logs.SkipLoggingConfigurationFlags())
- + logOptions.AddFlags(fs)
-
- func main() {
- ...
- pflag.Parse()
-
- + if err := logOptions.ValidateAndApply(); err != nil {
- + setupLog.Error(err, "unable to start manager")
- + os.Exit(1)
- + }
- +
- + // klog.Background will automatically use the right logger.
- + ctrl.SetLogger(klog.Background())
- - ctrl.SetLogger(klogr.New())
- ```
-
-
- This change has been introduced in CAPI in the following PRs: [#6072](https://github.com/kubernetes-sigs/cluster-api/pull/6072), [#6190](https://github.com/kubernetes-sigs/cluster-api/pull/6190), [#6602](https://github.com/kubernetes-sigs/cluster-api/pull/6602).
- **Note**: This change is not mandatory for providers, but highly recommended.
-
-- Following E2E framework functions are now checking that machines are created in the expected failure domain (if defined);
- all E2E tests can now verify failure domains too.
- - `ApplyClusterTemplateAndWait`
- - `WaitForControlPlaneAndMachinesReady`
- - `DiscoveryAndWaitForMachineDeployments`
-- The `AssertControlPlaneFailureDomains` function in the E2E test framework has been modified to allow proper failure domain testing.
-
-- After investigating an [issue](https://github.com/kubernetes-sigs/cluster-api/issues/6006) we discovered that improper implementation of a check on `cluster.status.infrastructureReady` can lead to problems during cluster deletion. As a consequence, we recommend that all providers ensure:
- - The check for `cluster.status.infrastructureReady=true` usually existing at the beginning of the reconcile loop for control-plane providers is implemented after setting external objects ref;
- - The check for `cluster.status.infrastructureReady=true` usually existing at the beginning of the reconcile loop for infrastructure provider does not prevent the object to be deleted
-rif. [PR #6183](https://github.com/kubernetes-sigs/cluster-api/pull/6183)
-
-- CAPI added support for the new control plane label and taint introduced by v1.24 with [PR#5919](https://github.com/kubernetes-sigs/cluster-api/pull/5919).
- Providers should tolerate _both_ `control-plane` and `master` taints for compatibility with v1.24 control planes.
- Further, if they use the label in their `manager.yaml`, it should be adjusted since v1.24 only adds the `node-role.kubernetes.io/control-plane` label.
- An example of such an accommodation can be seen in the capi-provider-aws [manager.yaml][aws-manager-yaml-a69181]
-
-[aws-manager-yaml-a69181]: https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/a691817f0ea6e8e6624e3c748b33d0058c061fd7/config/manager/manager.yaml?rgh-link-date=2022-02-17T20%3A09%3A43Z#L52
\ No newline at end of file
diff --git a/docs/book/src/developer/providers/migrations/v1.2-to-v1.3.md b/docs/book/src/developer/providers/migrations/v1.2-to-v1.3.md
deleted file mode 100644
index a6a0242b0d8d..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.2-to-v1.3.md
+++ /dev/null
@@ -1,77 +0,0 @@
-# Cluster API v1.2 compared to v1.3
-
-This document provides an overview over relevant changes between Cluster API v1.2 and v1.3 for
-maintainers of providers and consumers of our Go API.
-
-## Minimum Go version
-
-* The Go version used by Cluster API is Go 1.19.x
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies
-in Cluster API are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/controller-runtime: v0.12.x => v0.13.x
-- sigs.k8s.io/controller-tools: v0.9.x => v0.10.x
-- sigs.k8s.io/kind: v0.14.x => v0.18.x
-- k8s.io/*: v0.24.x => v0.25.x (derived from controller-runtime)
-- github.com/onsi/ginkgo: v1.x => v2.x (derived from controller-runtime)
-- k8s.io/kubectl: v0.24.x => 0.25.x
-- github.com/joelanford/go-apidiff: 0.4.0 => 0.5.0
-
-## Changes by Kind
-
-### Deprecation
-
-- `sigs.k8s.io/cluster-api/controllers/external.CloneTemplate` has been deprecated and will be removed in a future release. Please use `sigs.k8s.io/cluster-api/controllers/external.CreateFromTemplate` instead.
-- `clusterctl init --list-images` has been deprecated and will be removed in a future release. Please use `clusterctl init list-images` instead.
-- `clusterctl backup` has been deprecated. Please use `clusterctl move --to-directory` instead.
-- `clusterctl restore` has been deprecated. Please use `clusterctl move --from-directory` instead.
-- `Client` deprecates `Backup` and `Restore`. Please use `Move`.
-- `ObjectMover` deprecates `Backup` and `Restore`. Adds replacements functions `ToDirectory` and `FromDirectory`.
-
-### Removals
-
-- `MachinesByCreationTimestamp` type has been removed.
-- `ClusterCacheReconciler.Log` has been removed. Use the logger from the context instead.
-
-### API Changes
-
-- A new timeout `nodeVolumeDetachTimeout` has been introduced that defines how long the controller will spend on waiting for all volumes to be detached.
-The default value is 0, meaning that the volume can be detached without any time limitations.
-- A new annotation `machine.cluster.x-k8s.io/exclude-wait-for-node-volume-detach` has been introduced that allows explicitly skip the waiting for node volume detaching.
-- A new annotation `"cluster.x-k8s.io/replicas-managed-by"` has been introduced to indicate that a MachinePool's replica enforcement is delegated to an external autoscaler (not managed by Cluster API). For more information see the documentation [here](../../architecture/controllers/machine-pool.md#externally-managed-autoscaler).
-- The `Path` func in the `sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository.Overrider` interface has been adjusted to also return an error.
-
-### Other
-
-- clusterctl now emits a warning for provider CRDs which don't comply with the CRD naming conventions. This warning can be skipped for resources not referenced by Cluster API
- core resources via the `clusterctl.cluster.x-k8s.io/skip-crd-name-preflight-check` annotation. The contracts specify:
- > The CRD name must have the format produced by sigs.k8s.io/cluster-api/util/contract.CalculateCRDName(Group, Kind)
-- The Kubernetes default registry has been changed from `k8s.gcr.io` to `registry.k8s.io`. Kubernetes image promotion currently publishes to both registries. Please
- consider publishing manifests which reference the controller images from the new registry (for reference [Cluster API PR](https://github.com/kubernetes-sigs/cluster-api/pull/7478)).
-- e2e tests are upgraded to use Ginkgo v2 (v2.5.0) and Gomega v1.22.1. Providers who use the test framework from this release will also need to upgrade, because Ginkgo v2 can't be imported alongside v1. Please see the [Ginkgo upgrade guide](https://onsi.github.io/ginkgo/MIGRATING_TO_V2), and note:
- * the default test timeout has been [changed to 1h](https://onsi.github.io/ginkgo/MIGRATING_TO_V2#timeout-behavior)
- * the `--junit-report` argument [replaces JUnit custom reporter](https://onsi.github.io/ginkgo/MIGRATING_TO_V2#improved-reporting-infrastructure) code
- * see the ["Update tests to Ginkgo v2" PR](https://github.com/kubernetes-sigs/cluster-api/pull/6906) for a reference example
-- Cluster API introduced new [logging guidelines](../../../developer/logging.md). All reconcilers in the core repository were updated
- to [log the entire object hierarchy](../../../developer/logging.md#keyvalue-pairs). It would be great if providers would be adjusted
- as well to make it possible to cross-reference log entries across providers (please see CAPD for an infra provider reference implementation).
-- The `CreateLogFile` function and `CreateLogFileInput` struct in the E2E test framework for clusterctl has been renamed to `OpenLogFile` and `OpenLogFileInput` because the function will now append to the logfile instead of truncating the content.
-- The `Move` function in E2E test framework for clusterctl has been modified to:
- * print the `clusterctl move` command including the arguments similar to `Init`.
- * log the output to the a `clusterctl-move.log` file at the subdirectory `logs/`.
-- The self-hosted upgrade test now also upgrades the self-hosted cluster's Kubernetes version by default. For that it requires the following variables to be set:
- * `KUBERNETES_VERSION_UPGRADE_FROM`
- * `KUBERNETES_VERSION_UPGRADE_TO`
- * `ETCD_VERSION_UPGRADE_TO`
- * `COREDNS_VERSION_UPGRADE_TO`
- The variable `SkipUpgrade` could be set to revert to the old behaviour by making use of the `KUBERNETES_VERSION` variable and skipping the Kubernetes upgrade.
-- cert-manager upgraded from v1.9.1 to v1.10.1.
-- Machine `providerID` is now being strictly checked for equality when compared against Kubernetes node `providerID` data. This is the expected criteria for correlating a Cluster API machine to its corresponding Kubernetes node, but historically this comparison was not strict, and instead compared only against the `ID` substring part of the full `providerID` string. Because different providers construct `providerID` strings differently, the `ID` substring is not uniformly defined and implemented across providers, and thus the existing `providerID` equality cannot guarantee the correct Machine-Node correlation. It is very unlikely that this new behavior will break existing providers, but FYI: if strict `providerID` equality will degrade expected behaviors, you may need to update your provider implementation prior to adopting Cluster API v1.3.
-- The default minimum TLS version in use by the webhook servers is 1.2.
-- OwnerReferences are now more strictly enforced for objects managed by Cluster API. Machines, Bootstrap configs, Infrastructure Machines and Secrets created by CAPI components [now have strictly enforced controller owner references](https://github.com/kubernetes-sigs/cluster-api/issues/7575). This is not expected to require changes for providers.
-
-### Suggested changes for providers
-- Provider can expose the configuration of the TLS Options for the webhook server; it is recommended to use utility functions under the `util/flags` package to ensure consistency across CAPI and other providers.
diff --git a/docs/book/src/developer/providers/migrations/v1.3-to-v1.4.md b/docs/book/src/developer/providers/migrations/v1.3-to-v1.4.md
deleted file mode 100644
index d8cac2e5b45b..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.3-to-v1.4.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# Cluster API v1.3 compared to v1.4
-
-This document provides an overview over relevant changes between Cluster API v1.3 and v1.4 for
-maintainers of providers and consumers of our Go API.
-
-## Minimum Go version
-
-- The Go version used by Cluster API is still Go 1.19.x
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies in Cluster API are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/kind: v0.17.x => v0.18.x
-- sigs.k8s.io/controller-runtime: v0.13.x => v0.14.x
-- sigs.k8s.io/controller-tools: v0.10.x => v0.11.x
-- github.com/joelanford/go-apidiff: 0.5.0 => 0.6.0
-
-## Changes by Kind
-
-### Deprecation
-
-- The api versions `v1alpha3` and `v1alpha4` are deprecated and will be removed.
- - `v1alpha3` will be removed in v1.5
- - `v1alpha4` will be removed in v1.6
-
- For more information please see [the note in the contributors guide](../../../CONTRIBUTING.md#removal-of-v1alpha3--v1alpha4-apiversions).
-
-### Removals
-
-- `util/conversion.GetCRDWithContract` has been removed.
-- `clusterctl backup` has been removed.
-- `clusterctl restore` has been removed.
-- `api/v1beta1.MachineHealthCheckSuccededCondition` condition type has been removed.
-- `controller/external/util.CloneTemplate` and `controllers/external/util.CloneTemplateInput` has been removed.
-- The option `--list-images` from `clusterctl init` subcommand has been removed.
-- `exp/runtime/server.NewServer` has been removed.
-- `--disable-no-echo` option from `clusterctl describe cluster` subcommand has been removed
-- `api/v1beta1.ClusterTopologyManagedFieldsAnnotation` field has been removed.
-- `api/v1beta1.PopulateDefaultsMachineDeployment` func has been removed.
-
-### API Changes
-
-- `util/conversion.UpdateReferenceAPIContract` dropped the `APIReader` parameter because it's not required anymore as we now only handle CRDs with compliant names.
-- `Backup(options BackupOptions) error` in the Client interface has been removed.
-- `Restore(options RestoreOptions) error` in the Client interface has been removed.
-- `cmd/clusterctl/client.RolloutOptions` has been removed, `RolloutRestartOptions`, `RolloutPauseOptions` , `RolloutResumeOptions`, and `RolloutUndoOptions` have been added instead.
-- Annotation constant `DisableMachineCreate` has been updated to `DisableMachineCreateAnnotation`
-- Below Label constant have been updated
- - `ClusterLabelName` to `ClusterNameLabel`
- - `ClusterTopologyMachineDeploymentLabelName` to `ClusterTopologyMachineDeploymentNameLabel`
- - `ProviderLabelName` to `ProviderNameLabel`
- - `MachineControlPlaneLabelName` to `MachineControlPlaneLabel`
- - `MachineSetLabelName` to `MachineSetNameLabel`
- - `MachineDeploymentLabelName` to `MachineDeploymentNameLabel`
-- Below Condition and Reason constants have been updated
- - `ExternalRemediationTemplateAvailable` to `ExternalRemediationTemplateAvailableCondition`
- - `ExternalRemediationTemplateNotFound` to `ExternalRemediationTemplateNotFoundReason`
- - `ExternalRemediationRequestAvailable` to `ExternalRemediationRequestAvailableCondition`
- - `ExternalRemediationRequestCreationFailed` to `ExternalRemediationRequestCreationFailedReason`
-- `api/v1beta1.MachineDeployment.Default` func has been replaced through `api/v1beta1.MachineDeploymentDefaulter`
-
-### Other
-
-- clusterctl now emits an error for provider CRDs which don't comply with the CRD naming conventions. This warning can be skipped for resources not referenced by Cluster API
- core resources via the `clusterctl.cluster.x-k8s.io/skip-crd-name-preflight-check` annotation. The contracts specify:
- > The CRD name must have the format produced by sigs.k8s.io/cluster-api/util/contract.CalculateCRDName(Group, Kind)
-- `clusterctl upgrade apply` no longer requires a namespace when updating providers. It is now optional and in a future release it will be deprecated. The new syntax is `[namespace/]provider:version`.
-- `WatchDeploymentLogs` is changed to `WatchDeploymentLogsByName`, it works same as before. Another function `WatchDeploymentLogsByLabelSelector` is added to stream logs of deployment by label selector.
-- Cluster API controllers are now using an explicit security context by default.
-- It is recommended to drop usages of `logs.AddFlags(fs, logs.SkipLoggingConfigurationFlags())`. It was previously used to configure deprecated logging flags, but with the bump to component-base
- `v0.26.0` this function is not configuring any flags anymore.
- Please note that the following logging flags have been removed: (in `component-base`, but this affects all CAPI controllers): `--add-dir-header`, `--alsologtostderr`, `--log-backtrace-at`,
- `--log-dir`, `--log-file`, `--log-file-max-size`, `--logtostderr`, `--one-output`, `--skip-headers`, `--skip-log-headers` and `--stderrthreshold`.
- For more information, please see: https://github.com/kubernetes/enhancements/issues/2845
-- A new `KCPRemediationSpec` test has been added providing better test coverage for KCP remediation most common use cases. As a consequence `MachineRemediationSpec` has been renamed to `MachineDeploymentRemediationSpec` and now only tests remediation of worker machines (NOTE: we plan to improve this test as well in a future iteration).
-- Package `test/infrastructure/docker/internal/third_party/forked/loadbalancer` has been moved to `test/infrastructure/docker/internal/loadbalancer` to allow it to diverge from the upstream Kind package.
-
-### Suggested changes for providers
-
-- Providers should add an explicit security context to their controllers deployment, see [#7831](https://github.com/kubernetes-sigs/cluster-api/pull/7831) for reference.
diff --git a/docs/book/src/developer/providers/migrations/v1.4-to-v1.5.md b/docs/book/src/developer/providers/migrations/v1.4-to-v1.5.md
deleted file mode 100644
index 44b42de695e5..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.4-to-v1.5.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Cluster API v1.4 compared to v1.5
-
-This document provides an overview over relevant changes between Cluster API v1.4 and v1.5 for
-maintainers of providers and consumers of our Go API.
-
-## Go version
-
-- The Go version used by Cluster API is Go 1.20.x
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies in Cluster API are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/kind: v0.17.x => v0.20.x
-- sigs.k8s.io/controller-runtime: v0.14.x => v0.15.x
-- sigs.k8s.io/controller-tools: v0.11.x => v0.12.x
-
-## Changes by Kind
-
-### Deprecation
-
-- API version`v1alpha4` is deprecated and CAPI will stop serving this version in v1.6.
-- `sigs.k8s.io/cluster-api/controllers/remote.DefaultIndexex` has been deprecated and will be removed in a future release. Please use `sigs.k8s.io/cluster-api/controllers/external.NodeProviderIDIndex` instead. This index should not be used as a default index and should only be used if a controller is using `index.NodeProviderIDField`.
-
-### Removals
-
-- API version `v1alpha3` is not served in v1.5 (users can enable it manually in case they are lagging behind with deprecation cycles). Important: `v1alpha3` will be completely removed in 1.6.
-- The lazy restmapper feature gate was removed in controller-runtime and lazy restmapper is now the default restmapper. Accordingly the `EXP_LAZY_RESTMAPPER` feature gate was removed in Cluster API.
-
-### API Changes
-
-- InfrastructureMachinePools now include an optional status field for `infrastructureMachineKind`. This allows infrastructure providers to support MachinePool Machines by having the InfraMachinePool set the `infrastructureMachineKind` to the kind of their InfrastructureMachines. The InfrastructureMachinePool will be responsible for creating InfrastructureMachines as the MachinePool is scaled up, and the MachinePool controller will create Machines for each InfrastructureMachine and set the ownerRef. The InfrastructureMachinePool will be responsible for deleting the Machines as the MachinePool is scaled down in order for the Machine deletion workflow to function properly. In addition, the InfrastructureMachines must also have the following labels set by the InfrastructureMachinePool: `cluster.x-k8s.io/cluster-name` and `cluster.x-k8s.io/pool-name`. The `MachinePoolNameLabel` must also be formatted with `capilabels.MustFormatValue()` so that it will not exceed character limits. See the [MachinePool Machines proposal](https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20220209-machinepool-machines.md) for more details and the [CAPD implementation](https://github.com/kubernetes-sigs/cluster-api/pull/8842) for a reference.
-
-### Other
-
-- clusterctl move is adding the new annotation `clusterctl.cluster.x-k8s.io/delete-for-move` before object deletion.
-- Providers running CAPI release-0.3 clusterctl upgrade tests should set `WorkloadKubernetesVersion` field to the maximum workload cluster kubernetes version supported by the old providers in `ClusterctlUpgradeSpecInput`. For more information, please see: https://github.com/kubernetes-sigs/cluster-api/pull/8518#issuecomment-1508064859
-- Introduced function `CollectInfrastructureLogs` at the `ClusterLogCollector` interface in `test/framework/cluster_proxy.go` to allow collecting infrastructure related logs during tests.
-- A `GetTypedConfigOwner` function has been added to the `sigs.k8s.io./cluster-api/bootstrap/util` package. It is equivalent to `GetConfigOwner` except that it uses the cached typed client instead of the uncached unstructured client, so `GetTypedConfigOwner` is expected to be more performant.
-- `ClusterToObjectsMapper` in `sigs.k8s.io./cluster-api/util` has been deprecated, please use `ClusterToTypedObjectsMapper` instead.
-- The generated `kubeconfig` by the Control Plane providers must be labelled with the key-value pair `cluster.x-k8s.io/cluster-name=${CLUSTER_NAME}`.
- This is required for the CAPI managers caches to store and retrieve them for the required operations.
-- When using custom certificates, the certificates must be labeled with the key-value pair `cluster.x-k8s.io/cluster-name=${CLUSTER_NAME}`.
- This is required for the CAPI managers caches to store and retrieve them for the required operations.
-
-### Suggested changes for providers
-
--
-
-## Notes about the controller-runtime bump
-
-This section shares our learnings of bumping controller-runtime to v0.15 in core Cluster API. It highlights the most relevant changes and pitfalls
-for Cluster API providers. For the full list of changes please see the [controller-runtime release notes](https://github.com/kubernetes-sigs/controller-runtime/releases/tag/v0.15.0).
-
-* Webhooks can now also return warnings, this requires adding an additional `admission.Warnings` return parameter to all webhooks.
-* Manager options have been refactored and old fields have been deprecated.
-* Manager now has a builtin profiler server which can be enabled via `Options.PprofBindAddress`, this allows us to remove our profiler server.
-* Controller builder has been refactored, this requires small changes to our controller setup code.
-* The EventHandler interface has been modified to also take a context, which affects our mapping functions (e.g. `ClusterToInfrastructureMapFunc`).
-* Controller-runtime now uses a lazy restmapper per default, i.e. API groups and resources are only fetched when they are actually used.
- This should drastically reduce the amount of API calls in clusters with a lot of CRDs.
-* Some wait utils in `k8s.io/apimachinery/pkg/util/wait` have been deprecated. The migration is relatively straightforward except that passing in `0`
- as a timeout in `wait.PollUntilContextTimeout` is treated as a timeout with 0 seconds, in `wait.PollImmediateWithContext` it is interpreted as infinity.
-* The fake client has been improved to handle status properly. In tests that write the CRD status, the CRDs should be added to the fake client via `WithStatusSubresource`.
-* Ensure that the e2e test suite is setting a logger (e.g. via `ctrl.SetLogger(klog.Background())` in `TestE2E`. Otherwise logs are not visible and controller-runtime will print a warning.
-
-For reference, please see the [Bump to CR v0.15 PR](https://github.com/kubernetes-sigs/cluster-api/pull/8007) in core Cluster API.
diff --git a/docs/book/src/developer/providers/migrations/v1.5-to-v1.6.md b/docs/book/src/developer/providers/migrations/v1.5-to-v1.6.md
deleted file mode 100644
index 1ba084da9f94..000000000000
--- a/docs/book/src/developer/providers/migrations/v1.5-to-v1.6.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Cluster API v1.5 compared to v1.6
-
-This document provides an overview over relevant changes between Cluster API v1.5 and v1.6 for
-maintainers of providers and consumers of our Go API.
-
-## Go version
-
-- The Go version used by Cluster API is Go 1.20.x
-
-## Dependencies
-
-**Note**: Only the most relevant dependencies are listed, `k8s.io/` and `ginkgo`/`gomega` dependencies in Cluster API are kept in sync with the versions used by `sigs.k8s.io/controller-runtime`.
-
-- sigs.k8s.io/kind: v0.20.x
-- sigs.k8s.io/controller-runtime: v0.15.x => v0.16.x
-- sigs.k8s.io/controller-tools: v0.12.x
-
-## Changes by Kind
-- Introduced `v1beta1` for ipam.cluster.x-k8s.io IPAddresses and IPAddressClaims. Conversion webhooks handle translation between the hub version `v1beta1` and spoke `v1alpha1`.
-
-### Deprecation
-- The function `sigs.k8s.io/cluster-api/addons/api/v1beta1` `DeleteBinding` has been deprecated. Please use `RemoveBinding` from the same package instead.
--
-### Removals
-
-- API version `v1alpha4` is not served in v1.6 (users can enable it manually in case they are lagging behind with deprecation cycles). Important: `v1alpha4` will be completely removed in 1.7.
-- The function(s):
- - `ClusterToObjectsMapper` is removed, please use `ClusterToTypedObjectsMapper` function instead.
- - `Poll` and `PollImmediate` are removed, please use utils from "k8s.io/apimachinery/pkg/util/wait" instead.
-- The variable `DefaultIndexes` is removed, please use `[]Index{NodeProviderIDIndex}`
-- `ProviderID` type and all related methods/construct have been removed. Please see this [PR](https://github.com/kubernetes-sigs/cluster-api/pull/8577) for a reference.
-
-### API Changes
-- Several public functions in `cmd/clusterctl/` now require `context.Context` as the first parameter.
-
-### Other
-- `clusterctl move` can be blocked temporarily by a provider when an object to be moved is annotated with `clusterctl.cluster.x-k8s.io/block-move`.
-- `mdbook releaselink` has been changed to require a `repo` tag when used in markdown files for generating a book with `mdbook`.
-- `framework.DumpKubeSystemPodsForCluster` was renamed to `framework.DumpResourcesForCluster` to facilitate the gathering of additional workload cluster resources. Pods in all namespaces and Nodes are gathered from workload clusters. Pod yamls are available in `clusters/*/resources/Pod` and Node yaml is available in `clusters/*/resources/Node`.
-
-### Suggested changes for providers
-
-- In order to reduce dependencies for API package consumers, CAPI has diverged from the default kubebuilder scheme builder. This new pattern may also be useful for reducing dependencies in provider API packages. For more information [see the implementers guide.](../implementers-guide/create_api.md#registering-apis-in-the-scheme)
-- We deprecated the `--metrics-bind-addr` flag and introduced the new `--diagnostics-address` and `--insecure-diagnostic` flags. These flags allow exposing metrics, a pprof endpoint and
- an endpoint to change log levels securely in production. It is recommended to implement the same changes in providers, please see [#9264](https://github.com/kubernetes-sigs/cluster-api/pull/9264) for more details.
diff --git a/docs/book/src/developer/providers/version-migration.md b/docs/book/src/developer/providers/version-migration.md
index 6297363d7d4e..d932d1c0fe73 100644
--- a/docs/book/src/developer/providers/version-migration.md
+++ b/docs/book/src/developer/providers/version-migration.md
@@ -3,12 +3,8 @@
The following pages provide an overview of relevant changes between versions of Cluster API and their direct successors. These guides are intended to assist
maintainers of other providers and consumers of the Go API in upgrading from one version of Cluster API to a subsequent version.
-- [v0.3 to v0.4](migrations/v0.3-to-v0.4.md)
-- [v0.4 to v1.0](migrations/v0.4-to-v1.0.md)
-- [v1.0 to v1.1](migrations/v1.0-to-v1.1.md)
-- [v1.1 to v1.2](migrations/v1.1-to-v1.2.md)
-- [v1.2 to v1.3](migrations/v1.2-to-v1.3.md)
-- [v1.3 to v1.4](migrations/v1.3-to-v1.4.md)
-- [v1.4 to v1.5](migrations/v1.4-to-v1.5.md)
-- [v1.5 to v1.6](migrations/v1.5-to-v1.6.md)
- [v1.6 to v1.7](migrations/v1.6-to-v1.7.md)
+- [v1.7 to v1.8](migrations/v1.7-to-v1.8.md)
+- [v1.8 to v1.9](migrations/v1.7-to-v1.8.md)
+
+For older versions please refer to [Older Cluster API documentation versions](#clusterapi-documentation-versions)
diff --git a/docs/book/src/tasks/upgrading-cluster-api-versions.md b/docs/book/src/tasks/upgrading-cluster-api-versions.md
index 4fed3e94e2a8..5ebbbe28397d 100644
--- a/docs/book/src/tasks/upgrading-cluster-api-versions.md
+++ b/docs/book/src/tasks/upgrading-cluster-api-versions.md
@@ -15,10 +15,3 @@ Ensure that the version of Cluster API is compatible with the Kubernetes version
## Upgrading to newer versions of 1.0.x
Use [clusterctl to upgrade between versions of Cluster API 1.0.x](../clusterctl/commands/upgrade.md).
-
-
-
-[components]: ../reference/glossary.md#provider-components
-[management cluster]: ../reference/glossary.md#management-cluster
-[Cluster API v1alpha3 compared to v1alpha4 section]: ../developer/providers/migrations/v0.3-to-v0.4.md
-[Cluster API v1alpha4 compared to v1beta1 section]: ../developer/providers/migrations/v0.4-to-v1.0.md