Repository: kubermatic/machine-controller
Pull request #1336 (2022-06-24 10:34:36)

set --node-ip depending on external CCM availaibilty in dualstack 
**What this PR does / why we need it**:


`--node-ip` and `--cloud-provider` kubelet flags conflict in the dualstack setup.

 In general, it is not expected to need to use `--node-ip` with external CCMs, as the the cloud provider is expected to know the correct IPs to return.

This PR

```
|--------------+------------------------------+----------------------------|
|              | KKP support for external CCM | --node-ip set in dualstack |
|--------------+------------------------------+----------------------------|
| DigitalOcean | No                           | Yes                        |
| OpenStack    | Yes                          | No                         |
|--------------+------------------------------+----------------------------|
```


**Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>` format, will close the issue(s) when PR gets merged)*:
Fixes 
https://github.com/kubermatic/kubermatic/issues/10152 
https://github.com/kubermatic/kubermatic/issues/9959

**Optional Release Note**:
<!--
Write your release note:
1. Enter your extended release note in the below block. If the PR requires additional action from users switching to the new release, include the string "action required".
2. If no release note is required, just write "NONE".
-->
```release-note
NONE
```


kubermatic-bot: @PratikDeoghare: Adding the "do-not-merge/release-note-label-needed" label because no release-note block was detected, please follow our [release note process](https://git.k8s.io/community/contributors/guide/release-notes.md) to remove it.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
kubermatic-bot: Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with `/test all`
kubermatic-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubermatic/machine-controller/pull/1336#" title="Author self-approved">PratikDeoghare</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **ahmedwaleedmalik** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @ahmedwaleedmalik` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubermatic%2Fmachine-controller).

<details open>
Needs approval from an approver in each of these files:

- **[pkg/cloudprovider/provider/OWNERS](https://github.com/kubermatic/machine-controller/blob/master/pkg/cloudprovider/provider/OWNERS)**
- **[pkg/userdata/OWNERS](https://github.com/kubermatic/machine-controller/blob/master/pkg/userdata/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["ahmedwaleedmalik"]} -->
kubermatic-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubermatic/machine-controller/pull/1336#" title="Author self-approved">PratikDeoghare</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **moadqassem** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @moadqassem` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubermatic%2Fmachine-controller).

<details open>
Needs approval from an approver in each of these files:

- **[pkg/userdata/OWNERS](https://github.com/kubermatic/machine-controller/blob/master/pkg/userdata/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["moadqassem"]} -->
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`
pull-machine-controller-e2e-aws | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws/1541326793380728832) | true | `/test pull-machine-controller-e2e-aws`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`
pull-machine-controller-e2e-aws | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws/1541326793380728832) | true | `/test pull-machine-controller-e2e-aws`
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`
pull-machine-controller-e2e-aws | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws/1541326793380728832) | true | `/test pull-machine-controller-e2e-aws`
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`
pull-machine-controller-e2e-aws | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws/1541326793380728832) | true | `/test pull-machine-controller-e2e-aws`
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-lint | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-lint/1541326804671795200) | true | `/test pull-machine-controller-lint`
pull-machine-controller-e2e-aws | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws/1541326793380728832) | true | `/test pull-machine-controller-e2e-aws`
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-aws-flatcar-containerd | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-flatcar-containerd/1541326793493975040) | true | `/test pull-machine-controller-e2e-aws-flatcar-containerd`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-hetzner | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541326797348540416) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541326802159407104) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-deployment-upgrade | a9dc5b05e7d90f8a59785429542fdd4541f6619c | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1541326793338785792) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541344427530784768) | true | `/test pull-machine-controller-e2e-aws-spot-instance`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541344427530784768) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541344427623059456) | true | `/test pull-machine-controller-e2e-azure`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541344428432560128) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541344427530784768) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541699601990422528) | true | `/test pull-machine-controller-e2e-azure`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541344430919782400) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541344427530784768) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541699601990422528) | true | `/test pull-machine-controller-e2e-azure`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541699602036559872) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541344427530784768) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541699601990422528) | true | `/test pull-machine-controller-e2e-azure`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541699602036559872) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541699602154000384) | true | `/test pull-machine-controller-e2e-hetzner`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541344429250449408) | true | `/test pull-machine-controller-e2e-digitalocean`
pull-machine-controller-e2e-vmware-cloud-director | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541344434250059776) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541699601990422528) | true | `/test pull-machine-controller-e2e-azure`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541699602036559872) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541699602154000384) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541699601948479488) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-gce | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-gce/1541699602120445952) | true | `/test pull-machine-controller-e2e-gce`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-openstack | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack/1541344432576532480) | true | `/test pull-machine-controller-e2e-openstack`
pull-machine-controller-e2e-vsphere | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541344435088920576) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-e2e-azure | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1541699601990422528) | true | `/test pull-machine-controller-e2e-azure`
pull-machine-controller-e2e-azure-custom-image-reference | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure-custom-image-reference/1541699602036559872) | true | `/test pull-machine-controller-e2e-azure-custom-image-reference`
pull-machine-controller-e2e-hetzner | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-hetzner/1541699602154000384) | true | `/test pull-machine-controller-e2e-hetzner`
pull-machine-controller-e2e-aws-spot-instance | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1541699601948479488) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-e2e-gce | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-gce/1541699602120445952) | true | `/test pull-machine-controller-e2e-gce`
pull-machine-controller-e2e-digitalocean | 0143f2969fd45bb035564fdfc8ebbe81ef8b5c8a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-digitalocean/1541699602074308608) | true | `/test pull-machine-controller-e2e-digitalocean`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubermatic/machine-controller/pull/1336#" title="Author self-approved">PratikDeoghare</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **moadqassem** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @moadqassem` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubermatic%2Fmachine-controller).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubermatic/machine-controller/blob/master/OWNERS)**
- **[pkg/userdata/OWNERS](https://github.com/kubermatic/machine-controller/blob/master/pkg/userdata/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["moadqassem"]} -->
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vmware-cloud-director | 3a2296062ae4dd42b47b8599673334e46f707e0a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541736923549143040) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /test pull-machine-controller-e2e-vmware-cloud-director
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vmware-cloud-director | 3a2296062ae4dd42b47b8599673334e46f707e0a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vmware-cloud-director/1541736923549143040) | true | `/test pull-machine-controller-e2e-vmware-cloud-director`
pull-machine-controller-e2e-vsphere | 3a2296062ae4dd42b47b8599673334e46f707e0a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541736924383809536) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | 3a2296062ae4dd42b47b8599673334e46f707e0a | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1541752341760315392) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /test pull-machine-controller-e2e-vsphere
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | ac8aa4c64d9a04f5048ecdbe7e5d5a11d592ad9d | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1542467946243166208) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | ac8aa4c64d9a04f5048ecdbe7e5d5a11d592ad9d | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1542482293195542528) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | ac8aa4c64d9a04f5048ecdbe7e5d5a11d592ad9d | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1542498070070038528) | true | `/test pull-machine-controller-e2e-vsphere`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-vsphere | ac8aa4c64d9a04f5048ecdbe7e5d5a11d592ad9d | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-vsphere/1542498070070038528) | true | `/test pull-machine-controller-e2e-vsphere`
pull-machine-controller-verify-boilerplate | 5d84c1db8a063bb80e71ccb5cadd2c7b5a25b7af | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-verify-boilerplate/1542772504060235776) | true | `/test pull-machine-controller-verify-boilerplate`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-openstack-project-auth | d2b4876ec5d4afd9617cbe3183e6285eadfdf45b | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack-project-auth/1542772845598216192) | true | `/test pull-machine-controller-e2e-openstack-project-auth`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-openstack-project-auth | d2b4876ec5d4afd9617cbe3183e6285eadfdf45b | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-openstack-project-auth/1542772845598216192) | true | `/test pull-machine-controller-e2e-openstack-project-auth`
pull-machine-controller-e2e-aws-spot-instance | d2b4876ec5d4afd9617cbe3183e6285eadfdf45b | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-aws-spot-instance/1542772837188636672) | true | `/test pull-machine-controller-e2e-aws-spot-instance`
pull-machine-controller-test | d2b4876ec5d4afd9617cbe3183e6285eadfdf45b | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-test/1542776731352436736) | true | `/test pull-machine-controller-test`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-test | d2b4876ec5d4afd9617cbe3183e6285eadfdf45b | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-test/1542781159115591680) | true | `/test pull-machine-controller-test`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-deployment-upgrade | 49ab93a4ac8bebf73b0c1e879218c4841c9908b4 | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1542838225607856128) | true | `/test pull-machine-controller-e2e-deployment-upgrade`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest
kubermatic-bot: @PratikDeoghare: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-machine-controller-e2e-deployment-upgrade | 49ab93a4ac8bebf73b0c1e879218c4841c9908b4 | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-deployment-upgrade/1542838225607856128) | true | `/test pull-machine-controller-e2e-deployment-upgrade`
pull-machine-controller-e2e-azure | 49ab93a4ac8bebf73b0c1e879218c4841c9908b4 | [link](https://public-prow.loodse.com/view/gs/prow-dev-public-data/pr-logs/pull/kubermatic_machine-controller/1336/pull-machine-controller-e2e-azure/1542838225683353600) | true | `/test pull-machine-controller-e2e-azure`

[Full PR test history](https://public-prow.loodse.com/pr-history?org=kubermatic&repo=machine-controller&pr=1336)

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
PratikDeoghare: /retest 

Patch:
diff --git a/.prow/postsubmits.yaml b/.prow/postsubmits.yaml
index f3e9361c..baba3fd9 100644
--- a/.prow/postsubmits.yaml
+++ b/.prow/postsubmits.yaml
@@ -26,7 +26,7 @@ postsubmits:
       preset-goproxy: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - /bin/bash
             - -c
@@ -54,7 +54,7 @@ postsubmits:
       preset-goproxy: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/upload-gocache.sh"
           resources:
diff --git a/.prow/provider-alibaba.yaml b/.prow/provider-alibaba.yaml
index da5dd7f8..e0cfc2ed 100644
--- a/.prow/provider-alibaba.yaml
+++ b/.prow/provider-alibaba.yaml
@@ -17,7 +17,6 @@ presubmits:
     optional: true
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     max_concurrency: 1
     labels:
@@ -30,7 +29,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -39,5 +38,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-anexia.yaml b/.prow/provider-anexia.yaml
index 50825a12..96a7ab09 100644
--- a/.prow/provider-anexia.yaml
+++ b/.prow/provider-anexia.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-anexia
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -28,7 +27,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -37,5 +36,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-aws.yaml b/.prow/provider-aws.yaml
index 83403112..2ea31d34 100644
--- a/.prow/provider-aws.yaml
+++ b/.prow/provider-aws.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-aws
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,13 +37,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 4Gi
-              cpu: 1
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-arm
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -56,7 +56,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -65,13 +65,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-ebs-encryption-enabled
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -83,7 +84,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -92,13 +93,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-flatcar-containerd
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -110,7 +112,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -119,13 +121,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-spot-instance
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -138,7 +141,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -147,13 +150,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-sles
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -165,7 +169,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -174,13 +178,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-flatcar-coreos-cloud-init
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -192,7 +197,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -201,13 +206,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-centos8
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -219,7 +225,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -228,13 +234,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-aws-assume-role
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws-assume-role: "true"
@@ -246,7 +253,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -255,5 +262,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-azure.yaml b/.prow/provider-azure.yaml
index d1e9f689..6bee8b9f 100644
--- a/.prow/provider-azure.yaml
+++ b/.prow/provider-azure.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-azure
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-azure: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,13 +37,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-azure-custom-image-reference
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-azure: "true"
@@ -57,7 +57,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -66,14 +66,15 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-azure-redhat-satellite
     optional: true
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-azure: "true"
@@ -86,7 +87,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -95,5 +96,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-digitalocean.yaml b/.prow/provider-digitalocean.yaml
index 7989696f..45f53e48 100644
--- a/.prow/provider-digitalocean.yaml
+++ b/.prow/provider-digitalocean.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-digitalocean
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-digitalocean: "true"
@@ -28,7 +27,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -37,5 +36,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-equinix-metal.yaml b/.prow/provider-equinix-metal.yaml
index 9754203b..4193213d 100644
--- a/.prow/provider-equinix-metal.yaml
+++ b/.prow/provider-equinix-metal.yaml
@@ -17,7 +17,6 @@ presubmits:
     optional: true
     run_if_changed: pkg\/cloudprovider\/provider\/equinixmetal\/.*
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,5 +37,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-gcp.yaml b/.prow/provider-gcp.yaml
index c2788019..d16d63ae 100644
--- a/.prow/provider-gcp.yaml
+++ b/.prow/provider-gcp.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-gce
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-gce: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,5 +37,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-hetzner.yaml b/.prow/provider-hetzner.yaml
index 6f52328b..493507ee 100644
--- a/.prow/provider-hetzner.yaml
+++ b/.prow/provider-hetzner.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-hetzner
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -27,7 +26,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -36,5 +35,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-kubevirt.yaml b/.prow/provider-kubevirt.yaml
index 477f9ada..29184045 100644
--- a/.prow/provider-kubevirt.yaml
+++ b/.prow/provider-kubevirt.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-kubevirt
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     max_concurrency: 1
     labels:
@@ -30,7 +29,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -39,5 +38,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-linode.yaml b/.prow/provider-linode.yaml
index f1b41666..2e3cf370 100644
--- a/.prow/provider-linode.yaml
+++ b/.prow/provider-linode.yaml
@@ -17,7 +17,6 @@ presubmits:
     always_run: false
     optional: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,5 +37,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-nutanix.yaml b/.prow/provider-nutanix.yaml
index 6b3c68fc..a1e28f26 100644
--- a/.prow/provider-nutanix.yaml
+++ b/.prow/provider-nutanix.yaml
@@ -19,7 +19,6 @@ presubmits:
     # TODO uncomment this when Nutanix is in a working condition
     #run_if_changed: "(pkg/cloudprovider/provider/nutanix/)"
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -31,7 +30,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -40,5 +39,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-openstack.yaml b/.prow/provider-openstack.yaml
index 7fec6859..a9205eeb 100644
--- a/.prow/provider-openstack.yaml
+++ b/.prow/provider-openstack.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-openstack
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-openstack: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,13 +37,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-openstack-project-auth
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-openstack: "true"
@@ -57,7 +57,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -66,5 +66,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-scaleway.yaml b/.prow/provider-scaleway.yaml
index 3fe04bfc..1a2f06e0 100644
--- a/.prow/provider-scaleway.yaml
+++ b/.prow/provider-scaleway.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-scaleway
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-scaleway: "true"
@@ -28,7 +27,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -37,5 +36,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-vmware-cloud-director.yaml b/.prow/provider-vmware-cloud-director.yaml
index 99704f8b..32052adc 100644
--- a/.prow/provider-vmware-cloud-director.yaml
+++ b/.prow/provider-vmware-cloud-director.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-vmware-cloud-director
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     run_if_changed: "(pkg/cloudprovider/provider/vmwareclouddirector/|pkg/userdata)"
     labels:
@@ -30,7 +29,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -39,5 +38,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/provider-vsphere.yaml b/.prow/provider-vsphere.yaml
index 10a9d9ed..ece98554 100644
--- a/.prow/provider-vsphere.yaml
+++ b/.prow/provider-vsphere.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-vsphere
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -29,7 +28,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -38,13 +37,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-vsphere-datastore-cluster
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-vsphere: "true"
@@ -57,7 +57,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -66,13 +66,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-vsphere-resource-pool
     always_run: false
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-vsphere: "true"
@@ -85,7 +86,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -94,5 +95,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/.prow/verify.yaml b/.prow/verify.yaml
index 66eca1e8..43de0856 100644
--- a/.prow/verify.yaml
+++ b/.prow/verify.yaml
@@ -29,7 +29,10 @@ presubmits:
             - all
           resources:
             requests:
-              cpu: 1
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-dependencies
     always_run: true
@@ -46,7 +49,11 @@ presubmits:
             - check-dependencies
           resources:
             requests:
-              cpu: 800m
+              memory: 32Mi
+              cpu: 50m
+            limits:
+              memory: 256Mi
+              cpu: 250m
 
   - name: pull-machine-controller-lint
     always_run: true
@@ -65,6 +72,8 @@ presubmits:
             requests:
               cpu: 800m
               memory: 6Gi
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-yamllint
     always_run: true
@@ -81,7 +90,11 @@ presubmits:
             - "yamllint -c .yamllint.conf ."
           resources:
             requests:
-              cpu: 200m
+              memory: 32Mi
+              cpu: 50m
+            limits:
+              memory: 256Mi
+              cpu: 250m
 
   - name: pre-machine-controller-verify-shfmt
     run_if_changed: "^hack/"
@@ -122,8 +135,11 @@ presubmits:
             - "./hack/verify-boilerplate.sh"
           resources:
             requests:
-              memory: 64Mi
-              cpu: 100m
+              memory: 32Mi
+              cpu: 50m
+            limits:
+              memory: 256Mi
+              cpu: 250m
 
   - name: pull-machine-controller-license-validation
     run_if_changed: "^go.(mod|sum)$"
@@ -138,8 +154,11 @@ presubmits:
             - ./hack/verify-licenses.sh
           resources:
             requests:
-              memory: 512Mi
-              cpu: 1
+              memory: 32Mi
+              cpu: 50m
+            limits:
+              memory: 256Mi
+              cpu: 250m
 
   - name: pull-machine-controller-test
     always_run: true
@@ -157,4 +176,7 @@ presubmits:
             - test-unit
           resources:
             requests:
-              cpu: 800m
+              cpu: 3
+              memory: 6Gi
+            limits:
+              memory: 6Gi
diff --git a/Dockerfile b/Dockerfile
index e21dccc3..1a835fe9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,7 +18,7 @@ WORKDIR /go/src/github.com/kubermatic/machine-controller
 COPY . .
 RUN make all
 
-FROM alpine:3.12
+FROM alpine:3.16
 
 RUN apk add --no-cache ca-certificates cdrkit
 
diff --git a/Makefile b/Makefile
index 71feb43f..bfb27d53 100644
--- a/Makefile
+++ b/Makefile
@@ -95,8 +95,7 @@ test-unit-docker:
 
 .PHONY: test-unit
 test-unit:
-	@#The `-race` flag requires CGO
-	CGO_ENABLED=1 go test -v -race ./...
+	go test -v ./...
 
 .PHONY: build-tests
 build-tests:
diff --git a/README.md b/README.md
index 9674c1d0..2627af99 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,6 @@ Currently supported K8S versions are:
 - 1.24
 - 1.23
 - 1.22
-- 1.21
 
 ## What does not work
 
diff --git a/hack/ci/download-gocache.sh b/hack/ci/download-gocache.sh
index 4f517807..650d6703 100755
--- a/hack/ci/download-gocache.sh
+++ b/hack/ci/download-gocache.sh
@@ -21,6 +21,8 @@ set -euo pipefail
 # receives a SIGINT
 set -o monitor
 
+source $(dirname $0)/../lib.sh
+
 # The gocache needs a matching go version to work, so append that to the name
 GO_VERSION="$(go version | awk '{ print $3 }' | sed 's/go//g')"
 
@@ -34,7 +36,7 @@ exit_gracefully() {
 trap exit_gracefully EXIT
 
 if [ -z "${GOCACHE_MINIO_ADDRESS:-}" ]; then
-  echo "env var GOCACHE_MINIO_ADDRESS unset, can not download gocache"
+  echodate "env var GOCACHE_MINIO_ADDRESS unset, cannot download gocache"
   exit 0
 fi
 
@@ -53,25 +55,40 @@ if [[ -z "${CACHE_VERSION}" ]]; then
   GIT_BRANCH="master"
 fi
 
-if [ -z "${PULL_NUMBER:-}" ]; then
-  # Special case: This is called in a Postubmit. Go one revision back,
-  # as there can't be a cache for the current revision
-  CACHE_VERSION="$(git rev-parse ${CACHE_VERSION}~1)"
-fi
-
 # normalize branch name to prevent accidental directories being created
 GIT_BRANCH="$(echo "$GIT_BRANCH" | sed 's#/#-#g')"
 
 ARCHIVE_NAME="${CACHE_VERSION}-${GO_VERSION}.tar"
 URL="${GOCACHE_MINIO_ADDRESS}/machine-controller/${GIT_BRANCH}/${ARCHIVE_NAME}"
 
-# Do not go through the retry loop when there is nothing
-if ! curl --head --silent --fail "${URL}" > /dev/null; then
-  echo "Remote has no gocache ${ARCHIVE_NAME}, exiting"
+# Do not go through the retry loop when there is nothing, but do try the
+# first few parents if no cache was found. This is helpful for retests happening
+# quickly after something got merged to master and no gocache for the most
+# recent commit exists yet. In this case, taking the previous commit's
+# cache is better than nothing. This also helps for postsubmits, where the current
+# commit (the one that got merged) cannot have a cache yet.
+HAS_CACHE=false
+for i in $(seq 1 5); do
+  # check if we have a cache for the given git revision
+  if curl --head --silent --fail "${URL}" > /dev/null; then
+    HAS_CACHE=true
+    break
+  fi
+  echodate "No gocache machine-controller/${GIT_BRANCH}/${ARCHIVE_NAME} available, trying previous commit as a fallback..."
+
+  CACHE_VERSION="$(git rev-parse ${CACHE_VERSION}~1)"
+  ARCHIVE_NAME="${CACHE_VERSION}-${GO_VERSION}.tar"
+  URL="${GOCACHE_MINIO_ADDRESS}/machine-controller/${GIT_BRANCH}/${ARCHIVE_NAME}"
+done
+if ! $HAS_CACHE; then
+  echodate "Could not find any suitable gocaches, giving up."
   exit 0
 fi
 
-echo "Downloading and extracting gocache"
-curl --fail --header "Content-Type: application/octet-stream" "${URL}" | tar -C $GOCACHE -xf -
-
-echo "Successfully fetched gocache into $GOCACHE"
+echodate "Downloading and extracting gocache"
+TEST_NAME="Download and extract gocache"
+# Passing the Headers as space-separated literals doesn't seem to work
+# in conjunction with the retry func, so we just put them in a file instead
+echo 'Content-Type: application/octet-stream' > /tmp/headers
+retry 5 curl --fail -H @/tmp/headers "${URL}" | tar -C $GOCACHE -xf -
+echodate "Successfully fetched gocache into $GOCACHE"
diff --git a/hack/ci/setup-kind-cluster.sh b/hack/ci/setup-kind-cluster.sh
index bd858776..d03becb3 100755
--- a/hack/ci/setup-kind-cluster.sh
+++ b/hack/ci/setup-kind-cluster.sh
@@ -191,7 +191,7 @@ if [ -z "${DISABLE_CLUSTER_EXPOSER:-}" ]; then
   TEST_NAME="Wait for cluster exposer"
   echodate "Waiting for cluster exposer to be running"
 
-  retry 5 curl -s --fail http://127.0.0.1:2047/metrics -o /dev/null
+  retry 10 curl -s --fail http://127.0.0.1:2047/metrics -o /dev/null
   echodate "Cluster exposer is running"
 
   echodate "Setting up iptables rules to make nodeports available"
diff --git a/hack/ci/upload-gocache.sh b/hack/ci/upload-gocache.sh
index 2ff04c5a..5db05684 100755
--- a/hack/ci/upload-gocache.sh
+++ b/hack/ci/upload-gocache.sh
@@ -55,7 +55,7 @@ ARCHIVE_FILE="/tmp/${GIT_HEAD_HASH}.tar"
 # No compression because that needs quite a bit of CPU
 tar -C "$GOCACHE" -cf "$ARCHIVE_FILE" .
 
-echo "Uploading gocache archive"
+echo "Uploading gocache archive machine-controller/${GIT_BRANCH}/${GIT_HEAD_HASH}-${GO_VERSION}.tar"
 curl \
   --fail \
   --upload-file "${ARCHIVE_FILE}" \
diff --git a/hack/run-machine-controller.sh b/hack/run-machine-controller.sh
index 69cc6812..192a52c4 100755
--- a/hack/run-machine-controller.sh
+++ b/hack/run-machine-controller.sh
@@ -29,7 +29,7 @@ $(dirname $0)/../machine-controller \
   -worker-count=50 \
   -logtostderr \
   -v=6 \
-  -cluster-dns=172.16.0.10 \
+  -cluster-dns=169.254.20.10 \
   -enable-profiling \
   -metrics-address=0.0.0.0:8080 \
   -health-probe-address=0.0.0.0:8085 \
diff --git a/pkg/cloudprovider/provider/azure/create_delete_resources.go b/pkg/cloudprovider/provider/azure/create_delete_resources.go
index 90ddce7e..68931e11 100644
--- a/pkg/cloudprovider/provider/azure/create_delete_resources.go
+++ b/pkg/cloudprovider/provider/azure/create_delete_resources.go
@@ -319,7 +319,7 @@ func getVirtualNetwork(ctx context.Context, c *config) (network.VirtualNetwork,
 	return virtualNetworksClient.Get(ctx, c.VNetResourceGroup, c.VNetName, "")
 }
 
-func createOrUpdateNetworkInterface(ctx context.Context, ifName string, machineUID types.UID, config *config, publicIP, publicIPv6 *network.PublicIPAddress, ipFamily util.IPFamily) (*network.Interface, error) {
+func createOrUpdateNetworkInterface(ctx context.Context, ifName string, machineUID types.UID, config *config, publicIP, publicIPv6 *network.PublicIPAddress, ipFamily util.IPFamily, enableAcceleratedNetworking *bool) (*network.Interface, error) {
 	ifClient, err := getInterfacesClient(config)
 	if err != nil {
 		return nil, fmt.Errorf("failed to create interfaces client: %w", err)
@@ -362,6 +362,8 @@ func createOrUpdateNetworkInterface(ctx context.Context, ifName string, machineU
 		})
 	}
 
+	ifSpec.InterfacePropertiesFormat.EnableAcceleratedNetworking = enableAcceleratedNetworking
+
 	if config.SecurityGroupName != "" {
 		authorizer, err := auth.NewClientCredentialsConfig(config.ClientID, config.ClientSecret, config.TenantID).Authorizer()
 		if err != nil {
diff --git a/pkg/cloudprovider/provider/azure/provider.go b/pkg/cloudprovider/provider/azure/provider.go
index b5b8e700..667c85fb 100644
--- a/pkg/cloudprovider/provider/azure/provider.go
+++ b/pkg/cloudprovider/provider/azure/provider.go
@@ -49,9 +49,10 @@ import (
 )
 
 const (
-	CapabilityPremiumIO = "PremiumIO"
-	CapabilityUltraSSD  = "UltraSSDAvailable"
-	CapabilityValueTrue = "True"
+	CapabilityPremiumIO             = "PremiumIO"
+	CapabilityUltraSSD              = "UltraSSDAvailable"
+	CapabilityValueTrue             = "True"
+	capabilityAcceleratedNetworking = "AcceleratedNetworkingEnabled"
 
 	machineUIDTag = "Machine-UID"
 
@@ -100,8 +101,9 @@ type config struct {
 	DataDiskSize int32
 	DataDiskSKU  *compute.StorageAccountTypes
 
-	AssignPublicIP bool
-	Tags           map[string]string
+	AssignPublicIP              bool
+	EnableAcceleratedNetworking *bool
+	Tags                        map[string]string
 }
 
 type azureVM struct {
@@ -316,6 +318,7 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*config, *p
 	}
 
 	c.AssignAvailabilitySet = rawCfg.AssignAvailabilitySet
+	c.EnableAcceleratedNetworking = rawCfg.EnableAcceleratedNetworking
 
 	c.AvailabilitySet, err = p.configVarResolver.GetConfigVarStringValue(rawCfg.AvailabilitySet)
 	if err != nil {
@@ -612,7 +615,7 @@ func (p *provider) Create(ctx context.Context, machine *clusterv1alpha1.Machine,
 		return nil, err
 	}
 
-	iface, err := createOrUpdateNetworkInterface(ctx, ifaceName(machine), machine.UID, config, publicIP, publicIPv6, ipFamily)
+	iface, err := createOrUpdateNetworkInterface(ctx, ifaceName(machine), machine.UID, config, publicIP, publicIPv6, ipFamily, config.EnableAcceleratedNetworking)
 	if err != nil {
 		return nil, fmt.Errorf("failed to generate main network interface: %w", err)
 	}
@@ -935,13 +938,8 @@ func (p *provider) GetCloudConfig(spec clusterv1alpha1.MachineSpec) (config stri
 	return s, "azure", nil
 }
 
-func validateDiskSKUs(ctx context.Context, c *config) error {
+func validateDiskSKUs(ctx context.Context, c *config, sku compute.ResourceSku) error {
 	if c.OSDiskSKU != nil || c.DataDiskSKU != nil {
-		sku, err := getSKU(ctx, c)
-		if err != nil {
-			return fmt.Errorf("failed to get VM SKU: %w", err)
-		}
-
 		if c.OSDiskSKU != nil {
 			if _, ok := osDiskSKUs[*c.OSDiskSKU]; !ok {
 				return fmt.Errorf("invalid OS disk SKU '%s'", *c.OSDiskSKU)
@@ -972,6 +970,15 @@ func validateDiskSKUs(ctx context.Context, c *config) error {
 	return nil
 }
 
+func validateSKUCapabilities(ctx context.Context, c *config, sku compute.ResourceSku) error {
+	if c.EnableAcceleratedNetworking != nil && *c.EnableAcceleratedNetworking {
+		if !SKUHasCapability(sku, capabilityAcceleratedNetworking) {
+			return fmt.Errorf("VM size %q does not support accelerated networking", c.VMSize)
+		}
+	}
+	return nil
+}
+
 func (p *provider) Validate(ctx context.Context, spec clusterv1alpha1.MachineSpec) error {
 	c, providerConfig, err := p.getConfig(spec.ProviderSpec)
 	if err != nil {
@@ -1039,10 +1046,19 @@ func (p *provider) Validate(ctx context.Context, spec clusterv1alpha1.MachineSpe
 		return fmt.Errorf("failed to get subnet: %w", err)
 	}
 
-	if err := validateDiskSKUs(ctx, c); err != nil {
+	sku, err := getSKU(ctx, c)
+	if err != nil {
+		return fmt.Errorf("failed to get VM SKU: %w", err)
+	}
+
+	if err := validateDiskSKUs(ctx, c, sku); err != nil {
 		return fmt.Errorf("failed to validate disk SKUs: %w", err)
 	}
 
+	if err := validateSKUCapabilities(ctx, c, sku); err != nil {
+		return fmt.Errorf("failed to validate SKU capabilities: %w", err)
+	}
+
 	_, err = getOSImageReference(c, providerConfig.OperatingSystem)
 	return err
 }
@@ -1092,7 +1108,7 @@ func (p *provider) MigrateUID(ctx context.Context, machine *clusterv1alpha1.Mach
 	}
 
 	if kuberneteshelper.HasFinalizer(machine, finalizerNIC) {
-		_, err = createOrUpdateNetworkInterface(ctx, ifaceName(machine), newUID, config, publicIP, publicIPv6, util.Unspecified)
+		_, err = createOrUpdateNetworkInterface(ctx, ifaceName(machine), newUID, config, publicIP, publicIPv6, util.Unspecified, config.EnableAcceleratedNetworking)
 		if err != nil {
 			return fmt.Errorf("failed to update UID on main network interface: %w", err)
 		}
@@ -1239,3 +1255,14 @@ func supportsDiskSKU(vmSKU compute.ResourceSku, diskSKU compute.StorageAccountTy
 
 	return nil
 }
+
+func SKUHasCapability(sku compute.ResourceSku, name string) bool {
+	if sku.Capabilities != nil {
+		for _, capability := range *sku.Capabilities {
+			if capability.Name != nil && *capability.Name == name && *capability.Value == CapabilityValueTrue {
+				return true
+			}
+		}
+	}
+	return false
+}
diff --git a/pkg/cloudprovider/provider/azure/types/types.go b/pkg/cloudprovider/provider/azure/types/types.go
index de6de216..f5705b60 100644
--- a/pkg/cloudprovider/provider/azure/types/types.go
+++ b/pkg/cloudprovider/provider/azure/types/types.go
@@ -28,20 +28,21 @@ type RawConfig struct {
 	ClientID       providerconfigtypes.ConfigVarString `json:"clientID,omitempty"`
 	ClientSecret   providerconfigtypes.ConfigVarString `json:"clientSecret,omitempty"`
 
-	Location              providerconfigtypes.ConfigVarString `json:"location"`
-	ResourceGroup         providerconfigtypes.ConfigVarString `json:"resourceGroup"`
-	VNetResourceGroup     providerconfigtypes.ConfigVarString `json:"vnetResourceGroup"`
-	VMSize                providerconfigtypes.ConfigVarString `json:"vmSize"`
-	VNetName              providerconfigtypes.ConfigVarString `json:"vnetName"`
-	SubnetName            providerconfigtypes.ConfigVarString `json:"subnetName"`
-	LoadBalancerSku       providerconfigtypes.ConfigVarString `json:"loadBalancerSku"`
-	RouteTableName        providerconfigtypes.ConfigVarString `json:"routeTableName"`
-	AvailabilitySet       providerconfigtypes.ConfigVarString `json:"availabilitySet"`
-	AssignAvailabilitySet *bool                               `json:"assignAvailabilitySet"`
-	SecurityGroupName     providerconfigtypes.ConfigVarString `json:"securityGroupName"`
-	Zones                 []string                            `json:"zones"`
-	ImagePlan             *ImagePlan                          `json:"imagePlan,omitempty"`
-	ImageReference        *ImageReference                     `json:"imageReference,omitempty"`
+	Location                    providerconfigtypes.ConfigVarString `json:"location"`
+	ResourceGroup               providerconfigtypes.ConfigVarString `json:"resourceGroup"`
+	VNetResourceGroup           providerconfigtypes.ConfigVarString `json:"vnetResourceGroup"`
+	VMSize                      providerconfigtypes.ConfigVarString `json:"vmSize"`
+	VNetName                    providerconfigtypes.ConfigVarString `json:"vnetName"`
+	SubnetName                  providerconfigtypes.ConfigVarString `json:"subnetName"`
+	LoadBalancerSku             providerconfigtypes.ConfigVarString `json:"loadBalancerSku"`
+	RouteTableName              providerconfigtypes.ConfigVarString `json:"routeTableName"`
+	AvailabilitySet             providerconfigtypes.ConfigVarString `json:"availabilitySet"`
+	AssignAvailabilitySet       *bool                               `json:"assignAvailabilitySet"`
+	SecurityGroupName           providerconfigtypes.ConfigVarString `json:"securityGroupName"`
+	Zones                       []string                            `json:"zones"`
+	ImagePlan                   *ImagePlan                          `json:"imagePlan,omitempty"`
+	ImageReference              *ImageReference                     `json:"imageReference,omitempty"`
+	EnableAcceleratedNetworking *bool                               `json:"enableAcceleratedNetworking"`
 
 	ImageID        providerconfigtypes.ConfigVarString `json:"imageID"`
 	OSDiskSize     int32                               `json:"osDiskSize"`
diff --git a/pkg/cloudprovider/provider/vmwareclouddirector/types/types.go b/pkg/cloudprovider/provider/vmwareclouddirector/types/types.go
index c8c5aa3d..188e3c2b 100644
--- a/pkg/cloudprovider/provider/vmwareclouddirector/types/types.go
+++ b/pkg/cloudprovider/provider/vmwareclouddirector/types/types.go
@@ -46,7 +46,7 @@ type RawConfig struct {
 
 	// Network configuration.
 	Network          providerconfigtypes.ConfigVarString `json:"network"`
-	IPAllocationMode IPAllocationMode                    `json:"ipAllocationMode"`
+	IPAllocationMode IPAllocationMode                    `json:"ipAllocationMode,omitempty"`
 
 	// Compute configuration.
 	CPUs         int64   `json:"cpus"`
diff --git a/pkg/userdata/amzn2/provider.go b/pkg/userdata/amzn2/provider.go
index f79ac612..10e5fb48 100644
--- a/pkg/userdata/amzn2/provider.go
+++ b/pkg/userdata/amzn2/provider.go
@@ -114,7 +114,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -254,7 +254,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/kubernetes/cloud-config"
   permissions: "0600"
diff --git a/pkg/userdata/centos/provider.go b/pkg/userdata/centos/provider.go
index 5a96b70d..3943bf0a 100644
--- a/pkg/userdata/centos/provider.go
+++ b/pkg/userdata/centos/provider.go
@@ -114,7 +114,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -272,7 +272,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/kubernetes/cloud-config"
   permissions: "0600"
diff --git a/pkg/userdata/flatcar/provider.go b/pkg/userdata/flatcar/provider.go
index 471ce53e..183b7e03 100644
--- a/pkg/userdata/flatcar/provider.go
+++ b/pkg/userdata/flatcar/provider.go
@@ -120,7 +120,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -301,7 +301,7 @@ systemd:
           Requires=download-script.service
           After=download-script.service
       contents: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags false | indent 8 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags false | indent 8 }}
 
 storage:
   files:
@@ -623,7 +623,7 @@ coreos:
         Requires=download-script.service
         After=download-script.service
     content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags false | indent 6 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags false | indent 6 }}
 
   - name: apply-sysctl-settings.service
     enable: true
diff --git a/pkg/userdata/helper/helper.go b/pkg/userdata/helper/helper.go
index 291513e2..63155f26 100644
--- a/pkg/userdata/helper/helper.go
+++ b/pkg/userdata/helper/helper.go
@@ -21,6 +21,8 @@ import (
 	"fmt"
 	"strings"
 
+	"github.com/kubermatic/machine-controller/pkg/cloudprovider/util"
+
 	"k8s.io/client-go/tools/clientcmd"
 	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
 )
@@ -146,14 +148,29 @@ NO_PROXY=%s
 no_proxy=%s`, proxy, proxy, proxy, proxy, noProxy, noProxy)
 }
 
-func SetupNodeIPEnvScript() string {
+func SetupNodeIPEnvScript(ipFamily util.IPFamily) string {
+	const defaultIfcIPv4 = `DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")`
+
+	var defaultIfcIP string
+	switch ipFamily {
+	case util.IPv4:
+		defaultIfcIP = defaultIfcIPv4
+	case util.IPv6:
+		defaultIfcIP = `DEFAULT_IFC_IP=$(ip -o -6 route get  1:: | grep -oP "src \K\S+")`
+	case util.DualStack:
+		defaultIfcIP = `DEFAULT_IFC_IP=$(ip -o route get  1 | grep -oP "src \K\S+")
+DEFAULT_IFC_IP6=$(ip -o -6 route get  1:: | grep -oP "src \K\S+")
+DEFAULT_IFC_IP=$DEFAULT_IFC_IP,$DEFAULT_IFC_IP6`
+	default:
+		defaultIfcIP = defaultIfcIPv4
+	}
 	return `#!/usr/bin/env bash
 echodate() {
   echo "[$(date -Is)]" "$@"
 }
 
 # get the default interface IP address
-DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
+` + defaultIfcIP + `
 
 # get the full hostname
 FULL_HOSTNAME=$(hostname -f)
diff --git a/pkg/userdata/helper/kubelet.go b/pkg/userdata/helper/kubelet.go
index 07f6691d..2a3ad59d 100644
--- a/pkg/userdata/helper/kubelet.go
+++ b/pkg/userdata/helper/kubelet.go
@@ -26,6 +26,7 @@ import (
 	"github.com/Masterminds/semver/v3"
 
 	"github.com/kubermatic/machine-controller/pkg/apis/cluster/common"
+	"github.com/kubermatic/machine-controller/pkg/cloudprovider/util"
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -39,15 +40,18 @@ const (
 	defaultKubeletContainerLogMaxSize = "100Mi"
 )
 
-const (
-	kubeletFlagsTpl = `--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
+func kubeletFlagsTpl(withNodeIP bool) string {
+	flagsTemplate := `--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
 --kubeconfig=/var/lib/kubelet/kubeconfig \
 --config=/etc/kubernetes/kubelet.conf \
---cert-dir=/etc/kubernetes/pki \
+--cert-dir=/etc/kubernetes/pki \`
+
+	flagsTemplate += `
 {{- if or (.CloudProvider) (.IsExternal) }}
 {{ cloudProviderFlags .CloudProvider .IsExternal }} \
-{{- end }}
-{{- if and (.Hostname) (ne .CloudProvider "aws") }}
+{{- end }}`
+
+	flagsTemplate += `{{- if and (.Hostname) (ne .CloudProvider "aws") }}
 --hostname-override={{ .Hostname }} \
 {{- else if and (eq .CloudProvider "aws") (.IsExternal) }}
 --hostname-override=${KUBELET_HOSTNAME} \
@@ -62,9 +66,17 @@ const (
 {{- end }}
 {{- range .ExtraKubeletFlags }}
 {{ . }} \
-{{- end }}
+{{- end }}`
+
+	if withNodeIP {
+		flagsTemplate += `
 --node-ip ${KUBELET_NODE_IP}`
+	}
 
+	return flagsTemplate
+}
+
+const (
 	kubeletSystemdUnitTpl = `[Unit]
 After={{ .ContainerRuntime }}.service
 Requires={{ .ContainerRuntime }}.service
@@ -89,7 +101,7 @@ ExecStartPre=/bin/bash /opt/disable-swap.sh
 {{ end }}
 ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
 ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-{{ kubeletFlags .KubeletVersion .CloudProvider .Hostname .ClusterDNSIPs .IsExternal .PauseImage .InitialTaints .ExtraKubeletFlags | indent 2 }}
+{{ kubeletFlags .KubeletVersion .CloudProvider .Hostname .ClusterDNSIPs .IsExternal .IPFamily .PauseImage .InitialTaints .ExtraKubeletFlags | indent 2 }}
 
 [Install]
 WantedBy=multi-user.target`
@@ -123,20 +135,32 @@ var kubeletTLSCipherSuites = []string{
 	"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
 }
 
+func withNodeIPFlag(ipFamily util.IPFamily, cloudProvider string, external bool) bool {
+	// If external or in-tree CCM is in use we don't need to set --node-ip
+	// as the cloud provider will know what IPs to return.
+	if ipFamily == util.DualStack {
+		if external || cloudProvider != "" {
+			return false
+		}
+	}
+	return true
+}
+
 // CloudProviderFlags returns --cloud-provider and --cloud-config flags.
-func CloudProviderFlags(cpName string, external bool) (string, error) {
+func CloudProviderFlags(cpName string, external bool) string {
 	if cpName == "" && !external {
-		return "", nil
+		return ""
 	}
 
 	if external {
-		return "--cloud-provider=external", nil
+		return `--cloud-provider=external`
 	}
-	return fmt.Sprintf(cpFlags, cpName), nil
+
+	return fmt.Sprintf(cpFlags, cpName)
 }
 
 // KubeletSystemdUnit returns the systemd unit for the kubelet.
-func KubeletSystemdUnit(containerRuntime, kubeletVersion, cloudProvider, hostname string, dnsIPs []net.IP, external bool, pauseImage string, initialTaints []corev1.Taint, extraKubeletFlags []string, disableSwap bool) (string, error) {
+func KubeletSystemdUnit(containerRuntime, kubeletVersion, cloudProvider, hostname string, dnsIPs []net.IP, external bool, ipFamily util.IPFamily, pauseImage string, initialTaints []corev1.Taint, extraKubeletFlags []string, disableSwap bool) (string, error) {
 	tmpl, err := template.New("kubelet-systemd-unit").Funcs(TxtFuncMap()).Parse(kubeletSystemdUnitTpl)
 	if err != nil {
 		return "", fmt.Errorf("failed to parse kubelet-systemd-unit template: %w", err)
@@ -149,6 +173,7 @@ func KubeletSystemdUnit(containerRuntime, kubeletVersion, cloudProvider, hostnam
 		Hostname          string
 		ClusterDNSIPs     []net.IP
 		IsExternal        bool
+		IPFamily          util.IPFamily
 		PauseImage        string
 		InitialTaints     []corev1.Taint
 		ExtraKubeletFlags []string
@@ -160,6 +185,7 @@ func KubeletSystemdUnit(containerRuntime, kubeletVersion, cloudProvider, hostnam
 		Hostname:          hostname,
 		ClusterDNSIPs:     dnsIPs,
 		IsExternal:        external,
+		IPFamily:          ipFamily,
 		PauseImage:        pauseImage,
 		InitialTaints:     initialTaints,
 		ExtraKubeletFlags: extraKubeletFlags,
@@ -279,8 +305,16 @@ func kubeletConfiguration(clusterDomain string, clusterDNS []net.IP, featureGate
 }
 
 // KubeletFlags returns the kubelet flags.
-func KubeletFlags(version, cloudProvider, hostname string, dnsIPs []net.IP, external bool, pauseImage string, initialTaints []corev1.Taint, extraKubeletFlags []string) (string, error) {
-	tmpl, err := template.New("kubelet-flags").Funcs(TxtFuncMap()).Parse(kubeletFlagsTpl)
+// --node-ip and --cloud-provider kubelet flags conflict in the dualstack setup.
+// In general, it is not expected to need to use --node-ip with external CCMs,
+// as the cloud provider is expected to know the correct IPs to return.
+// For details read kubernetes/sig-networking channel discussion
+// https://kubernetes.slack.com/archives/C09QYUH5W/p1654003958331739
+func KubeletFlags(version, cloudProvider, hostname string, dnsIPs []net.IP, external bool, ipFamily util.IPFamily, pauseImage string, initialTaints []corev1.Taint, extraKubeletFlags []string) (string, error) {
+	withNodeIPFlag := withNodeIPFlag(ipFamily, cloudProvider, external)
+
+	tmpl, err := template.New("kubelet-flags").Funcs(TxtFuncMap()).
+		Parse(kubeletFlagsTpl(withNodeIPFlag))
 	if err != nil {
 		return "", fmt.Errorf("failed to parse kubelet-flags template: %w", err)
 	}
@@ -328,6 +362,7 @@ func KubeletFlags(version, cloudProvider, hostname string, dnsIPs []net.IP, exte
 		ClusterDNSIPs     []net.IP
 		KubeletVersion    string
 		IsExternal        bool
+		IPFamily          util.IPFamily
 		PauseImage        string
 		InitialTaints     string
 		ExtraKubeletFlags []string
@@ -337,6 +372,7 @@ func KubeletFlags(version, cloudProvider, hostname string, dnsIPs []net.IP, exte
 		ClusterDNSIPs:     dnsIPs,
 		KubeletVersion:    version,
 		IsExternal:        external,
+		IPFamily:          ipFamily,
 		PauseImage:        pauseImage,
 		InitialTaints:     strings.Join(initialTaintsArgs, ","),
 		ExtraKubeletFlags: kubeletFlags,
diff --git a/pkg/userdata/rhel/provider.go b/pkg/userdata/rhel/provider.go
index 75efa5d4..46f3b304 100644
--- a/pkg/userdata/rhel/provider.go
+++ b/pkg/userdata/rhel/provider.go
@@ -114,7 +114,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -273,7 +273,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/kubernetes/cloud-config"
   permissions: "0600"
diff --git a/pkg/userdata/rockylinux/provider.go b/pkg/userdata/rockylinux/provider.go
index 450bde84..93098430 100644
--- a/pkg/userdata/rockylinux/provider.go
+++ b/pkg/userdata/rockylinux/provider.go
@@ -114,7 +114,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -264,7 +264,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/kubernetes/cloud-config"
   permissions: "0600"
diff --git a/pkg/userdata/sles/provider.go b/pkg/userdata/sles/provider.go
index 7a7130d8..41fbf06a 100644
--- a/pkg/userdata/sles/provider.go
+++ b/pkg/userdata/sles/provider.go
@@ -108,7 +108,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
 		ContainerRuntimeConfig:             crConfig,
@@ -216,7 +216,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/systemd/system/kubelet.service.d/extras.conf"
   content: |
diff --git a/pkg/userdata/ubuntu/provider.go b/pkg/userdata/ubuntu/provider.go
index 4fb0920d..5a83a8a1 100644
--- a/pkg/userdata/ubuntu/provider.go
+++ b/pkg/userdata/ubuntu/provider.go
@@ -114,7 +114,7 @@ func (p Provider) UserData(req plugin.UserDataRequest) (string, error) {
 		KubeletVersion:                     kubeletVersion.String(),
 		Kubeconfig:                         kubeconfigString,
 		KubernetesCACert:                   kubernetesCACert,
-		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(),
+		NodeIPScript:                       userdatahelper.SetupNodeIPEnvScript(pconfig.Network.GetIPFamily()),
 		ExtraKubeletFlags:                  crEngine.KubeletFlags(),
 		ContainerRuntimeScript:             crScript,
 		ContainerRuntimeConfigFileName:     crEngine.ConfigFileName(),
@@ -263,7 +263,7 @@ write_files:
 
 - path: "/etc/systemd/system/kubelet.service"
   content: |
-{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
+{{ kubeletSystemdUnit .ContainerRuntimeName .KubeletVersion .KubeletCloudProviderName .MachineSpec.Name .DNSIPs .ExternalCloudProvider .ProviderSpec.Network.GetIPFamily .PauseImage .MachineSpec.Taints .ExtraKubeletFlags true | indent 4 }}
 
 - path: "/etc/systemd/system/kubelet.service.d/extras.conf"
   content: |


Test patch:
diff --git a/.prow/e2e-features.yaml b/.prow/e2e-features.yaml
index 93a9e3e2..aa4c1290 100644
--- a/.prow/e2e-features.yaml
+++ b/.prow/e2e-features.yaml
@@ -16,7 +16,6 @@ presubmits:
   - name: pull-machine-controller-e2e-invalid-objects-get-rejected
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-aws: "true"
@@ -35,7 +34,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -44,13 +43,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-custom-ca
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-openstack: "true"
@@ -63,7 +63,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -72,13 +72,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-ubuntu-upgrade
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-openstack: "true"
@@ -90,7 +91,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -99,13 +100,14 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
 
   - name: pull-machine-controller-e2e-deployment-upgrade
     always_run: true
     decorate: true
-    error_on_eviction: true
     clone_uri: "ssh://git@github.com/kubermatic/machine-controller.git"
     labels:
       preset-hetzner: "true"
@@ -116,7 +118,7 @@ presubmits:
       preset-kubeconfig-ci: "true"
     spec:
       containers:
-        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-5
+        - image: quay.io/kubermatic/build:go-1.18-node-16-kind-0.14-9
           command:
             - "./hack/ci/run-e2e-tests.sh"
           args:
@@ -125,5 +127,7 @@ presubmits:
             privileged: true
           resources:
             requests:
-              memory: 1Gi
-              cpu: 500m
+              memory: 6Gi
+              cpu: 2
+            limits:
+              memory: 6Gi
diff --git a/pkg/userdata/amzn2/provider_test.go b/pkg/userdata/amzn2/provider_test.go
index 9cd2057b..baea9d9d 100644
--- a/pkg/userdata/amzn2/provider_test.go
+++ b/pkg/userdata/amzn2/provider_test.go
@@ -100,40 +100,49 @@ func TestUserDataGeneration(t *testing.T) {
 
 	tests := []userDataTestCase{
 		{
-			name: "kubelet-v1.21-aws",
+			name: "kubelet-v1.22-aws",
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: "1.22.5",
+				},
+			},
+		},
+		{
+			name: "kubelet-v1.23-aws",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.8",
+					Kubelet: "1.23.5",
 				},
 			},
 		},
 		{
-			name: "kubelet-v1.21-aws-external",
+			name: "kubelet-v1.23-aws-external",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.8",
+					Kubelet: "1.23.5",
 				},
 			},
 			externalCloudProvider: true,
 		},
 		{
-			name: "kubelet-v1.21-vsphere",
+			name: "kubelet-v1.23-vsphere",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.8",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName: stringPtr("vsphere"),
 		},
 		{
-			name: "kubelet-v1.21-vsphere-proxy",
+			name: "kubelet-v1.23-vsphere-proxy",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.8",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName:  stringPtr("vsphere"),
@@ -143,11 +152,11 @@ func TestUserDataGeneration(t *testing.T) {
 			pauseImage:         "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
-			name: "kubelet-v1.21-vsphere-mirrors",
+			name: "kubelet-v1.23-vsphere-mirrors",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.8",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName: stringPtr("vsphere"),
@@ -156,24 +165,6 @@ func TestUserDataGeneration(t *testing.T) {
 			registryMirrors:   "https://registry.docker-cn.com",
 			pauseImage:        "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
-		{
-			name: "kubelet-v1.22-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.22.5",
-				},
-			},
-		},
-		{
-			name: "kubelet-v1.23-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.23.0",
-				},
-			},
-		},
 		{
 			name: "kubelet-v1.24-aws",
 			spec: clusterv1alpha1.MachineSpec{
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.21-aws.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.21-aws.yaml
deleted file mode 100644
index 7a8b853b..00000000
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.21-aws.yaml
+++ /dev/null
@@ -1,436 +0,0 @@
-#cloud-config
-
-
-ssh_pwauth: false
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/opt/load-kernel-modules.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: "/etc/sysctl.d/k8s.conf"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: /etc/selinux/config
-  content: |
-    # This file controls the state of SELinux on the system.
-    # SELINUX= can take one of these three values:
-    #     enforcing - SELinux security policy is enforced.
-    #     permissive - SELinux prints warnings instead of enforcing.
-    #     disabled - No SELinux policy is loaded.
-    SELINUX=permissive
-    # SELINUXTYPE= can take one of three two values:
-    #     targeted - Targeted processes are protected,
-    #     minimum - Modification of targeted policy. Only selected processes are protected.
-    #     mls - Multi Level Security protection.
-    SELINUXTYPE=targeted
-
-- path: "/opt/bin/setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-
-    setenforce 0 || true
-    systemctl restart systemd-modules-load.service
-    sysctl --system
-
-
-    yum install -y \
-      device-mapper-persistent-data \
-      lvm2 \
-      ebtables \
-      ethtool \
-      nfs-utils \
-      bash-completion \
-      sudo \
-      socat \
-      wget \
-      curl \
-      ipvsadm
-
-
-    mkdir -p /etc/systemd/system/containerd.service.d /etc/systemd/system/docker.service.d
-
-    cat <<EOF | tee /etc/systemd/system/containerd.service.d/environment.conf /etc/systemd/system/docker.service.d/environment.conf
-    [Service]
-    Restart=always
-    EnvironmentFile=-/etc/environment
-    EOF
-
-    yum install -y \
-        containerd-1.4* \
-        docker-20.10* \
-        yum-plugin-versionlock
-    yum versionlock add docker containerd
-
-    systemctl daemon-reload
-    systemctl enable --now docker
-
-
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.8}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-    # set kubelet nodeip environment variable
-    mkdir -p /etc/systemd/system/kubelet.service.d/
-    /opt/bin/setup_net_env.sh
-
-    systemctl disable --now firewalld || true
-    systemctl enable --now kubelet
-    systemctl enable --now --no-block kubelet-healthcheck.service
-    systemctl disable setup.service
-
-- path: "/opt/bin/supervise.sh"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    while ! "$@"; do
-      sleep 1
-    done
-
-- path: "/opt/disable-swap.sh"
-  permissions: "0755"
-  content: |
-    # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud
-    # providers swap gets enabled on reboot or after the setup script has finished executing.
-    sed -i.orig '/.*swap.*/d' /etc/fstab
-    swapoff -a
-
-- path: "/etc/systemd/system/kubelet.service"
-  content: |
-    [Unit]
-    After=docker.service
-    Requires=docker.service
-
-    Description=kubelet: The Kubernetes Node Agent
-    Documentation=https://kubernetes.io/docs/home/
-
-    [Service]
-    User=root
-    Restart=always
-    StartLimitInterval=0
-    RestartSec=10
-    CPUAccounting=true
-    MemoryAccounting=true
-
-    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-    EnvironmentFile=-/etc/environment
-
-    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-    ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-      --kubeconfig=/var/lib/kubelet/kubeconfig \
-      --config=/etc/kubernetes/kubelet.conf \
-      --cert-dir=/etc/kubernetes/pki \
-      --cloud-provider=aws \
-      --cloud-config=/etc/kubernetes/cloud-config \
-      --exit-on-lock-contention \
-      --lock-file=/tmp/kubelet.lock \
-      --container-runtime=docker \
-      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
-      --network-plugin=cni \
-      --node-ip ${KUBELET_NODE_IP}
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: "/etc/kubernetes/cloud-config"
-  permissions: "0600"
-  content: |
-    {aws-config:true}
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: "/etc/kubernetes/bootstrap-kubelet.conf"
-  permissions: "0600"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: "/etc/kubernetes/kubelet.conf"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: "/etc/kubernetes/pki/ca.crt"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-- path: "/etc/systemd/system/setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
-
-- path: "/etc/profile.d/opt-bin-path.sh"
-  permissions: "0644"
-  content: |
-    export PATH="/opt/bin:$PATH"
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/systemd/system/kubelet-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=kubelet.service
-    After=kubelet.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh kubelet
-
-    [Install]
-    WantedBy=multi-user.target
-
-
-runcmd:
-- systemctl enable --now setup.service
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.21-aws-external.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws-external.yaml
similarity index 98%
rename from pkg/userdata/amzn2/testdata/kubelet-v1.21-aws-external.yaml
rename to pkg/userdata/amzn2/testdata/kubelet-v1.23-aws-external.yaml
index d08b2f73..77275d45 100644
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.21-aws-external.yaml
+++ b/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws-external.yaml
@@ -139,7 +139,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.8}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -225,8 +225,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws.yaml
index 4733cab4..10cf2ceb 100644
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws.yaml
+++ b/pkg/userdata/amzn2/testdata/kubelet-v1.23-aws.yaml
@@ -139,7 +139,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.23.0}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-mirrors.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-mirrors.yaml
similarity index 99%
rename from pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-mirrors.yaml
rename to pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-mirrors.yaml
index e2fcbf6f..bb9ac745 100644
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-mirrors.yaml
+++ b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-mirrors.yaml
@@ -152,7 +152,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.8}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -242,8 +242,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-proxy.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-proxy.yaml
similarity index 99%
rename from pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-proxy.yaml
rename to pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-proxy.yaml
index 5c96b174..9c36c7ab 100644
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere-proxy.yaml
+++ b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere-proxy.yaml
@@ -152,7 +152,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.8}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -242,8 +242,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere.yaml b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere.yaml
similarity index 98%
rename from pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere.yaml
rename to pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere.yaml
index 4c4c07bb..c6eb43a7 100644
--- a/pkg/userdata/amzn2/testdata/kubelet-v1.21-vsphere.yaml
+++ b/pkg/userdata/amzn2/testdata/kubelet-v1.23-vsphere.yaml
@@ -144,7 +144,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.8}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -233,8 +233,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/centos/provider_test.go b/pkg/userdata/centos/provider_test.go
index 37f36be4..61f5ce8f 100644
--- a/pkg/userdata/centos/provider_test.go
+++ b/pkg/userdata/centos/provider_test.go
@@ -100,89 +100,80 @@ func TestUserDataGeneration(t *testing.T) {
 
 	tests := []userDataTestCase{
 		{
-			name: "kubelet-v1.21-aws",
+			name: "kubelet-v1.22-aws",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.22.7",
 				},
 			},
 		},
 		{
-			name: "kubelet-v1.21-aws-external",
+			name: "kubelet-v1.23-aws",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
-			externalCloudProvider: true,
 		},
 		{
-			name: "kubelet-v1.21-vsphere",
+			name: "kubelet-v1.23-nutanix",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
-			cloudProviderName: stringPtr("vsphere"),
+			cloudProviderName: stringPtr("nutanix"),
 		},
 		{
-			name: "kubelet-v1.21-vsphere-proxy",
+			name: "kubelet-v1.23-aws-external",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
-			cloudProviderName:  stringPtr("vsphere"),
-			httpProxy:          "http://192.168.100.100:3128",
-			noProxy:            "192.168.1.0",
-			insecureRegistries: "192.168.100.100:5000, 10.0.0.1:5000",
-			pauseImage:         "192.168.100.100:5000/kubernetes/pause:v3.1",
+			externalCloudProvider: true,
 		},
 		{
-			name: "kubelet-v1.21-vsphere-mirrors",
+			name: "kubelet-v1.23-vsphere",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName: stringPtr("vsphere"),
-			httpProxy:         "http://192.168.100.100:3128",
-			noProxy:           "192.168.1.0",
-			registryMirrors:   "https://registry.docker-cn.com",
-			pauseImage:        "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
-			name: "kubelet-v1.22-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.22.7",
-				},
-			},
-		},
-		{
-			name: "kubelet-v1.23-aws",
+			name: "kubelet-v1.23-vsphere-proxy",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
 					Kubelet: "1.23.5",
 				},
 			},
+			cloudProviderName:  stringPtr("vsphere"),
+			httpProxy:          "http://192.168.100.100:3128",
+			noProxy:            "192.168.1.0",
+			insecureRegistries: "192.168.100.100:5000, 10.0.0.1:5000",
+			pauseImage:         "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
-			name: "kubelet-v1.23-nutanix",
+			name: "kubelet-v1.23-vsphere-mirrors",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
 					Kubelet: "1.23.5",
 				},
 			},
-			cloudProviderName: stringPtr("nutanix"),
+			cloudProviderName: stringPtr("vsphere"),
+			httpProxy:         "http://192.168.100.100:3128",
+			noProxy:           "192.168.1.0",
+			registryMirrors:   "https://registry.docker-cn.com",
+			pauseImage:        "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
 			name: "kubelet-v1.24-aws",
diff --git a/pkg/userdata/centos/testdata/kubelet-v1.21-aws.yaml b/pkg/userdata/centos/testdata/kubelet-v1.21-aws.yaml
deleted file mode 100644
index 4f7bee9e..00000000
--- a/pkg/userdata/centos/testdata/kubelet-v1.21-aws.yaml
+++ /dev/null
@@ -1,446 +0,0 @@
-#cloud-config
-
-
-ssh_pwauth: false
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/opt/load-kernel-modules.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: "/etc/sysctl.d/k8s.conf"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: /etc/selinux/config
-  content: |
-    # This file controls the state of SELinux on the system.
-    # SELINUX= can take one of these three values:
-    #     enforcing - SELinux security policy is enforced.
-    #     permissive - SELinux prints warnings instead of enforcing.
-    #     disabled - No SELinux policy is loaded.
-    SELINUX=permissive
-    # SELINUXTYPE= can take one of three two values:
-    #     targeted - Targeted processes are protected,
-    #     minimum - Modification of targeted policy. Only selected processes are protected.
-    #     mls - Multi Level Security protection.
-    SELINUXTYPE=targeted
-
-- path: "/opt/bin/setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-
-    setenforce 0 || true
-    systemctl restart systemd-modules-load.service
-    sysctl --system
-
-
-    source /etc/os-release
-    if [ "$ID" == "centos" ] && [ "$VERSION_ID" == "8" ]; then
-      sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
-      sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
-    fi
-
-    yum install -y \
-      device-mapper-persistent-data \
-      lvm2 \
-      ebtables \
-      ethtool \
-      nfs-utils \
-      bash-completion \
-      sudo \
-      socat \
-      wget \
-      curl \
-      ipvsadm
-
-    yum install -y yum-utils
-    yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
-    yum-config-manager --save --setopt=docker-ce-stable.module_hotfixes=true
-
-    mkdir -p /etc/systemd/system/containerd.service.d /etc/systemd/system/docker.service.d
-
-    cat <<EOF | tee /etc/systemd/system/containerd.service.d/environment.conf /etc/systemd/system/docker.service.d/environment.conf
-    [Service]
-    Restart=always
-    EnvironmentFile=-/etc/environment
-    EOF
-
-    yum install -y \
-        docker-ce-cli-20.10* \
-        containerd.io-1.4* \
-        docker-ce-20.10* \
-        yum-plugin-versionlock
-    yum versionlock add docker-ce* containerd.io
-
-    systemctl daemon-reload
-    systemctl enable --now docker
-
-
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-    # set kubelet nodeip environment variable
-    mkdir -p /etc/systemd/system/kubelet.service.d/
-    /opt/bin/setup_net_env.sh
-
-    systemctl disable --now firewalld || true
-    systemctl enable --now kubelet
-    systemctl enable --now --no-block kubelet-healthcheck.service
-    systemctl disable setup.service
-
-- path: "/opt/bin/supervise.sh"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    while ! "$@"; do
-      sleep 1
-    done
-
-- path: "/opt/disable-swap.sh"
-  permissions: "0755"
-  content: |
-    # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud
-    # providers swap gets enabled on reboot or after the setup script has finished executing.
-    sed -i.orig '/.*swap.*/d' /etc/fstab
-    swapoff -a
-
-- path: "/etc/systemd/system/kubelet.service"
-  content: |
-    [Unit]
-    After=docker.service
-    Requires=docker.service
-
-    Description=kubelet: The Kubernetes Node Agent
-    Documentation=https://kubernetes.io/docs/home/
-
-    [Service]
-    User=root
-    Restart=always
-    StartLimitInterval=0
-    RestartSec=10
-    CPUAccounting=true
-    MemoryAccounting=true
-
-    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-    EnvironmentFile=-/etc/environment
-
-    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-    ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-      --kubeconfig=/var/lib/kubelet/kubeconfig \
-      --config=/etc/kubernetes/kubelet.conf \
-      --cert-dir=/etc/kubernetes/pki \
-      --cloud-provider=aws \
-      --cloud-config=/etc/kubernetes/cloud-config \
-      --exit-on-lock-contention \
-      --lock-file=/tmp/kubelet.lock \
-      --container-runtime=docker \
-      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
-      --network-plugin=cni \
-      --node-ip ${KUBELET_NODE_IP}
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: "/etc/kubernetes/cloud-config"
-  permissions: "0600"
-  content: |
-    {aws-config:true}
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: "/etc/kubernetes/bootstrap-kubelet.conf"
-  permissions: "0600"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: "/etc/kubernetes/kubelet.conf"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: "/etc/kubernetes/pki/ca.crt"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-- path: "/etc/systemd/system/setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
-
-- path: "/etc/profile.d/opt-bin-path.sh"
-  permissions: "0644"
-  content: |
-    export PATH="/opt/bin:$PATH"
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/systemd/system/kubelet-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=kubelet.service
-    After=kubelet.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh kubelet
-
-    [Install]
-    WantedBy=multi-user.target
-
-
-runcmd:
-- systemctl enable --now setup.service
diff --git a/pkg/userdata/centos/testdata/kubelet-v1.21-aws-external.yaml b/pkg/userdata/centos/testdata/kubelet-v1.23-aws-external.yaml
similarity index 99%
rename from pkg/userdata/centos/testdata/kubelet-v1.21-aws-external.yaml
rename to pkg/userdata/centos/testdata/kubelet-v1.23-aws-external.yaml
index fa03994b..da8f203e 100644
--- a/pkg/userdata/centos/testdata/kubelet-v1.21-aws-external.yaml
+++ b/pkg/userdata/centos/testdata/kubelet-v1.23-aws-external.yaml
@@ -149,7 +149,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -235,8 +235,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-mirrors.yaml b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-mirrors.yaml
similarity index 99%
rename from pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-mirrors.yaml
rename to pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-mirrors.yaml
index 3c7b5671..11c41156 100644
--- a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-mirrors.yaml
+++ b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-mirrors.yaml
@@ -162,7 +162,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -252,8 +252,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-proxy.yaml b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-proxy.yaml
similarity index 99%
rename from pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-proxy.yaml
rename to pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-proxy.yaml
index 7dd0ddc5..8cc2eb13 100644
--- a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere-proxy.yaml
+++ b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere-proxy.yaml
@@ -162,7 +162,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -252,8 +252,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere.yaml b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere.yaml
similarity index 99%
rename from pkg/userdata/centos/testdata/kubelet-v1.21-vsphere.yaml
rename to pkg/userdata/centos/testdata/kubelet-v1.23-vsphere.yaml
index b325de29..aee1a886 100644
--- a/pkg/userdata/centos/testdata/kubelet-v1.21-vsphere.yaml
+++ b/pkg/userdata/centos/testdata/kubelet-v1.23-vsphere.yaml
@@ -154,7 +154,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -243,8 +243,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/flatcar/provider_test.go b/pkg/userdata/flatcar/provider_test.go
index 18688dd6..cc82c03a 100644
--- a/pkg/userdata/flatcar/provider_test.go
+++ b/pkg/userdata/flatcar/provider_test.go
@@ -121,37 +121,6 @@ func TestUserDataGeneration(t *testing.T) {
 	t.Parallel()
 
 	tests := []userDataTestCase{
-		{
-			name: "ignition_v1.21.10",
-			providerSpec: &providerconfigtypes.Config{
-				CloudProvider: "vsphere",
-				SSHPublicKeys: []string{"ssh-rsa AAABBB", "ssh-rsa CCCDDD"},
-				CAPublicKey:   "ssh-rsa AAABBB",
-				Network: &providerconfigtypes.NetworkConfig{
-					CIDR:    "192.168.81.4/24",
-					Gateway: "192.168.81.1",
-					DNS: providerconfigtypes.DNSConfig{
-						Servers: []string{"8.8.8.8"},
-					},
-				},
-			},
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "v1.21.10",
-				},
-			},
-			ccProvider: &fakeCloudConfigProvider{
-				name:   "vsphere",
-				config: "{vsphere-config:true}",
-				err:    nil,
-			},
-			DNSIPs: []net.IP{net.ParseIP("10.10.10.10")},
-			osConfig: &Config{
-				DisableAutoUpdate:   true,
-				ProvisioningUtility: Ignition,
-			},
-		},
 		{
 			name: "ignition_v1.22.7",
 			providerSpec: &providerconfigtypes.Config{
@@ -276,37 +245,6 @@ func TestUserDataGeneration(t *testing.T) {
 				ProvisioningUtility: Ignition,
 			},
 		},
-		{
-			name: "cloud-init_v1.21.10",
-			providerSpec: &providerconfigtypes.Config{
-				CloudProvider: "anexia",
-				SSHPublicKeys: []string{"ssh-rsa AAABBB", "ssh-rsa CCCDDD"},
-				CAPublicKey:   "ssh-rsa AAABBB",
-				Network: &providerconfigtypes.NetworkConfig{
-					CIDR:    "192.168.81.4/24",
-					Gateway: "192.168.81.1",
-					DNS: providerconfigtypes.DNSConfig{
-						Servers: []string{"8.8.8.8"},
-					},
-				},
-			},
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "v1.21.10",
-				},
-			},
-			ccProvider: &fakeCloudConfigProvider{
-				name:   "anexia",
-				config: "{anexia-config:true}",
-				err:    nil,
-			},
-			DNSIPs: []net.IP{net.ParseIP("10.10.10.10")},
-			osConfig: &Config{
-				DisableAutoUpdate:   true,
-				ProvisioningUtility: CloudInit,
-			},
-		},
 		{
 			name: "cloud-init_v1.22.7",
 			providerSpec: &providerconfigtypes.Config{
@@ -413,7 +351,7 @@ func TestUserDataGeneration(t *testing.T) {
 					Name: "node1",
 				},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "v1.21.10",
+					Kubelet: "v1.24.0",
 				},
 			},
 			ccProvider: &fakeCloudConfigProvider{},
diff --git a/pkg/userdata/flatcar/testdata/cloud-init_v1.21.10.yaml b/pkg/userdata/flatcar/testdata/cloud-init_v1.21.10.yaml
deleted file mode 100644
index a1b39a56..00000000
--- a/pkg/userdata/flatcar/testdata/cloud-init_v1.21.10.yaml
+++ /dev/null
@@ -1,478 +0,0 @@
-#cloud-config
-
-users:
-- name: core
-  ssh_authorized_keys:
-  - ssh-rsa AAABBB
-  - ssh-rsa CCCDDD
-
-
-coreos:
-  units:
-  - name: static-nic.network
-    content: |
-      [Match]
-      # Because of difficulty predicting specific NIC names on different cloud providers,
-      # we only support static addressing on VSphere. There should be a single NIC attached
-      # that we will match by name prefix 'en' which denotes ethernet devices.
-      Name=en*
-
-      [Network]
-      DHCP=no
-      Address=192.168.81.4/24
-      Gateway=192.168.81.1
-      DNS=8.8.8.8
-
-  - name: update-engine.service
-    command: stop
-    mask: true
-  - name: locksmithd.service
-    command: stop
-    mask: true
-  - name: download-script.service
-    enable: true
-    command: start
-    content: |
-      [Unit]
-      Requires=network-online.target
-      After=network-online.target
-      [Service]
-      Type=oneshot
-      EnvironmentFile=-/etc/environment
-      ExecStart=/opt/bin/download.sh
-      [Install]
-      WantedBy=multi-user.target
-
-  - name: kubelet-healthcheck.service
-    enable: true
-    command: start
-    drop-ins:
-    - name: 40-download.conf
-      content: |
-        [Unit]
-        Requires=download-script.service
-        After=download-script.service
-    content: |
-      [Unit]
-      Requires=kubelet.service
-      After=kubelet.service
-
-      [Service]
-      ExecStart=/opt/bin/health-monitor.sh kubelet
-
-      [Install]
-      WantedBy=multi-user.target
-
-
-  - name: nodeip.service
-    enable: true
-    command: start
-    content: |
-      [Unit]
-      Description=Setup Kubelet Node IP Env
-      Requires=network-online.target
-      After=network-online.target
-
-      [Service]
-      ExecStart=/opt/bin/setup_net_env.sh
-      RemainAfterExit=yes
-      Type=oneshot
-      [Install]
-      WantedBy=multi-user.target
-
-  - name: kubelet.service
-    enable: true
-    command: start
-    drop-ins:
-    - name: 10-nodeip.conf
-      content: |
-        [Service]
-        EnvironmentFile=/etc/kubernetes/nodeip.conf
-    - name: 40-download.conf
-      content: |
-        [Unit]
-        Requires=download-script.service
-        After=download-script.service
-    content: |
-      [Unit]
-      After=docker.service
-      Requires=docker.service
-
-      Description=kubelet: The Kubernetes Node Agent
-      Documentation=https://kubernetes.io/docs/home/
-
-      [Service]
-      User=root
-      Restart=always
-      StartLimitInterval=0
-      RestartSec=10
-      CPUAccounting=true
-      MemoryAccounting=true
-
-      Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-      EnvironmentFile=-/etc/environment
-
-      ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-      ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-      ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-        --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-        --kubeconfig=/var/lib/kubelet/kubeconfig \
-        --config=/etc/kubernetes/kubelet.conf \
-        --cert-dir=/etc/kubernetes/pki \
-        --cloud-provider=anexia \
-        --cloud-config=/etc/kubernetes/cloud-config \
-        --hostname-override=node1 \
-        --exit-on-lock-contention \
-        --lock-file=/tmp/kubelet.lock \
-        --container-runtime=docker \
-        --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-        --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-        --feature-gates=DynamicKubeletConfig=true \
-        --network-plugin=cni \
-        --node-ip ${KUBELET_NODE_IP}
-
-      [Install]
-      WantedBy=multi-user.target
-
-  - name: apply-sysctl-settings.service
-    enable: true
-    command: start
-    content: |
-      [Unit]
-      Requires=network-online.target
-      After=network-online.target
-      [Service]
-      Type=oneshot
-      ExecStart=/opt/bin/apply_sysctl_settings.sh
-      [Install]
-      WantedBy=multi-user.target
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  permissions: "0644"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/etc/kubernetes/kubelet.conf"
-  permissions: "0644"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDNS:
-    - 10.10.10.10
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: /opt/load-kernel-modules.sh
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: /etc/sysctl.d/k8s.conf
-  permissions: "0644"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: /etc/kubernetes/bootstrap-kubelet.conf
-  permissions: "0400"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: /etc/kubernetes/cloud-config
-  permissions: "0400"
-  content: |
-    {anexia-config:true}
-
-- path: /etc/kubernetes/pki/ca.crt
-  permissions: "0644"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-
-- path: /etc/hostname
-  permissions: "0600"
-  content: 'node1'
-
-- path: /etc/ssh/sshd_config
-  permissions: "0600"
-  user: root
-  content: |
-    # Use most defaults for sshd configuration.
-    Subsystem sftp internal-sftp
-    ClientAliveInterval 180
-    UseDNS no
-    UsePAM yes
-    PrintLastLog no # handled by PAM
-    PrintMotd no # handled by PAM
-    PasswordAuthentication no
-    ChallengeResponseAuthentication no
-
-- path: /opt/bin/download.sh
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-
-    systemctl daemon-reload
-    systemctl enable --now docker
-
-    systemctl disable download-script.service
-
-- path: /opt/bin/apply_sysctl_settings.sh
-  permissions: "0755"
-  user: root
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    sysctl --system
-    systemctl disable apply-sysctl-settings.service
-
-- path: "/etc/ssh/trusted-user-ca-keys.pem"
-  content: |
-    ssh-rsa AAABBB
-
-- path: "/etc/ssh/sshd_config"
-  content: |
-    TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem
-    CASignatureAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
-  append: true
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  user: root
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/crictl.yaml
-  permissions: "0644"
-  user: root
-  content: |
-    runtime-endpoint: unix:///run/containerd/containerd.sock
diff --git a/pkg/userdata/flatcar/testdata/containerd.yaml b/pkg/userdata/flatcar/testdata/containerd.yaml
index 3f98342f..bcd1eedb 100644
--- a/pkg/userdata/flatcar/testdata/containerd.yaml
+++ b/pkg/userdata/flatcar/testdata/containerd.yaml
@@ -110,9 +110,6 @@ coreos:
         --lock-file=/tmp/kubelet.lock \
         --container-runtime=remote \
         --container-runtime-endpoint=unix:///run/containerd/containerd.sock \
-        --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-        --feature-gates=DynamicKubeletConfig=true \
-        --network-plugin=cni \
         --node-ip ${KUBELET_NODE_IP}
 
       [Install]
@@ -399,7 +396,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.24.0}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
diff --git a/pkg/userdata/flatcar/testdata/ignition_v1.21.10.json b/pkg/userdata/flatcar/testdata/ignition_v1.21.10.json
deleted file mode 100644
index b40d43f7..00000000
--- a/pkg/userdata/flatcar/testdata/ignition_v1.21.10.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"ignition":{"config":{},"security":{"tls":{}},"timeouts":{},"version":"2.2.0"},"networkd":{"units":[{"contents":"[Match]\n# Because of difficulty predicting specific NIC names on different cloud providers,\n# we only support static addressing on VSphere. There should be a single NIC attached\n# that we will match by name prefix 'en' which denotes ethernet devices.\nName=en*\n\n[Network]\nDHCP=no\nAddress=192.168.81.4/24\nGateway=192.168.81.1\nDNS=8.8.8.8\n","name":"static-nic.network"}]},"passwd":{"users":[{"name":"core","sshAuthorizedKeys":["ssh-rsa AAABBB","ssh-rsa CCCDDD"]}]},"storage":{"files":[{"filesystem":"root","path":"/etc/systemd/journald.conf.d/max_disk_use.conf","contents":{"source":"data:,%5BJournal%5D%0ASystemMaxUse%3D5G%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/etc/kubernetes/kubelet.conf","contents":{"source":"data:,apiVersion%3A%20kubelet.config.k8s.io%2Fv1beta1%0Aauthentication%3A%0A%20%20anonymous%3A%0A%20%20%20%20enabled%3A%20false%0A%20%20webhook%3A%0A%20%20%20%20cacheTTL%3A%200s%0A%20%20%20%20enabled%3A%20true%0A%20%20x509%3A%0A%20%20%20%20clientCAFile%3A%20%2Fetc%2Fkubernetes%2Fpki%2Fca.crt%0Aauthorization%3A%0A%20%20mode%3A%20Webhook%0A%20%20webhook%3A%0A%20%20%20%20cacheAuthorizedTTL%3A%200s%0A%20%20%20%20cacheUnauthorizedTTL%3A%200s%0AcgroupDriver%3A%20systemd%0AclusterDNS%3A%0A-%2010.10.10.10%0AclusterDomain%3A%20cluster.local%0AcontainerLogMaxSize%3A%20100Mi%0AcpuManagerReconcilePeriod%3A%200s%0AevictionHard%3A%0A%20%20imagefs.available%3A%2015%25%0A%20%20memory.available%3A%20100Mi%0A%20%20nodefs.available%3A%2010%25%0A%20%20nodefs.inodesFree%3A%205%25%0AevictionPressureTransitionPeriod%3A%200s%0AfeatureGates%3A%0A%20%20RotateKubeletServerCertificate%3A%20true%0AfileCheckFrequency%3A%200s%0AhttpCheckFrequency%3A%200s%0AimageMinimumGCAge%3A%200s%0Akind%3A%20KubeletConfiguration%0AkubeReserved%3A%0A%20%20cpu%3A%20200m%0A%20%20ephemeral-storage%3A%201Gi%0A%20%20memory%3A%20200Mi%0Alogging%3A%0A%20%20flushFrequency%3A%200%0A%20%20options%3A%0A%20%20%20%20json%3A%0A%20%20%20%20%20%20infoBufferSize%3A%20%220%22%0A%20%20verbosity%3A%200%0AmemorySwap%3A%20%7B%7D%0AnodeStatusReportFrequency%3A%200s%0AnodeStatusUpdateFrequency%3A%200s%0AprotectKernelDefaults%3A%20true%0ArotateCertificates%3A%20true%0AruntimeRequestTimeout%3A%200s%0AserverTLSBootstrap%3A%20true%0AshutdownGracePeriod%3A%200s%0AshutdownGracePeriodCriticalPods%3A%200s%0AstaticPodPath%3A%20%2Fetc%2Fkubernetes%2Fmanifests%0AstreamingConnectionIdleTimeout%3A%200s%0AsyncFrequency%3A%200s%0AsystemReserved%3A%0A%20%20cpu%3A%20200m%0A%20%20ephemeral-storage%3A%201Gi%0A%20%20memory%3A%20200Mi%0AtlsCipherSuites%3A%0A-%20TLS_AES_128_GCM_SHA256%0A-%20TLS_AES_256_GCM_SHA384%0A-%20TLS_CHACHA20_POLY1305_SHA256%0A-%20TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256%0A-%20TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384%0A-%20TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305%0A-%20TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256%0A-%20TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384%0A-%20TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305%0AvolumePluginDir%3A%20%2Fvar%2Flib%2Fkubelet%2Fvolumeplugins%0AvolumeStatsAggPeriod%3A%200s%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/opt/load-kernel-modules.sh","contents":{"source":"data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0Aset%20-euo%20pipefail%0A%0Amodprobe%20ip_vs%0Amodprobe%20ip_vs_rr%0Amodprobe%20ip_vs_wrr%0Amodprobe%20ip_vs_sh%0A%0Aif%20modinfo%20nf_conntrack_ipv4%20%26%3E%20%2Fdev%2Fnull%3B%20then%0A%20%20modprobe%20nf_conntrack_ipv4%0Aelse%0A%20%20modprobe%20nf_conntrack%0Afi%0A","verification":{}},"mode":493},{"filesystem":"root","path":"/etc/sysctl.d/k8s.conf","contents":{"source":"data:,net.bridge.bridge-nf-call-ip6tables%20%3D%201%0Anet.bridge.bridge-nf-call-iptables%20%3D%201%0Akernel.panic_on_oops%20%3D%201%0Akernel.panic%20%3D%2010%0Anet.ipv4.ip_forward%20%3D%201%0Avm.overcommit_memory%20%3D%201%0Afs.inotify.max_user_watches%20%3D%201048576%0Afs.inotify.max_user_instances%20%3D%208192%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/proc/sys/kernel/panic_on_oops","contents":{"source":"data:,1%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/proc/sys/kernel/panic","contents":{"source":"data:,10%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/proc/sys/vm/overcommit_memory","contents":{"source":"data:,1%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/opt/bin/setup_net_env.sh","contents":{"source":"data:,%23!%2Fusr%2Fbin%2Fenv%20bash%0Aechodate()%20%7B%0A%20%20echo%20%22%5B%24(date%20-Is)%5D%22%20%22%24%40%22%0A%7D%0A%0A%23%20get%20the%20default%20interface%20IP%20address%0ADEFAULT_IFC_IP%3D%24(ip%20-o%20%20route%20get%201%20%7C%20grep%20-oP%20%22src%20%5CK%5CS%2B%22)%0A%0A%23%20get%20the%20full%20hostname%0AFULL_HOSTNAME%3D%24(hostname%20-f)%0A%0Aif%20%5B%20-z%20%22%24%7BDEFAULT_IFC_IP%7D%22%20%5D%0Athen%0A%09echodate%20%22Failed%20to%20get%20IP%20address%20for%20the%20default%20route%20interface%22%0A%09exit%201%0Afi%0A%0A%23%20write%20the%20nodeip_env%20file%0A%23%20we%20need%20the%20line%20below%20because%20flatcar%20has%20the%20same%20string%20%22coreos%22%20in%20that%20file%0Aif%20grep%20-q%20coreos%20%2Fetc%2Fos-release%0Athen%0A%20%20echo%20-e%20%22KUBELET_NODE_IP%3D%24%7BDEFAULT_IFC_IP%7D%5CnKUBELET_HOSTNAME%3D%24%7BFULL_HOSTNAME%7D%22%20%3E%20%2Fetc%2Fkubernetes%2Fnodeip.conf%0Aelif%20%5B%20!%20-d%20%2Fetc%2Fsystemd%2Fsystem%2Fkubelet.service.d%20%5D%0Athen%0A%09echodate%20%22Can't%20find%20kubelet%20service%20extras%20directory%22%0A%09exit%201%0Aelse%0A%20%20echo%20-e%20%22%5BService%5D%5CnEnvironment%3D%5C%22KUBELET_NODE_IP%3D%24%7BDEFAULT_IFC_IP%7D%5C%22%5CnEnvironment%3D%5C%22KUBELET_HOSTNAME%3D%24%7BFULL_HOSTNAME%7D%5C%22%22%20%3E%20%2Fetc%2Fsystemd%2Fsystem%2Fkubelet.service.d%2Fnodeip.conf%0Afi%0A","verification":{}},"mode":493},{"filesystem":"root","path":"/etc/kubernetes/bootstrap-kubelet.conf","contents":{"source":"data:,apiVersion%3A%20v1%0Aclusters%3A%0A-%20cluster%3A%0A%20%20%20%20certificate-authority-data%3A%20LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t%0A%20%20%20%20server%3A%20https%3A%2F%2Fserver%3A443%0A%20%20name%3A%20%22%22%0Acontexts%3A%20null%0Acurrent-context%3A%20%22%22%0Akind%3A%20Config%0Apreferences%3A%20%7B%7D%0Ausers%3A%0A-%20name%3A%20%22%22%0A%20%20user%3A%0A%20%20%20%20token%3A%20my-token%0A","verification":{}},"mode":256},{"filesystem":"root","path":"/etc/kubernetes/cloud-config","contents":{"source":"data:,%7Bvsphere-config%3Atrue%7D%0A","verification":{}},"mode":256},{"filesystem":"root","path":"/etc/kubernetes/pki/ca.crt","contents":{"source":"data:,-----BEGIN%20CERTIFICATE-----%0AMIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV%0ABAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG%0AA1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3%0ADQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0%0ANjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG%0AcmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv%0Ac3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B%0AAQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS%0AR8Od0%2B9Q62Hyny%2BGFwMTb4A%2FKU8mssoHvcceSAAbwfbxFK%2F%2Bs51TobqUnORZrOoT%0AZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk%0AJfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS%2FPlPbUj2q7YnoVLposUBMlgUb%2FCykX3%0AmOoLb4yJJQyA%2FiST6ZxiIEj36D4yWZ5lg7YJl%2BUiiBQHGCnPdGyipqV06ex0heYW%0AcaiW8LWZSUQ93jQ%2BWVCH8hT7DQO1dmsvUmXlq%2FJeAlwQ%2FQIDAQABo4HgMIHdMB0G%0AA1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt%0AhS4P4U7vTfjByC569R7E6KF%2FpH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB%0AMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES%0AMBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv%0AbYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h%0AU9f9sNH0%2F6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k%2FXkDjQm%2B3lzjT0iGR4IxE%2FAo%0AeU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb%2FLnDUjs5Yj9brP0NWzXfYU4%0AUK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm%2Bje6voD%0A58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj%2Bqvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n%0AsH9BBH38%2FSzUmAN4QHSPy1gjqm00OAE8NaYDkh%2FbzE4d7mLGGMWp%2FWE3KPSu82HF%0AkPe6XoSbiLm%2Fkxk32T0%3D%0A-----END%20CERTIFICATE-----%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/etc/hostname","contents":{"source":"data:,node1","verification":{}},"mode":384},{"filesystem":"root","group":{"id":0},"path":"/etc/ssh/sshd_config","user":{"id":0},"contents":{"source":"data:,%23%20Use%20most%20defaults%20for%20sshd%20configuration.%0ASubsystem%20sftp%20internal-sftp%0AClientAliveInterval%20180%0AUseDNS%20no%0AUsePAM%20yes%0APrintLastLog%20no%20%23%20handled%20by%20PAM%0APrintMotd%20no%20%23%20handled%20by%20PAM%0APasswordAuthentication%20no%0AChallengeResponseAuthentication%20no%0A","verification":{}},"mode":384},{"filesystem":"root","path":"/opt/bin/setup.sh","contents":{"source":"data:,%23!%2Fbin%2Fbash%0Aset%20-xeuo%20pipefail%0A%0A%23%20We%20stop%20these%20services%20here%20explicitly%20since%20masking%20only%20removes%20the%20symlinks%20for%20these%20services%20so%20that%20they%20can't%20be%20started.%0A%23%20But%20that%20wouldn't%20%22stop%22%20the%20already%20running%20services%20on%20the%20first%20boot.%0Asystemctl%20stop%20update-engine.service%0Asystemctl%20stop%20locksmithd.service%0Asystemctl%20disable%20setup.service%0A","verification":{}},"mode":493},{"filesystem":"root","path":"/opt/bin/download.sh","contents":{"source":"data:,%23!%2Fbin%2Fbash%0Aset%20-xeuo%20pipefail%0A%0Aopt_bin%3D%2Fopt%2Fbin%0Ausr_local_bin%3D%2Fusr%2Flocal%2Fbin%0Acni_bin_dir%3D%2Fopt%2Fcni%2Fbin%0Amkdir%20-p%20%2Fetc%2Fcni%2Fnet.d%20%2Fetc%2Fkubernetes%2Fdynamic-config-dir%20%2Fetc%2Fkubernetes%2Fmanifests%20%22%24opt_bin%22%20%22%24cni_bin_dir%22%0Aarch%3D%24%7BHOST_ARCH-%7D%0Aif%20%5B%20-z%20%22%24arch%22%20%5D%0Athen%0Acase%20%24(uname%20-m)%20in%0Ax86_64)%0A%20%20%20%20arch%3D%22amd64%22%0A%20%20%20%20%3B%3B%0Aaarch64)%0A%20%20%20%20arch%3D%22arm64%22%0A%20%20%20%20%3B%3B%0A*)%0A%20%20%20%20echo%20%22unsupported%20CPU%20architecture%2C%20exiting%22%0A%20%20%20%20exit%201%0A%20%20%20%20%3B%3B%0Aesac%0Afi%0ACNI_VERSION%3D%22%24%7BCNI_VERSION%3A-v0.8.7%7D%22%0Acni_base_url%3D%22https%3A%2F%2Fgithub.com%2Fcontainernetworking%2Fplugins%2Freleases%2Fdownload%2F%24CNI_VERSION%22%0Acni_filename%3D%22cni-plugins-linux-%24arch-%24CNI_VERSION.tgz%22%0Acurl%20-Lfo%20%22%24cni_bin_dir%2F%24cni_filename%22%20%22%24cni_base_url%2F%24cni_filename%22%0Acni_sum%3D%24(curl%20-Lf%20%22%24cni_base_url%2F%24cni_filename.sha256%22)%0Acd%20%22%24cni_bin_dir%22%0Asha256sum%20-c%20%3C%3C%3C%22%24cni_sum%22%0Atar%20xvf%20%22%24cni_filename%22%0Arm%20-f%20%22%24cni_filename%22%0Acd%20-%0ACRI_TOOLS_RELEASE%3D%22%24%7BCRI_TOOLS_RELEASE%3A-v1.22.0%7D%22%0Acri_tools_base_url%3D%22https%3A%2F%2Fgithub.com%2Fkubernetes-sigs%2Fcri-tools%2Freleases%2Fdownload%2F%24%7BCRI_TOOLS_RELEASE%7D%22%0Acri_tools_filename%3D%22crictl-%24%7BCRI_TOOLS_RELEASE%7D-linux-%24%7Barch%7D.tar.gz%22%0Acurl%20-Lfo%20%22%24opt_bin%2F%24cri_tools_filename%22%20%22%24cri_tools_base_url%2F%24cri_tools_filename%22%0Acri_tools_sum%3D%24(curl%20-Lf%20%22%24cri_tools_base_url%2F%24cri_tools_filename.sha256%22%20%7C%20sed%20's%2F%5C*%5C%2F%2F%2F')%0Acd%20%22%24opt_bin%22%0Asha256sum%20-c%20%3C%3C%3C%22%24cri_tools_sum%22%0Atar%20xvf%20%22%24cri_tools_filename%22%0Arm%20-f%20%22%24cri_tools_filename%22%0Aln%20-sf%20%22%24opt_bin%2Fcrictl%22%20%22%24usr_local_bin%22%2Fcrictl%20%7C%7C%20echo%20%22symbolic%20link%20is%20skipped%22%0Acd%20-%0AKUBE_VERSION%3D%22%24%7BKUBE_VERSION%3A-v1.21.10%7D%22%0Akube_dir%3D%22%24opt_bin%2Fkubernetes-%24KUBE_VERSION%22%0Akube_base_url%3D%22https%3A%2F%2Fstorage.googleapis.com%2Fkubernetes-release%2Frelease%2F%24KUBE_VERSION%2Fbin%2Flinux%2F%24arch%22%0Akube_sum_file%3D%22%24kube_dir%2Fsha256%22%0Amkdir%20-p%20%22%24kube_dir%22%0A%3A%20%3E%22%24kube_sum_file%22%0A%0Afor%20bin%20in%20kubelet%20kubeadm%20kubectl%3B%20do%0A%20%20%20%20curl%20-Lfo%20%22%24kube_dir%2F%24bin%22%20%22%24kube_base_url%2F%24bin%22%0A%20%20%20%20chmod%20%2Bx%20%22%24kube_dir%2F%24bin%22%0A%20%20%20%20sum%3D%24(curl%20-Lf%20%22%24kube_base_url%2F%24bin.sha256%22)%0A%20%20%20%20echo%20%22%24sum%20%20%24kube_dir%2F%24bin%22%20%3E%3E%22%24kube_sum_file%22%0Adone%0Asha256sum%20-c%20%22%24kube_sum_file%22%0A%0Afor%20bin%20in%20kubelet%20kubeadm%20kubectl%3B%20do%0A%20%20%20%20ln%20-sf%20%22%24kube_dir%2F%24bin%22%20%22%24opt_bin%22%2F%24bin%0Adone%0A%0Aif%20%5B%5B%20!%20-x%20%2Fopt%2Fbin%2Fhealth-monitor.sh%20%5D%5D%3B%20then%0A%20%20%20%20curl%20-Lfo%20%2Fopt%2Fbin%2Fhealth-monitor.sh%20https%3A%2F%2Fraw.githubusercontent.com%2Fkubermatic%2Fmachine-controller%2F7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde%2Fpkg%2Fuserdata%2Fscripts%2Fhealth-monitor.sh%0A%20%20%20%20chmod%20%2Bx%20%2Fopt%2Fbin%2Fhealth-monitor.sh%0Afi%0A%0Amkdir%20-p%20%2Fetc%2Fsystemd%2Fsystem%2Fcontainerd.service.d%20%2Fetc%2Fsystemd%2Fsystem%2Fdocker.service.d%0Acat%20%3C%3CEOF%20%7C%20tee%20%2Fetc%2Fsystemd%2Fsystem%2Fcontainerd.service.d%2Fenvironment.conf%20%2Fetc%2Fsystemd%2Fsystem%2Fdocker.service.d%2Fenvironment.conf%0A%5BService%5D%0ARestart%3Dalways%0AEnvironmentFile%3D-%2Fetc%2Fenvironment%0AEOF%0A%0Asystemctl%20daemon-reload%0Asystemctl%20enable%20--now%20docker%0A%0Asystemctl%20disable%20download-script.service%0A","verification":{}},"mode":493},{"filesystem":"root","path":"/etc/docker/daemon.json","contents":{"source":"data:,%7B%22exec-opts%22%3A%5B%22native.cgroupdriver%3Dsystemd%22%5D%2C%22storage-driver%22%3A%22overlay2%22%2C%22log-driver%22%3A%22json-file%22%2C%22log-opts%22%3A%7B%22max-file%22%3A%225%22%2C%22max-size%22%3A%22100m%22%7D%7D%0A","verification":{}},"mode":420},{"filesystem":"root","path":"/etc/crictl.yaml","contents":{"source":"data:,runtime-endpoint%3A%20unix%3A%2F%2F%2Frun%2Fcontainerd%2Fcontainerd.sock%0A","verification":{}},"mode":420}]},"systemd":{"units":[{"mask":true,"name":"update-engine.service"},{"mask":true,"name":"locksmithd.service"},{"contents":"[Install]\nWantedBy=multi-user.target\n\n[Unit]\nRequires=network-online.target\nRequires=nodeip.service\nAfter=network-online.target\nAfter=nodeip.service\n\nDescription=Service responsible for configuring the flatcar machine\n\n[Service]\nType=oneshot\nRemainAfterExit=true\nEnvironmentFile=-/etc/environment\nExecStart=/opt/bin/setup.sh\n","enabled":true,"name":"setup.service"},{"contents":"[Unit]\nRequires=network-online.target\nRequires=setup.service\nAfter=network-online.target\nAfter=setup.service\n[Service]\nType=oneshot\nEnvironmentFile=-/etc/environment\nExecStart=/opt/bin/download.sh\n[Install]\nWantedBy=multi-user.target\n","enabled":true,"name":"download-script.service"},{"contents":"[Unit]\nRequires=kubelet.service\nAfter=kubelet.service\n\n[Service]\nExecStart=/opt/bin/health-monitor.sh kubelet\n\n[Install]\nWantedBy=multi-user.target\n","dropins":[{"contents":"[Unit]\nRequires=download-script.service\nAfter=download-script.service\n","name":"40-download.conf"}],"enabled":true,"name":"kubelet-healthcheck.service"},{"contents":"[Unit]\nDescription=Setup Kubelet Node IP Env\nRequires=network-online.target\nAfter=network-online.target\n\n[Service]\nExecStart=/opt/bin/setup_net_env.sh\nRemainAfterExit=yes\nType=oneshot\n[Install]\nWantedBy=multi-user.target\n","enabled":true,"name":"nodeip.service"},{"contents":"[Unit]\nAfter=docker.service\nRequires=docker.service\n\nDescription=kubelet: The Kubernetes Node Agent\nDocumentation=https://kubernetes.io/docs/home/\n\n[Service]\nUser=root\nRestart=always\nStartLimitInterval=0\nRestartSec=10\nCPUAccounting=true\nMemoryAccounting=true\n\nEnvironment=\"PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/\"\nEnvironmentFile=-/etc/environment\n\nExecStartPre=/bin/bash /opt/load-kernel-modules.sh\n\nExecStartPre=/bin/bash /opt/bin/setup_net_env.sh\nExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \\\n  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \\\n  --kubeconfig=/var/lib/kubelet/kubeconfig \\\n  --config=/etc/kubernetes/kubelet.conf \\\n  --cert-dir=/etc/kubernetes/pki \\\n  --cloud-provider=vsphere \\\n  --cloud-config=/etc/kubernetes/cloud-config \\\n  --hostname-override=node1 \\\n  --exit-on-lock-contention \\\n  --lock-file=/tmp/kubelet.lock \\\n  --container-runtime=docker \\\n  --container-runtime-endpoint=unix:///var/run/dockershim.sock \\\n  --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \\\n  --feature-gates=DynamicKubeletConfig=true \\\n  --network-plugin=cni \\\n  --node-ip ${KUBELET_NODE_IP}\n\n[Install]\nWantedBy=multi-user.target\n","dropins":[{"contents":"[Service]\nEnvironmentFile=/etc/kubernetes/nodeip.conf\n","name":"10-nodeip.conf"},{"contents":"[Unit]\nRequires=download-script.service\nAfter=download-script.service\n","name":"40-download.conf"}],"enabled":true,"name":"kubelet.service"}]}}
\ No newline at end of file
diff --git a/pkg/userdata/helper/common_test.go b/pkg/userdata/helper/common_test.go
index 1c1d6189..082a49bc 100644
--- a/pkg/userdata/helper/common_test.go
+++ b/pkg/userdata/helper/common_test.go
@@ -26,7 +26,6 @@ var update = flag.Bool("update", false, "update testdata files")
 
 var (
 	versions = []*semver.Version{
-		semver.MustParse("v1.21.10"),
 		semver.MustParse("v1.22.7"),
 		semver.MustParse("v1.23.5"),
 		semver.MustParse("v1.24.0"),
diff --git a/pkg/userdata/helper/kubelet_test.go b/pkg/userdata/helper/kubelet_test.go
index 5b7326a1..18b02eff 100644
--- a/pkg/userdata/helper/kubelet_test.go
+++ b/pkg/userdata/helper/kubelet_test.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/Masterminds/semver/v3"
 
+	"github.com/kubermatic/machine-controller/pkg/cloudprovider/util"
 	testhelper "github.com/kubermatic/machine-controller/pkg/test"
 
 	corev1 "k8s.io/api/core/v1"
@@ -36,6 +37,7 @@ type kubeletFlagTestCase struct {
 	hostname         string
 	cloudProvider    string
 	external         bool
+	ipFamily         util.IPFamily
 	pauseImage       string
 	initialTaints    []corev1.Taint
 	extraFlags       []string
@@ -117,6 +119,7 @@ func TestKubeletSystemdUnit(t *testing.T) {
 				test.hostname,
 				test.dnsIPs,
 				test.external,
+				test.ipFamily,
 				test.pauseImage,
 				test.initialTaints,
 				test.extraFlags,
diff --git a/pkg/userdata/helper/testdata/download_binaries_v1.21.10.golden b/pkg/userdata/helper/testdata/download_binaries_v1.21.10.golden
deleted file mode 100644
index 75ed990e..00000000
--- a/pkg/userdata/helper/testdata/download_binaries_v1.21.10.golden
+++ /dev/null
@@ -1,17 +0,0 @@
-mkdir -p /opt/bin/
-mkdir -p /var/lib/calico
-mkdir -p /etc/kubernetes/manifests
-mkdir -p /etc/cni/net.d
-mkdir -p /opt/cni/bin
-if [ ! -f /opt/cni/bin/loopback ]; then
-    curl -L https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz | tar -xvzC /opt/cni/bin -f -
-fi
-if [ ! -f /opt/bin/kubelet ]; then
-    curl -Lfo /opt/bin/kubelet https://storage.googleapis.com/kubernetes-release/release/v1.21.10/bin/linux/amd64/kubelet
-    chmod +x /opt/bin/kubelet
-fi
-
-if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-    curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/8b5b66e4910a6228dfaecccaa0a3b05ec4902f8e/pkg/userdata/scripts/health-monitor.sh
-    chmod +x /opt/bin/health-monitor.sh
-fi
diff --git a/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10-external.golden b/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10-external.golden
deleted file mode 100644
index 435cefdf..00000000
--- a/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10-external.golden
+++ /dev/null
@@ -1,39 +0,0 @@
-[Unit]
-After=docker.service
-Requires=docker.service
-
-Description=kubelet: The Kubernetes Node Agent
-Documentation=https://kubernetes.io/docs/home/
-
-[Service]
-User=root
-Restart=always
-StartLimitInterval=0
-RestartSec=10
-CPUAccounting=true
-MemoryAccounting=true
-
-Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-EnvironmentFile=-/etc/environment
-
-ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-  --kubeconfig=/var/lib/kubelet/kubeconfig \
-  --config=/etc/kubernetes/kubelet.conf \
-  --cert-dir=/etc/kubernetes/pki \
-  --cloud-provider=external \
-  --hostname-override=some-test-node \
-  --exit-on-lock-contention \
-  --lock-file=/tmp/kubelet.lock \
-  --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-  --feature-gates=DynamicKubeletConfig=true \
-  --network-plugin=cni \
-  --node-ip ${KUBELET_NODE_IP}
-
-[Install]
-WantedBy=multi-user.target
\ No newline at end of file
diff --git a/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10.golden b/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10.golden
deleted file mode 100644
index e1c0b622..00000000
--- a/pkg/userdata/helper/testdata/kublet_systemd_unit_version-v1.21.10.golden
+++ /dev/null
@@ -1,38 +0,0 @@
-[Unit]
-After=docker.service
-Requires=docker.service
-
-Description=kubelet: The Kubernetes Node Agent
-Documentation=https://kubernetes.io/docs/home/
-
-[Service]
-User=root
-Restart=always
-StartLimitInterval=0
-RestartSec=10
-CPUAccounting=true
-MemoryAccounting=true
-
-Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-EnvironmentFile=-/etc/environment
-
-ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-  --kubeconfig=/var/lib/kubelet/kubeconfig \
-  --config=/etc/kubernetes/kubelet.conf \
-  --cert-dir=/etc/kubernetes/pki \
-  --hostname-override=some-test-node \
-  --exit-on-lock-contention \
-  --lock-file=/tmp/kubelet.lock \
-  --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-  --feature-gates=DynamicKubeletConfig=true \
-  --network-plugin=cni \
-  --node-ip ${KUBELET_NODE_IP}
-
-[Install]
-WantedBy=multi-user.target
\ No newline at end of file
diff --git a/pkg/userdata/rhel/provider_test.go b/pkg/userdata/rhel/provider_test.go
index 82c1bcae..25051f24 100644
--- a/pkg/userdata/rhel/provider_test.go
+++ b/pkg/userdata/rhel/provider_test.go
@@ -99,15 +99,6 @@ func TestUserDataGeneration(t *testing.T) {
 	t.Parallel()
 
 	tests := []userDataTestCase{
-		{
-			name: "kubelet-v1.21-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
-				},
-			},
-		},
 		{
 			name: "kubelet-v1.22-aws",
 			spec: clusterv1alpha1.MachineSpec{
@@ -136,25 +127,6 @@ func TestUserDataGeneration(t *testing.T) {
 			},
 			externalCloudProvider: true,
 		},
-		{
-			name: "kubelet-v1.24-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.24.0",
-				},
-			},
-		},
-		{
-			name: "kubelet-v1.24-aws-external",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.24.0",
-				},
-			},
-			externalCloudProvider: true,
-		},
 		{
 			name: "kubelet-v1.23-vsphere",
 			spec: clusterv1alpha1.MachineSpec{
@@ -193,6 +165,25 @@ func TestUserDataGeneration(t *testing.T) {
 			registryMirrors:   "https://registry.docker-cn.com",
 			pauseImage:        "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
+		{
+			name: "kubelet-v1.24-aws",
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: "1.24.0",
+				},
+			},
+		},
+		{
+			name: "kubelet-v1.24-aws-external",
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: "1.24.0",
+				},
+			},
+			externalCloudProvider: true,
+		},
 		{
 			name: "kubelet-v1.22-nutanix",
 			spec: clusterv1alpha1.MachineSpec{
diff --git a/pkg/userdata/rhel/testdata/kubelet-v1.21-aws.yaml b/pkg/userdata/rhel/testdata/kubelet-v1.21-aws.yaml
deleted file mode 100644
index ccaf019e..00000000
--- a/pkg/userdata/rhel/testdata/kubelet-v1.21-aws.yaml
+++ /dev/null
@@ -1,481 +0,0 @@
-#cloud-config
-bootcmd:
-- modprobe ip_tables
-
-
-ssh_pwauth: false
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/opt/load-kernel-modules.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: "/etc/sysctl.d/k8s.conf"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: /etc/selinux/config
-  content: |
-    # This file controls the state of SELinux on the system.
-    # SELINUX= can take one of these three values:
-    #     enforcing - SELinux security policy is enforced.
-    #     permissive - SELinux prints warnings instead of enforcing.
-    #     disabled - No SELinux policy is loaded.
-    SELINUX=permissive
-    # SELINUXTYPE= can take one of three two values:
-    #     targeted - Targeted processes are protected,
-    #     minimum - Modification of targeted policy. Only selected processes are protected.
-    #     mls - Multi Level Security protection.
-    SELINUXTYPE=targeted
-
-- path: "/opt/bin/setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-
-    setenforce 0 || true
-    systemctl restart systemd-modules-load.service
-    sysctl --system
-
-    yum install -y \
-      device-mapper-persistent-data \
-      lvm2 \
-      ebtables \
-      ethtool \
-      nfs-utils \
-      bash-completion \
-      sudo \
-      socat \
-      wget \
-      curl \
-      ipvsadm
-
-    yum install -y yum-utils
-    yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
-    yum-config-manager --save --setopt=docker-ce-stable.module_hotfixes=true
-
-    mkdir -p /etc/systemd/system/containerd.service.d /etc/systemd/system/docker.service.d
-
-    cat <<EOF | tee /etc/systemd/system/containerd.service.d/environment.conf /etc/systemd/system/docker.service.d/environment.conf
-    [Service]
-    Restart=always
-    EnvironmentFile=-/etc/environment
-    EOF
-
-    yum install -y \
-        docker-ce-cli-20.10* \
-        containerd.io-1.4* \
-        docker-ce-20.10* \
-        yum-plugin-versionlock
-    yum versionlock add docker-ce* containerd.io
-
-    systemctl daemon-reload
-    systemctl enable --now docker
-
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-    DEFAULT_IFC_NAME=$(ip -o route get 1  | grep -oP "dev \K\S+")
-    echo NETWORKING_IPV6=yes >> /etc/sysconfig/network
-    echo IPV6INIT=yes >> /etc/sysconfig/network-scripts/ifcfg-$DEFAULT_IFC_NAME
-    echo DHCPV6C=yes >> /etc/sysconfig/network-scripts/ifcfg-$DEFAULT_IFC_NAME
-    ifdown $DEFAULT_IFC_NAME && ifup $DEFAULT_IFC_NAME
-
-    # set kubelet nodeip environment variable
-    mkdir -p /etc/systemd/system/kubelet.service.d/
-    /opt/bin/setup_net_env.sh
-
-    systemctl disable --now firewalld || true
-    systemctl enable --now kubelet
-    systemctl enable --now --no-block kubelet-healthcheck.service
-    systemctl disable setup.service
-    systemctl disable disable-nm-cloud-setup.service
-
-- path: "/opt/bin/supervise.sh"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    while ! "$@"; do
-      sleep 1
-    done
-
-- path: "/opt/disable-swap.sh"
-  permissions: "0755"
-  content: |
-    # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud
-    # providers swap gets enabled on reboot or after the setup script has finished executing.
-    sed -i.orig '/.*swap.*/d' /etc/fstab
-    swapoff -a
-
-- path: "/etc/systemd/system/kubelet.service"
-  content: |
-    [Unit]
-    After=docker.service
-    Requires=docker.service
-
-    Description=kubelet: The Kubernetes Node Agent
-    Documentation=https://kubernetes.io/docs/home/
-
-    [Service]
-    User=root
-    Restart=always
-    StartLimitInterval=0
-    RestartSec=10
-    CPUAccounting=true
-    MemoryAccounting=true
-
-    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-    EnvironmentFile=-/etc/environment
-
-    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-    ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-      --kubeconfig=/var/lib/kubelet/kubeconfig \
-      --config=/etc/kubernetes/kubelet.conf \
-      --cert-dir=/etc/kubernetes/pki \
-      --cloud-provider=aws \
-      --cloud-config=/etc/kubernetes/cloud-config \
-      --exit-on-lock-contention \
-      --lock-file=/tmp/kubelet.lock \
-      --container-runtime=docker \
-      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
-      --network-plugin=cni \
-      --node-ip ${KUBELET_NODE_IP}
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: "/etc/kubernetes/cloud-config"
-  permissions: "0600"
-  content: |
-    {aws-config:true}
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: "/etc/kubernetes/bootstrap-kubelet.conf"
-  permissions: "0600"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: "/etc/kubernetes/kubelet.conf"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: "/etc/kubernetes/pki/ca.crt"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-- path: "/etc/systemd/system/setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
-
-- path: "/etc/profile.d/opt-bin-path.sh"
-  permissions: "0644"
-  content: |
-    export PATH="/opt/bin:$PATH"
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/systemd/system/kubelet-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=kubelet.service
-    After=kubelet.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh kubelet
-
-    [Install]
-    WantedBy=multi-user.target
-
-
-- path: "/opt/bin/disable-nm-cloud-setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    if systemctl status 'nm-cloud-setup.timer' 2> /dev/null | grep -Fq "Active:"; then
-            systemctl stop nm-cloud-setup.timer
-            systemctl disable nm-cloud-setup.service
-            systemctl disable nm-cloud-setup.timer
-            reboot
-    fi
-
-- path: "/etc/systemd/system/disable-nm-cloud-setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/disable-nm-cloud-setup
-
-rh_subscription:
-    username: ""
-    password: ""
-    auto-attach: false
-
-runcmd:
-- systemctl enable --now setup.service
-- systemctl enable --now disable-nm-cloud-setup.service
diff --git a/pkg/userdata/rockylinux/provider_test.go b/pkg/userdata/rockylinux/provider_test.go
index 3927c846..e709a2ee 100644
--- a/pkg/userdata/rockylinux/provider_test.go
+++ b/pkg/userdata/rockylinux/provider_test.go
@@ -100,40 +100,49 @@ func TestUserDataGeneration(t *testing.T) {
 
 	tests := []userDataTestCase{
 		{
-			name: "kubelet-v1.21-aws",
+			name: "kubelet-v1.22-aws",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.22.7",
 				},
 			},
 		},
 		{
-			name: "kubelet-v1.21-aws-external",
+			name: "kubelet-v1.23-aws",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
+				},
+			},
+		},
+		{
+			name: "kubelet-v1.23-aws-external",
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: "1.23.5",
 				},
 			},
 			externalCloudProvider: true,
 		},
 		{
-			name: "kubelet-v1.21-vsphere",
+			name: "kubelet-v1.23-vsphere",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName: stringPtr("vsphere"),
 		},
 		{
-			name: "kubelet-v1.21-vsphere-proxy",
+			name: "kubelet-v1.23-vsphere-proxy",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName:  stringPtr("vsphere"),
@@ -143,11 +152,11 @@ func TestUserDataGeneration(t *testing.T) {
 			pauseImage:         "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
-			name: "kubelet-v1.21-vsphere-mirrors",
+			name: "kubelet-v1.23-vsphere-mirrors",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
 			cloudProviderName: stringPtr("vsphere"),
@@ -157,22 +166,14 @@ func TestUserDataGeneration(t *testing.T) {
 			pauseImage:        "192.168.100.100:5000/kubernetes/pause:v3.1",
 		},
 		{
-			name: "kubelet-v1.22-aws",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.22.7",
-				},
-			},
-		},
-		{
-			name: "kubelet-v1.23-aws",
+			name: "kubelet-v1.23-nutanix",
 			spec: clusterv1alpha1.MachineSpec{
 				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
 				Versions: clusterv1alpha1.MachineVersionInfo{
 					Kubelet: "1.23.5",
 				},
 			},
+			cloudProviderName: stringPtr("nutanix"),
 		},
 		{
 			name: "kubelet-v1.24-aws",
@@ -183,16 +184,6 @@ func TestUserDataGeneration(t *testing.T) {
 				},
 			},
 		},
-		{
-			name: "kubelet-v1.23-nutanix",
-			spec: clusterv1alpha1.MachineSpec{
-				ObjectMeta: metav1.ObjectMeta{Name: "node1"},
-				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.23.5",
-				},
-			},
-			cloudProviderName: stringPtr("nutanix"),
-		},
 	}
 
 	defaultCloudProvider := &fakeCloudConfigProvider{
diff --git a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws.yaml b/pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws.yaml
deleted file mode 100644
index 733f76cd..00000000
--- a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws.yaml
+++ /dev/null
@@ -1,441 +0,0 @@
-#cloud-config
-bootcmd:
-- modprobe ip_tables
-
-
-ssh_pwauth: false
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/opt/load-kernel-modules.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: "/etc/sysctl.d/k8s.conf"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: /etc/selinux/config
-  content: |
-    # This file controls the state of SELinux on the system.
-    # SELINUX= can take one of these three values:
-    #     enforcing - SELinux security policy is enforced.
-    #     permissive - SELinux prints warnings instead of enforcing.
-    #     disabled - No SELinux policy is loaded.
-    SELINUX=permissive
-    # SELINUXTYPE= can take one of three two values:
-    #     targeted - Targeted processes are protected,
-    #     minimum - Modification of targeted policy. Only selected processes are protected.
-    #     mls - Multi Level Security protection.
-    SELINUXTYPE=targeted
-
-- path: "/opt/bin/setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-
-    setenforce 0 || true
-    systemctl restart systemd-modules-load.service
-    sysctl --system
-
-    yum install -y \
-      device-mapper-persistent-data \
-      lvm2 \
-      ebtables \
-      ethtool \
-      nfs-utils \
-      bash-completion \
-      sudo \
-      socat \
-      wget \
-      curl \
-      tar \
-      ipvsadm
-
-    yum install -y yum-utils
-    yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
-    yum-config-manager --save --setopt=docker-ce-stable.module_hotfixes=true
-
-    mkdir -p /etc/systemd/system/containerd.service.d /etc/systemd/system/docker.service.d
-
-    cat <<EOF | tee /etc/systemd/system/containerd.service.d/environment.conf /etc/systemd/system/docker.service.d/environment.conf
-    [Service]
-    Restart=always
-    EnvironmentFile=-/etc/environment
-    EOF
-
-    yum install -y \
-        docker-ce-cli-20.10* \
-        containerd.io-1.4* \
-        docker-ce-20.10* \
-        yum-plugin-versionlock
-    yum versionlock add docker-ce* containerd.io
-
-    systemctl daemon-reload
-    systemctl enable --now docker
-
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-    # set kubelet nodeip environment variable
-    mkdir -p /etc/systemd/system/kubelet.service.d/
-    /opt/bin/setup_net_env.sh
-
-    systemctl disable --now firewalld || true
-    systemctl enable --now kubelet
-    systemctl enable --now --no-block kubelet-healthcheck.service
-    systemctl disable setup.service
-
-- path: "/opt/bin/supervise.sh"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    while ! "$@"; do
-      sleep 1
-    done
-
-- path: "/opt/disable-swap.sh"
-  permissions: "0755"
-  content: |
-    # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud
-    # providers swap gets enabled on reboot or after the setup script has finished executing.
-    sed -i.orig '/.*swap.*/d' /etc/fstab
-    swapoff -a
-
-- path: "/etc/systemd/system/kubelet.service"
-  content: |
-    [Unit]
-    After=docker.service
-    Requires=docker.service
-
-    Description=kubelet: The Kubernetes Node Agent
-    Documentation=https://kubernetes.io/docs/home/
-
-    [Service]
-    User=root
-    Restart=always
-    StartLimitInterval=0
-    RestartSec=10
-    CPUAccounting=true
-    MemoryAccounting=true
-
-    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-    EnvironmentFile=-/etc/environment
-
-    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-    ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-      --kubeconfig=/var/lib/kubelet/kubeconfig \
-      --config=/etc/kubernetes/kubelet.conf \
-      --cert-dir=/etc/kubernetes/pki \
-      --cloud-provider=aws \
-      --cloud-config=/etc/kubernetes/cloud-config \
-      --exit-on-lock-contention \
-      --lock-file=/tmp/kubelet.lock \
-      --container-runtime=docker \
-      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
-      --network-plugin=cni \
-      --node-ip ${KUBELET_NODE_IP}
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: "/etc/kubernetes/cloud-config"
-  permissions: "0600"
-  content: |
-    {aws-config:true}
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: "/etc/kubernetes/bootstrap-kubelet.conf"
-  permissions: "0600"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: "/etc/kubernetes/kubelet.conf"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: "/etc/kubernetes/pki/ca.crt"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-- path: "/etc/systemd/system/setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
-
-- path: "/etc/profile.d/opt-bin-path.sh"
-  permissions: "0644"
-  content: |
-    export PATH="/opt/bin:$PATH"
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/systemd/system/kubelet-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=kubelet.service
-    After=kubelet.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh kubelet
-
-    [Install]
-    WantedBy=multi-user.target
-
-
-runcmd:
-- systemctl enable --now setup.service
diff --git a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws-external.yaml b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-aws-external.yaml
similarity index 98%
rename from pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws-external.yaml
rename to pkg/userdata/rockylinux/testdata/kubelet-v1.23-aws-external.yaml
index 379993a0..1621348e 100644
--- a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-aws-external.yaml
+++ b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-aws-external.yaml
@@ -144,7 +144,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -230,8 +230,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-mirrors.yaml b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-mirrors.yaml
similarity index 99%
rename from pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-mirrors.yaml
rename to pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-mirrors.yaml
index a9f0f212..5524b8cd 100644
--- a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-mirrors.yaml
+++ b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-mirrors.yaml
@@ -157,7 +157,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -247,8 +247,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-proxy.yaml b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-proxy.yaml
similarity index 99%
rename from pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-proxy.yaml
rename to pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-proxy.yaml
index 36f5e4ac..931fdde4 100644
--- a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere-proxy.yaml
+++ b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere-proxy.yaml
@@ -157,7 +157,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -247,8 +247,6 @@ write_files:
       --pod-infra-container-image=192.168.100.100:5000/kubernetes/pause:v3.1 \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere.yaml b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere.yaml
similarity index 98%
rename from pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere.yaml
rename to pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere.yaml
index 2a373b37..e701f596 100644
--- a/pkg/userdata/rockylinux/testdata/kubelet-v1.21-vsphere.yaml
+++ b/pkg/userdata/rockylinux/testdata/kubelet-v1.23-vsphere.yaml
@@ -149,7 +149,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -238,8 +238,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/sles/provider_test.go b/pkg/userdata/sles/provider_test.go
index 302344db..ba589e58 100644
--- a/pkg/userdata/sles/provider_test.go
+++ b/pkg/userdata/sles/provider_test.go
@@ -126,7 +126,6 @@ type userDataTestCase struct {
 
 func simpleVersionTests() []userDataTestCase {
 	versions := []*semver.Version{
-		semver.MustParse("v1.21.10"),
 		semver.MustParse("v1.22.7"),
 		semver.MustParse("v1.23.5"),
 		semver.MustParse("v1.24.0"),
diff --git a/pkg/userdata/sles/testdata/version-1.21.10.yaml b/pkg/userdata/sles/testdata/version-1.21.10.yaml
deleted file mode 100644
index 2c781afe..00000000
--- a/pkg/userdata/sles/testdata/version-1.21.10.yaml
+++ /dev/null
@@ -1,425 +0,0 @@
-#cloud-config
-
-hostname: node1
-
-
-ssh_pwauth: false
-ssh_authorized_keys:
-- "ssh-rsa AAABBB"
-
-write_files:
-
-- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
-  content: |
-    [Journal]
-    SystemMaxUse=5G
-
-
-- path: "/opt/load-kernel-modules.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    set -euo pipefail
-
-    modprobe ip_vs
-    modprobe ip_vs_rr
-    modprobe ip_vs_wrr
-    modprobe ip_vs_sh
-
-    if modinfo nf_conntrack_ipv4 &> /dev/null; then
-      modprobe nf_conntrack_ipv4
-    else
-      modprobe nf_conntrack
-    fi
-
-
-- path: "/etc/sysctl.d/k8s.conf"
-  content: |
-    net.bridge.bridge-nf-call-ip6tables = 1
-    net.bridge.bridge-nf-call-iptables = 1
-    kernel.panic_on_oops = 1
-    kernel.panic = 10
-    net.ipv4.ip_forward = 1
-    vm.overcommit_memory = 1
-    fs.inotify.max_user_watches = 1048576
-    fs.inotify.max_user_instances = 8192
-
-
-- path: "/opt/bin/setup"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    systemctl restart systemd-modules-load.service
-    sysctl --system
-
-    zypper --non-interactive --quiet --color install ebtables \
-      ceph-common \
-      e2fsprogs \
-      jq \
-      socat \
-      ipvsadm
-
-    opt_bin=/opt/bin
-    usr_local_bin=/usr/local/bin
-    cni_bin_dir=/opt/cni/bin
-    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
-    arch=${HOST_ARCH-}
-    if [ -z "$arch" ]
-    then
-    case $(uname -m) in
-    x86_64)
-        arch="amd64"
-        ;;
-    aarch64)
-        arch="arm64"
-        ;;
-    *)
-        echo "unsupported CPU architecture, exiting"
-        exit 1
-        ;;
-    esac
-    fi
-    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
-    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
-    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
-    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
-    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
-    cd "$cni_bin_dir"
-    sha256sum -c <<<"$cni_sum"
-    tar xvf "$cni_filename"
-    rm -f "$cni_filename"
-    cd -
-    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
-    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
-    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
-    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
-    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
-    cd "$opt_bin"
-    sha256sum -c <<<"$cri_tools_sum"
-    tar xvf "$cri_tools_filename"
-    rm -f "$cri_tools_filename"
-    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
-    cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
-    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
-    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
-    kube_sum_file="$kube_dir/sha256"
-    mkdir -p "$kube_dir"
-    : >"$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
-        chmod +x "$kube_dir/$bin"
-        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
-        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
-    done
-    sha256sum -c "$kube_sum_file"
-
-    for bin in kubelet kubeadm kubectl; do
-        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
-    done
-
-    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
-        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
-        chmod +x /opt/bin/health-monitor.sh
-    fi
-
-
-    # set kubelet nodeip environment variable
-    /opt/bin/setup_net_env.sh
-
-    systemctl enable --now docker
-    systemctl enable --now kubelet
-    systemctl enable --now --no-block kubelet-healthcheck.service
-    systemctl enable --now --no-block docker-healthcheck.service
-
-- path: "/opt/bin/supervise.sh"
-  permissions: "0755"
-  content: |
-    #!/bin/bash
-    set -xeuo pipefail
-    while ! "$@"; do
-      sleep 1
-    done
-
-- path: "/opt/disable-swap.sh"
-  permissions: "0755"
-  content: |
-    # Make sure we always disable swap - Otherwise the kubelet won't start as for some cloud
-    # providers swap gets enabled on reboot or after the setup script has finished executing.
-    cp /etc/fstab /etc/fstab.orig
-    cat /etc/fstab.orig | awk '$3 ~ /^swap$/ && $1 !~ /^#/ {$0="# commented out by cloudinit\n#"$0} 1' > /etc/fstab.noswap
-    mv /etc/fstab.noswap /etc/fstab
-    swapoff -a
-
-- path: "/etc/systemd/system/kubelet.service"
-  content: |
-    [Unit]
-    After=docker.service
-    Requires=docker.service
-
-    Description=kubelet: The Kubernetes Node Agent
-    Documentation=https://kubernetes.io/docs/home/
-
-    [Service]
-    User=root
-    Restart=always
-    StartLimitInterval=0
-    RestartSec=10
-    CPUAccounting=true
-    MemoryAccounting=true
-
-    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
-    EnvironmentFile=-/etc/environment
-
-    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
-
-    ExecStartPre=/bin/bash /opt/disable-swap.sh
-
-    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
-    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
-      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
-      --kubeconfig=/var/lib/kubelet/kubeconfig \
-      --config=/etc/kubernetes/kubelet.conf \
-      --cert-dir=/etc/kubernetes/pki \
-      --hostname-override=node1 \
-      --exit-on-lock-contention \
-      --lock-file=/tmp/kubelet.lock \
-      --container-runtime=docker \
-      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
-      --network-plugin=cni \
-      --node-ip ${KUBELET_NODE_IP}
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: "/etc/systemd/system/kubelet.service.d/extras.conf"
-  content: |
-    [Service]
-    Environment="KUBELET_EXTRA_ARGS=--resolv-conf=/var/run/netconfig/resolv.conf"
-
-- path: "/etc/kubernetes/cloud-config"
-  permissions: "0600"
-  content: |
-
-
-- path: "/opt/bin/setup_net_env.sh"
-  permissions: "0755"
-  content: |
-    #!/usr/bin/env bash
-    echodate() {
-      echo "[$(date -Is)]" "$@"
-    }
-
-    # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
-
-    # get the full hostname
-    FULL_HOSTNAME=$(hostname -f)
-
-    if [ -z "${DEFAULT_IFC_IP}" ]
-    then
-    	echodate "Failed to get IP address for the default route interface"
-    	exit 1
-    fi
-
-    # write the nodeip_env file
-    # we need the line below because flatcar has the same string "coreos" in that file
-    if grep -q coreos /etc/os-release
-    then
-      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
-    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
-    then
-    	echodate "Can't find kubelet service extras directory"
-    	exit 1
-    else
-      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
-    fi
-
-
-- path: "/etc/kubernetes/bootstrap-kubelet.conf"
-  permissions: "0600"
-  content: |
-    apiVersion: v1
-    clusters:
-    - cluster:
-        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
-        server: https://server:443
-      name: ""
-    contexts: null
-    current-context: ""
-    kind: Config
-    preferences: {}
-    users:
-    - name: ""
-      user:
-        token: my-token
-
-
-- path: "/etc/kubernetes/pki/ca.crt"
-  content: |
-    -----BEGIN CERTIFICATE-----
-    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
-    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
-    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
-    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
-    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
-    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
-    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
-    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
-    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
-    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
-    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
-    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
-    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
-    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
-    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
-    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
-    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
-    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
-    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
-    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
-    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
-    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
-    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
-    kPe6XoSbiLm/kxk32T0=
-    -----END CERTIFICATE-----
-
-- path: "/etc/systemd/system/setup.service"
-  permissions: "0644"
-  content: |
-    [Install]
-    WantedBy=multi-user.target
-
-    [Unit]
-    Requires=network-online.target
-    After=network-online.target
-
-    [Service]
-    Type=oneshot
-    RemainAfterExit=true
-    EnvironmentFile=-/etc/environment
-    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
-
-- path: "/etc/kubernetes/kubelet.conf"
-  content: |
-    apiVersion: kubelet.config.k8s.io/v1beta1
-    authentication:
-      anonymous:
-        enabled: false
-      webhook:
-        cacheTTL: 0s
-        enabled: true
-      x509:
-        clientCAFile: /etc/kubernetes/pki/ca.crt
-    authorization:
-      mode: Webhook
-      webhook:
-        cacheAuthorizedTTL: 0s
-        cacheUnauthorizedTTL: 0s
-    cgroupDriver: systemd
-    clusterDNS:
-    - 10.10.10.10
-    clusterDomain: cluster.local
-    containerLogMaxSize: 100Mi
-    cpuManagerReconcilePeriod: 0s
-    evictionHard:
-      imagefs.available: 15%
-      memory.available: 100Mi
-      nodefs.available: 10%
-      nodefs.inodesFree: 5%
-    evictionPressureTransitionPeriod: 0s
-    featureGates:
-      RotateKubeletServerCertificate: true
-    fileCheckFrequency: 0s
-    httpCheckFrequency: 0s
-    imageMinimumGCAge: 0s
-    kind: KubeletConfiguration
-    kubeReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    logging:
-      flushFrequency: 0
-      options:
-        json:
-          infoBufferSize: "0"
-      verbosity: 0
-    memorySwap: {}
-    nodeStatusReportFrequency: 0s
-    nodeStatusUpdateFrequency: 0s
-    protectKernelDefaults: true
-    rotateCertificates: true
-    runtimeRequestTimeout: 0s
-    serverTLSBootstrap: true
-    shutdownGracePeriod: 0s
-    shutdownGracePeriodCriticalPods: 0s
-    staticPodPath: /etc/kubernetes/manifests
-    streamingConnectionIdleTimeout: 0s
-    syncFrequency: 0s
-    systemReserved:
-      cpu: 200m
-      ephemeral-storage: 1Gi
-      memory: 200Mi
-    tlsCipherSuites:
-    - TLS_AES_128_GCM_SHA256
-    - TLS_AES_256_GCM_SHA384
-    - TLS_CHACHA20_POLY1305_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
-    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
-    volumePluginDir: /var/lib/kubelet/volumeplugins
-    volumeStatsAggPeriod: 0s
-
-
-- path: "/etc/profile.d/opt-bin-path.sh"
-  permissions: "0644"
-  content: |
-    export PATH="/opt/bin:$PATH"
-
-- path: /etc/docker/daemon.json
-  permissions: "0644"
-  content: |
-    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
-
-- path: /etc/systemd/system/kubelet-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=kubelet.service
-    After=kubelet.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh kubelet
-
-    [Install]
-    WantedBy=multi-user.target
-
-
-- path: /etc/systemd/system/docker-healthcheck.service
-  permissions: "0644"
-  content: |
-    [Unit]
-    Requires=docker.service
-    After=docker.service
-
-    [Service]
-    ExecStart=/opt/bin/health-monitor.sh container-runtime
-
-    [Install]
-    WantedBy=multi-user.target
-
-- path: /etc/systemd/system/docker.service.d/environment.conf
-  permissions: "0644"
-  content: |
-    [Service]
-    EnvironmentFile=-/etc/environment
-
-runcmd:
-- systemctl start setup.service
diff --git a/pkg/userdata/ubuntu/provider_test.go b/pkg/userdata/ubuntu/provider_test.go
index 47914c90..14c230c6 100644
--- a/pkg/userdata/ubuntu/provider_test.go
+++ b/pkg/userdata/ubuntu/provider_test.go
@@ -31,6 +31,7 @@ import (
 
 	clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
 	"github.com/kubermatic/machine-controller/pkg/apis/plugin"
+	"github.com/kubermatic/machine-controller/pkg/cloudprovider/util"
 	"github.com/kubermatic/machine-controller/pkg/containerruntime"
 	providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types"
 	testhelper "github.com/kubermatic/machine-controller/pkg/test"
@@ -127,7 +128,6 @@ type userDataTestCase struct {
 
 func simpleVersionTests() []userDataTestCase {
 	versions := []*semver.Version{
-		semver.MustParse("v1.21.10"),
 		semver.MustParse("v1.22.7"),
 		semver.MustParse("v1.23.5"),
 		semver.MustParse("v1.24.0"),
@@ -297,6 +297,62 @@ func TestUserDataGeneration(t *testing.T) {
 				DistUpgradeOnBoot: false,
 			},
 		},
+		{
+			name: "openstack-dualstack",
+			providerSpec: &providerconfigtypes.Config{
+				CloudProvider: "openstack",
+				SSHPublicKeys: []string{"ssh-rsa AAABBB"},
+				Network: &providerconfigtypes.NetworkConfig{
+					IPFamily: util.DualStack,
+				},
+			},
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "node1",
+				},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: defaultVersion,
+				},
+			},
+			ccProvider: &fakeCloudConfigProvider{
+				name:   "openstack",
+				config: "{openstack-config:true}",
+				err:    nil,
+			},
+			DNSIPs:           []net.IP{net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.11"), net.ParseIP("10.10.10.12")},
+			kubernetesCACert: "CACert",
+			osConfig: &Config{
+				DistUpgradeOnBoot: false,
+			},
+			externalCloudProvider: true,
+		},
+		{
+			name: "digitalocean-dualstack",
+			providerSpec: &providerconfigtypes.Config{
+				CloudProvider: "digitalocean",
+				SSHPublicKeys: []string{"ssh-rsa AAABBB"},
+				Network: &providerconfigtypes.NetworkConfig{
+					IPFamily: util.DualStack,
+				},
+			},
+			spec: clusterv1alpha1.MachineSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Name: "node1",
+				},
+				Versions: clusterv1alpha1.MachineVersionInfo{
+					Kubelet: defaultVersion,
+				},
+			},
+			ccProvider: &fakeCloudConfigProvider{
+				config: "{digitalocean-config:true}",
+				err:    nil,
+			},
+			DNSIPs:           []net.IP{net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.11"), net.ParseIP("10.10.10.12")},
+			kubernetesCACert: "CACert",
+			osConfig: &Config{
+				DistUpgradeOnBoot: false,
+			},
+		},
 		{
 			name: "openstack-overwrite-cloud-config",
 			providerSpec: &providerconfigtypes.Config{
@@ -489,7 +545,7 @@ func TestUserDataGeneration(t *testing.T) {
 					Name: "node1",
 				},
 				Versions: clusterv1alpha1.MachineVersionInfo{
-					Kubelet: "1.21.10",
+					Kubelet: "1.23.5",
 				},
 			},
 			ccProvider: &fakeCloudConfigProvider{
diff --git a/pkg/userdata/ubuntu/testdata/version-1.21.10.yaml b/pkg/userdata/ubuntu/testdata/digitalocean-dualstack.yaml
similarity index 98%
rename from pkg/userdata/ubuntu/testdata/version-1.21.10.yaml
rename to pkg/userdata/ubuntu/testdata/digitalocean-dualstack.yaml
index a40f4932..d76ac8ad 100644
--- a/pkg/userdata/ubuntu/testdata/version-1.21.10.yaml
+++ b/pkg/userdata/ubuntu/testdata/digitalocean-dualstack.yaml
@@ -149,7 +149,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.22.7}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -246,7 +246,7 @@ write_files:
 - path: "/etc/kubernetes/cloud-config"
   permissions: "0600"
   content: |
-
+    {digitalocean-config:true}
 
 - path: "/opt/bin/setup_net_env.sh"
   permissions: "0755"
@@ -257,7 +257,9 @@ write_files:
     }
 
     # get the default interface IP address
-    DEFAULT_IFC_IP=$(ip -o  route get 1 | grep -oP "src \K\S+")
+    DEFAULT_IFC_IP=$(ip -o route get  1 | grep -oP "src \K\S+")
+    DEFAULT_IFC_IP6=$(ip -o -6 route get  1:: | grep -oP "src \K\S+")
+    DEFAULT_IFC_IP=$DEFAULT_IFC_IP,$DEFAULT_IFC_IP6
 
     # get the full hostname
     FULL_HOSTNAME=$(hostname -f)
@@ -375,6 +377,8 @@ write_files:
     cgroupDriver: systemd
     clusterDNS:
     - 10.10.10.10
+    - 10.10.10.11
+    - 10.10.10.12
     clusterDomain: cluster.local
     containerLogMaxSize: 100Mi
     cpuManagerReconcilePeriod: 0s
diff --git a/pkg/userdata/ubuntu/testdata/nutanix.yaml b/pkg/userdata/ubuntu/testdata/nutanix.yaml
index f49afbc6..58c16ae1 100644
--- a/pkg/userdata/ubuntu/testdata/nutanix.yaml
+++ b/pkg/userdata/ubuntu/testdata/nutanix.yaml
@@ -152,7 +152,7 @@ write_files:
     rm -f "$cri_tools_filename"
     ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
     cd -
-    KUBE_VERSION="${KUBE_VERSION:-v1.21.10}"
+    KUBE_VERSION="${KUBE_VERSION:-v1.23.5}"
     kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
     kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
     kube_sum_file="$kube_dir/sha256"
@@ -235,8 +235,6 @@ write_files:
       --lock-file=/tmp/kubelet.lock \
       --container-runtime=docker \
       --container-runtime-endpoint=unix:///var/run/dockershim.sock \
-      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
-      --feature-gates=DynamicKubeletConfig=true \
       --network-plugin=cni \
       --node-ip ${KUBELET_NODE_IP}
 
diff --git a/pkg/userdata/ubuntu/testdata/openstack-dualstack.yaml b/pkg/userdata/ubuntu/testdata/openstack-dualstack.yaml
new file mode 100644
index 00000000..77904a29
--- /dev/null
+++ b/pkg/userdata/ubuntu/testdata/openstack-dualstack.yaml
@@ -0,0 +1,452 @@
+#cloud-config
+
+hostname: node1
+
+
+ssh_pwauth: false
+ssh_authorized_keys:
+- "ssh-rsa AAABBB"
+
+write_files:
+
+- path: "/etc/systemd/journald.conf.d/max_disk_use.conf"
+  content: |
+    [Journal]
+    SystemMaxUse=5G
+
+
+- path: "/opt/load-kernel-modules.sh"
+  permissions: "0755"
+  content: |
+    #!/usr/bin/env bash
+    set -euo pipefail
+
+    modprobe ip_vs
+    modprobe ip_vs_rr
+    modprobe ip_vs_wrr
+    modprobe ip_vs_sh
+
+    if modinfo nf_conntrack_ipv4 &> /dev/null; then
+      modprobe nf_conntrack_ipv4
+    else
+      modprobe nf_conntrack
+    fi
+
+
+- path: "/etc/sysctl.d/k8s.conf"
+  content: |
+    net.bridge.bridge-nf-call-ip6tables = 1
+    net.bridge.bridge-nf-call-iptables = 1
+    kernel.panic_on_oops = 1
+    kernel.panic = 10
+    net.ipv4.ip_forward = 1
+    vm.overcommit_memory = 1
+    fs.inotify.max_user_watches = 1048576
+    fs.inotify.max_user_instances = 8192
+
+
+- path: "/etc/default/grub.d/60-swap-accounting.cfg"
+  content: |
+    # Added by kubermatic machine-controller
+    # Enable cgroups memory and swap accounting
+    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
+
+- path: "/opt/bin/setup"
+  permissions: "0755"
+  content: |
+    #!/bin/bash
+    set -xeuo pipefail
+    if systemctl is-active ufw; then systemctl stop ufw; fi
+    systemctl mask ufw
+    systemctl restart systemd-modules-load.service
+    sysctl --system
+    apt-get update
+
+    DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y \
+      curl \
+      ca-certificates \
+      ceph-common \
+      cifs-utils \
+      conntrack \
+      e2fsprogs \
+      ebtables \
+      ethtool \
+      glusterfs-client \
+      iptables \
+      jq \
+      kmod \
+      openssh-client \
+      nfs-common \
+      socat \
+      util-linux \
+      ipvsadm
+
+    # Update grub to include kernel command options to enable swap accounting.
+    # Exclude alibaba cloud until this is fixed https://github.com/kubermatic/machine-controller/issues/682
+
+
+    apt-get update
+    apt-get install -y apt-transport-https ca-certificates curl software-properties-common lsb-release
+    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
+    add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
+
+    mkdir -p /etc/systemd/system/containerd.service.d /etc/systemd/system/docker.service.d
+
+    cat <<EOF | tee /etc/systemd/system/containerd.service.d/environment.conf /etc/systemd/system/docker.service.d/environment.conf
+    [Service]
+    Restart=always
+    EnvironmentFile=-/etc/environment
+    EOF
+
+    apt-get install --allow-downgrades -y \
+        containerd.io=1.4* \
+        docker-ce-cli=5:20.10* \
+        docker-ce=5:20.10*
+    apt-mark hold docker-ce* containerd.io
+
+    systemctl daemon-reload
+    systemctl enable --now docker
+
+
+    opt_bin=/opt/bin
+    usr_local_bin=/usr/local/bin
+    cni_bin_dir=/opt/cni/bin
+    mkdir -p /etc/cni/net.d /etc/kubernetes/dynamic-config-dir /etc/kubernetes/manifests "$opt_bin" "$cni_bin_dir"
+    arch=${HOST_ARCH-}
+    if [ -z "$arch" ]
+    then
+    case $(uname -m) in
+    x86_64)
+        arch="amd64"
+        ;;
+    aarch64)
+        arch="arm64"
+        ;;
+    *)
+        echo "unsupported CPU architecture, exiting"
+        exit 1
+        ;;
+    esac
+    fi
+    CNI_VERSION="${CNI_VERSION:-v0.8.7}"
+    cni_base_url="https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION"
+    cni_filename="cni-plugins-linux-$arch-$CNI_VERSION.tgz"
+    curl -Lfo "$cni_bin_dir/$cni_filename" "$cni_base_url/$cni_filename"
+    cni_sum=$(curl -Lf "$cni_base_url/$cni_filename.sha256")
+    cd "$cni_bin_dir"
+    sha256sum -c <<<"$cni_sum"
+    tar xvf "$cni_filename"
+    rm -f "$cni_filename"
+    cd -
+    CRI_TOOLS_RELEASE="${CRI_TOOLS_RELEASE:-v1.22.0}"
+    cri_tools_base_url="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRI_TOOLS_RELEASE}"
+    cri_tools_filename="crictl-${CRI_TOOLS_RELEASE}-linux-${arch}.tar.gz"
+    curl -Lfo "$opt_bin/$cri_tools_filename" "$cri_tools_base_url/$cri_tools_filename"
+    cri_tools_sum=$(curl -Lf "$cri_tools_base_url/$cri_tools_filename.sha256" | sed 's/\*\///')
+    cd "$opt_bin"
+    sha256sum -c <<<"$cri_tools_sum"
+    tar xvf "$cri_tools_filename"
+    rm -f "$cri_tools_filename"
+    ln -sf "$opt_bin/crictl" "$usr_local_bin"/crictl || echo "symbolic link is skipped"
+    cd -
+    KUBE_VERSION="${KUBE_VERSION:-v1.22.7}"
+    kube_dir="$opt_bin/kubernetes-$KUBE_VERSION"
+    kube_base_url="https://storage.googleapis.com/kubernetes-release/release/$KUBE_VERSION/bin/linux/$arch"
+    kube_sum_file="$kube_dir/sha256"
+    mkdir -p "$kube_dir"
+    : >"$kube_sum_file"
+
+    for bin in kubelet kubeadm kubectl; do
+        curl -Lfo "$kube_dir/$bin" "$kube_base_url/$bin"
+        chmod +x "$kube_dir/$bin"
+        sum=$(curl -Lf "$kube_base_url/$bin.sha256")
+        echo "$sum  $kube_dir/$bin" >>"$kube_sum_file"
+    done
+    sha256sum -c "$kube_sum_file"
+
+    for bin in kubelet kubeadm kubectl; do
+        ln -sf "$kube_dir/$bin" "$opt_bin"/$bin
+    done
+
+    if [[ ! -x /opt/bin/health-monitor.sh ]]; then
+        curl -Lfo /opt/bin/health-monitor.sh https://raw.githubusercontent.com/kubermatic/machine-controller/7967a0af2b75f29ad2ab227eeaa26ea7b0f2fbde/pkg/userdata/scripts/health-monitor.sh
+        chmod +x /opt/bin/health-monitor.sh
+    fi
+
+    # set kubelet nodeip environment variable
+    /opt/bin/setup_net_env.sh
+
+    systemctl enable --now kubelet
+    systemctl enable --now --no-block kubelet-healthcheck.service
+    systemctl disable setup.service
+
+- path: "/opt/bin/supervise.sh"
+  permissions: "0755"
+  content: |
+    #!/bin/bash
+    set -xeuo pipefail
+    while ! "$@"; do
+      sleep 1
+    done
+
+- path: "/opt/disable-swap.sh"
+  permissions: "0755"
+  content: |
+    sed -i.orig '/.*swap.*/d' /etc/fstab
+    swapoff -a
+
+- path: "/etc/systemd/system/kubelet.service"
+  content: |
+    [Unit]
+    After=docker.service
+    Requires=docker.service
+
+    Description=kubelet: The Kubernetes Node Agent
+    Documentation=https://kubernetes.io/docs/home/
+
+    [Service]
+    User=root
+    Restart=always
+    StartLimitInterval=0
+    RestartSec=10
+    CPUAccounting=true
+    MemoryAccounting=true
+
+    Environment="PATH=/opt/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/"
+    EnvironmentFile=-/etc/environment
+
+    ExecStartPre=/bin/bash /opt/load-kernel-modules.sh
+
+    ExecStartPre=/bin/bash /opt/disable-swap.sh
+
+    ExecStartPre=/bin/bash /opt/bin/setup_net_env.sh
+    ExecStart=/opt/bin/kubelet $KUBELET_EXTRA_ARGS \
+      --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
+      --kubeconfig=/var/lib/kubelet/kubeconfig \
+      --config=/etc/kubernetes/kubelet.conf \
+      --cert-dir=/etc/kubernetes/pki \
+      --cloud-provider=external \
+      --hostname-override=node1 \
+      --exit-on-lock-contention \
+      --lock-file=/tmp/kubelet.lock \
+      --container-runtime=docker \
+      --container-runtime-endpoint=unix:///var/run/dockershim.sock \
+      --dynamic-config-dir=/etc/kubernetes/dynamic-config-dir \
+      --feature-gates=DynamicKubeletConfig=true \
+      --network-plugin=cni \
+
+    [Install]
+    WantedBy=multi-user.target
+
+- path: "/etc/systemd/system/kubelet.service.d/extras.conf"
+  content: |
+    [Service]
+    Environment="KUBELET_EXTRA_ARGS=--resolv-conf=/run/systemd/resolve/resolv.conf"
+
+- path: "/etc/kubernetes/cloud-config"
+  permissions: "0600"
+  content: |
+    {openstack-config:true}
+
+- path: "/opt/bin/setup_net_env.sh"
+  permissions: "0755"
+  content: |
+    #!/usr/bin/env bash
+    echodate() {
+      echo "[$(date -Is)]" "$@"
+    }
+
+    # get the default interface IP address
+    DEFAULT_IFC_IP=$(ip -o route get  1 | grep -oP "src \K\S+")
+    DEFAULT_IFC_IP6=$(ip -o -6 route get  1:: | grep -oP "src \K\S+")
+    DEFAULT_IFC_IP=$DEFAULT_IFC_IP,$DEFAULT_IFC_IP6
+
+    # get the full hostname
+    FULL_HOSTNAME=$(hostname -f)
+
+    if [ -z "${DEFAULT_IFC_IP}" ]
+    then
+    	echodate "Failed to get IP address for the default route interface"
+    	exit 1
+    fi
+
+    # write the nodeip_env file
+    # we need the line below because flatcar has the same string "coreos" in that file
+    if grep -q coreos /etc/os-release
+    then
+      echo -e "KUBELET_NODE_IP=${DEFAULT_IFC_IP}\nKUBELET_HOSTNAME=${FULL_HOSTNAME}" > /etc/kubernetes/nodeip.conf
+    elif [ ! -d /etc/systemd/system/kubelet.service.d ]
+    then
+    	echodate "Can't find kubelet service extras directory"
+    	exit 1
+    else
+      echo -e "[Service]\nEnvironment=\"KUBELET_NODE_IP=${DEFAULT_IFC_IP}\"\nEnvironment=\"KUBELET_HOSTNAME=${FULL_HOSTNAME}\"" > /etc/systemd/system/kubelet.service.d/nodeip.conf
+    fi
+
+
+- path: "/etc/kubernetes/bootstrap-kubelet.conf"
+  permissions: "0600"
+  content: |
+    apiVersion: v1
+    clusters:
+    - cluster:
+        certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwpBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzCkRRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwpjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2CmMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwpSOE9kMCs5UTYySHlueStHRndNVGI0QS9LVThtc3NvSHZjY2VTQUFid2ZieEZLLytzNTFUb2JxVW5PUlpyT29UClpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwptT29MYjR5SkpReUEvaVNUNlp4aUlFajM2RDR5V1o1bGc3WUpsK1VpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXCmNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdApoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRi9wSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CCk1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgpiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoClU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNApVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0ramU2dm9ECjU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24Kc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgprUGU2WG9TYmlMbS9reGszMlQwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
+        server: https://server:443
+      name: ""
+    contexts: null
+    current-context: ""
+    kind: Config
+    preferences: {}
+    users:
+    - name: ""
+      user:
+        token: my-token
+
+
+- path: "/etc/kubernetes/pki/ca.crt"
+  content: |
+    -----BEGIN CERTIFICATE-----
+    MIIEWjCCA0KgAwIBAgIJALfRlWsI8YQHMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNV
+    BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEUMBIG
+    A1UEChMLQnJhZGZpdHppbmMxEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsGCSqGSIb3
+    DQEJARYOYnJhZEBkYW5nYS5jb20wHhcNMTQwNzE1MjA0NjA1WhcNMTcwNTA0MjA0
+    NjA1WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBG
+    cmFuY2lzY28xFDASBgNVBAoTC0JyYWRmaXR6aW5jMRIwEAYDVQQDEwlsb2NhbGhv
+    c3QxHTAbBgkqhkiG9w0BCQEWDmJyYWRAZGFuZ2EuY29tMIIBIjANBgkqhkiG9w0B
+    AQEFAAOCAQ8AMIIBCgKCAQEAt5fAjp4fTcekWUTfzsp0kyih1OYbsGL0KX1eRbSS
+    R8Od0+9Q62Hyny+GFwMTb4A/KU8mssoHvcceSAAbwfbxFK/+s51TobqUnORZrOoT
+    ZjkUygbyXDSK99YBbcR1Pip8vwMTm4XKuLtCigeBBdjjAQdgUO28LENGlsMnmeYk
+    JfODVGnVmr5Ltb9ANA8IKyTfsnHJ4iOCS/PlPbUj2q7YnoVLposUBMlgUb/CykX3
+    mOoLb4yJJQyA/iST6ZxiIEj36D4yWZ5lg7YJl+UiiBQHGCnPdGyipqV06ex0heYW
+    caiW8LWZSUQ93jQ+WVCH8hT7DQO1dmsvUmXlq/JeAlwQ/QIDAQABo4HgMIHdMB0G
+    A1UdDgQWBBRcAROthS4P4U7vTfjByC569R7E6DCBrQYDVR0jBIGlMIGigBRcAROt
+    hS4P4U7vTfjByC569R7E6KF/pH0wezELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNB
+    MRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQKEwtCcmFkZml0emluYzES
+    MBAGA1UEAxMJbG9jYWxob3N0MR0wGwYJKoZIhvcNAQkBFg5icmFkQGRhbmdhLmNv
+    bYIJALfRlWsI8YQHMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAG6h
+    U9f9sNH0/6oBbGGy2EVU0UgITUQIrFWo9rFkrW5k/XkDjQm+3lzjT0iGR4IxE/Ao
+    eU6sQhua7wrWeFEn47GL98lnCsJdD7oZNhFmQ95Tb/LnDUjs5Yj9brP0NWzXfYU4
+    UK2ZnINJRcJpB8iRCaCxE8DdcUF0XqIEq6pA272snoLmiXLMvNl3kYEdm+je6voD
+    58SNVEUsztzQyXmJEhCpwVI0A6QCjzXj+qvpmw3ZZHi8JwXei8ZZBLTSFBki8Z7n
+    sH9BBH38/SzUmAN4QHSPy1gjqm00OAE8NaYDkh/bzE4d7mLGGMWp/WE3KPSu82HF
+    kPe6XoSbiLm/kxk32T0=
+    -----END CERTIFICATE-----
+
+- path: "/etc/systemd/system/setup.service"
+  permissions: "0644"
+  content: |
+    [Install]
+    WantedBy=multi-user.target
+
+    [Unit]
+    Requires=network-online.target
+    After=network-online.target
+
+    [Service]
+    Type=oneshot
+    RemainAfterExit=true
+    EnvironmentFile=-/etc/environment
+    ExecStart=/opt/bin/supervise.sh /opt/bin/setup
+
+- path: "/etc/profile.d/opt-bin-path.sh"
+  permissions: "0644"
+  content: |
+    export PATH="/opt/bin:$PATH"
+
+- path: /etc/docker/daemon.json
+  permissions: "0644"
+  content: |
+    {"exec-opts":["native.cgroupdriver=systemd"],"storage-driver":"overlay2","log-driver":"json-file","log-opts":{"max-file":"5","max-size":"100m"}}
+
+- path: "/etc/kubernetes/kubelet.conf"
+  content: |
+    apiVersion: kubelet.config.k8s.io/v1beta1
+    authentication:
+      anonymous:
+        enabled: false
+      webhook:
+        cacheTTL: 0s
+        enabled: true
+      x509:
+        clientCAFile: /etc/kubernetes/pki/ca.crt
+    authorization:
+      mode: Webhook
+      webhook:
+        cacheAuthorizedTTL: 0s
+        cacheUnauthorizedTTL: 0s
+    cgroupDriver: systemd
+    clusterDNS:
+    - 10.10.10.10
+    - 10.10.10.11
+    - 10.10.10.12
+    clusterDomain: cluster.local
+    containerLogMaxSize: 100Mi
+    cpuManagerReconcilePeriod: 0s
+    evictionHard:
+      imagefs.available: 15%
+      memory.available: 100Mi
+      nodefs.available: 10%
+      nodefs.inodesFree: 5%
+    evictionPressureTransitionPeriod: 0s
+    featureGates:
+      RotateKubeletServerCertificate: true
+    fileCheckFrequency: 0s
+    httpCheckFrequency: 0s
+    imageMinimumGCAge: 0s
+    kind: KubeletConfiguration
+    kubeReserved:
+      cpu: 200m
+      ephemeral-storage: 1Gi
+      memory: 200Mi
+    logging:
+      flushFrequency: 0
+      options:
+        json:
+          infoBufferSize: "0"
+      verbosity: 0
+    memorySwap: {}
+    nodeStatusReportFrequency: 0s
+    nodeStatusUpdateFrequency: 0s
+    protectKernelDefaults: true
+    rotateCertificates: true
+    runtimeRequestTimeout: 0s
+    serverTLSBootstrap: true
+    shutdownGracePeriod: 0s
+    shutdownGracePeriodCriticalPods: 0s
+    staticPodPath: /etc/kubernetes/manifests
+    streamingConnectionIdleTimeout: 0s
+    syncFrequency: 0s
+    systemReserved:
+      cpu: 200m
+      ephemeral-storage: 1Gi
+      memory: 200Mi
+    tlsCipherSuites:
+    - TLS_AES_128_GCM_SHA256
+    - TLS_AES_256_GCM_SHA384
+    - TLS_CHACHA20_POLY1305_SHA256
+    - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+    - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
+    - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
+    - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
+    - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
+    - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
+    volumePluginDir: /var/lib/kubelet/volumeplugins
+    volumeStatsAggPeriod: 0s
+
+
+- path: /etc/systemd/system/kubelet-healthcheck.service
+  permissions: "0644"
+  content: |
+    [Unit]
+    Requires=kubelet.service
+    After=kubelet.service
+
+    [Service]
+    ExecStart=/opt/bin/health-monitor.sh kubelet
+
+    [Install]
+    WantedBy=multi-user.target
+
+
+runcmd:
+- systemctl enable --now setup.service
diff --git a/test/e2e/provisioning/all_e2e_test.go b/test/e2e/provisioning/all_e2e_test.go
index c291f688..6c3a5f9e 100644
--- a/test/e2e/provisioning/all_e2e_test.go
+++ b/test/e2e/provisioning/all_e2e_test.go
@@ -79,6 +79,8 @@ const (
 	nutanixManifest                   = "./testdata/machinedeployment-nutanix.yaml"
 )
 
+const defaultKubernetesVersion = "1.23.5"
+
 var testRunIdentifier = flag.String("identifier", "local", "The unique identifier for this test run")
 
 func TestInvalidObjectsGetRejected(t *testing.T) {
@@ -357,7 +359,7 @@ func TestOpenstackProjectAuthProvisioningE2E(t *testing.T) {
 		name:              "MachineDeploy with project auth vars",
 		osName:            "ubuntu",
 		containerRuntime:  "containerd",
-		kubernetesVersion: "1.21.8",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 	testScenario(t, scenario, *testRunIdentifier, params, OSManifestProjectAuth, false)
@@ -429,7 +431,7 @@ func TestAWSAssumeRoleProvisioningE2E(t *testing.T) {
 		name:              "AWS with AssumeRole",
 		osName:            "ubuntu",
 		containerRuntime:  "docker",
-		kubernetesVersion: "1.22.5",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 	testScenario(t, scenario, *testRunIdentifier, params, AWSManifest, false)
@@ -538,7 +540,7 @@ func TestAWSFlatcarContainerdProvisioningE2E(t *testing.T) {
 		name:              "flatcar with containerd in AWS",
 		osName:            "flatcar",
 		containerRuntime:  "containerd",
-		kubernetesVersion: "1.22.5",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 	testScenario(t, scenario, *testRunIdentifier, params, AWSManifest, false)
@@ -588,7 +590,7 @@ func TestAWSEbsEncryptionEnabledProvisioningE2E(t *testing.T) {
 		name:              "AWS with ebs encryption enabled",
 		osName:            "ubuntu",
 		containerRuntime:  "containerd",
-		kubernetesVersion: "v1.21.8",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 	testScenario(t, scenario, fmt.Sprintf("aws-%s", *testRunIdentifier), params, AWSEBSEncryptedManifest, false)
@@ -677,7 +679,7 @@ func TestAzureRedhatSatelliteProvisioningE2E(t *testing.T) {
 		name:              "Azure redhat satellite server subscription",
 		osName:            "rhel",
 		containerRuntime:  "docker",
-		kubernetesVersion: "1.21.8",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 
@@ -877,7 +879,7 @@ func TestVsphereResourcePoolProvisioningE2E(t *testing.T) {
 		name:              "vSphere resource pool provisioning",
 		osName:            "flatcar",
 		containerRuntime:  "docker",
-		kubernetesVersion: "1.22.5",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 
@@ -993,7 +995,7 @@ func TestUbuntuProvisioningWithUpgradeE2E(t *testing.T) {
 		name:              "Ubuntu upgrade",
 		osName:            "ubuntu",
 		containerRuntime:  "docker",
-		kubernetesVersion: "1.22.5",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateAndDelete,
 	}
 
@@ -1018,7 +1020,7 @@ func TestDeploymentControllerUpgradesMachineE2E(t *testing.T) {
 		name:              "MachineDeployment upgrade",
 		osName:            "ubuntu",
 		containerRuntime:  "docker",
-		kubernetesVersion: "1.21.8",
+		kubernetesVersion: defaultKubernetesVersion,
 		executor:          verifyCreateUpdateAndDelete,
 	}
 	testScenario(t, scenario, *testRunIdentifier, params, HZManifest, false)
diff --git a/test/e2e/provisioning/helper.go b/test/e2e/provisioning/helper.go
index 446b6d06..532b0abc 100644
--- a/test/e2e/provisioning/helper.go
+++ b/test/e2e/provisioning/helper.go
@@ -33,7 +33,6 @@ var (
 	scenarios = buildScenarios()
 
 	versions = []*semver.Version{
-		semver.MustParse("v1.21.10"),
 		semver.MustParse("v1.22.7"),
 		semver.MustParse("v1.23.5"),
 		semver.MustParse("v1.24.0"),
diff --git a/test/e2e/provisioning/testdata/machinedeployment-aws-arm-machines.yaml b/test/e2e/provisioning/testdata/machinedeployment-aws-arm-machines.yaml
index bc81a8a1..e4c0d637 100644
--- a/test/e2e/provisioning/testdata/machinedeployment-aws-arm-machines.yaml
+++ b/test/e2e/provisioning/testdata/machinedeployment-aws-arm-machines.yaml
@@ -34,8 +34,7 @@ spec:
             diskSize: 50
             diskType: "gp2"
             ebsVolumeEncrypted: false
-            # TODO: Revert this to "<< AMI >>" when https://github.com/kubermatic/kubermatic/issues/10022 is marked as resolved.
-            ami: "ami-07d0e9bbaa6dad756"
+            ami: "<< AMI >>"
             securityGroupIDs:
               - "sg-a2c195ca"
             tags:
diff --git a/test/e2e/provisioning/testdata/machinedeployment-aws-ebs-encryption-enabled.yaml b/test/e2e/provisioning/testdata/machinedeployment-aws-ebs-encryption-enabled.yaml
index a1bd27be..ba06debe 100644
--- a/test/e2e/provisioning/testdata/machinedeployment-aws-ebs-encryption-enabled.yaml
+++ b/test/e2e/provisioning/testdata/machinedeployment-aws-ebs-encryption-enabled.yaml
@@ -34,7 +34,6 @@ spec:
             diskSize: 50
             diskType: "gp2"
             ebsVolumeEncrypted: true
-            ami: "<< AMI >>"
             securityGroupIDs:
             - "sg-a2c195ca"
             tags: