-
Notifications
You must be signed in to change notification settings - Fork 14.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
kubeadm: add separate page for configuring / migrating cgroup driver #26786
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
--- | ||
title: Configuring a cgroup driver | ||
content_type: task | ||
weight: 10 | ||
--- | ||
|
||
<!-- overview --> | ||
|
||
This page explains how to configure the kubelet cgroup driver to match the container | ||
runtime cgroup driver for kubeadm clusters. | ||
|
||
## {{% heading "prerequisites" %}} | ||
|
||
You should be familiar with the Kubernetes | ||
[container runtime requirements](/docs/setup/production-environment/container-runtimes). | ||
|
||
<!-- steps --> | ||
|
||
## Configuring the container runtime cgroup driver | ||
|
||
The [Container runtimes](/docs/setup/production-environment/container-runtimes) page | ||
explains that the `systemd` driver is recommended for kubeadm based setups instead | ||
of the `cgroupfs` driver, because kubeadm manages the kubelet as a systemd service. | ||
|
||
The page also provides details on how to setup a number of different container runtimes with the | ||
`systemd` driver by default. | ||
|
||
## Configuring the kubelet cgroup driver | ||
|
||
kubeadm allows you to pass a `KubeletConfiguration` structure during `kubeadm init`. | ||
This `KubeletConfiguration` can include the `cgroupDriver` field which controls the cgroup | ||
driver of the kubelet. | ||
|
||
{{< note >}} | ||
|
||
{{< feature-state for_k8s_version="v1.21" state="stable" >}} | ||
|
||
If the user is not setting the `cgroupDriver` field under `KubeletConfiguration`, | ||
`kubeadm init` will default it to `systemd`. | ||
{{< /note >}} | ||
|
||
A minimal example of configuring the field explicitly: | ||
|
||
```yaml | ||
# kubeadm-config.yaml | ||
kind: ClusterConfiguration | ||
apiVersion: kubeadm.k8s.io/v1beta2 | ||
kubernetesVersion: v1.21 | ||
--- | ||
kind: KubeletConfiguration | ||
apiVersion: kubelet.config.k8s.io/v1beta1 | ||
cgroupDriver: systemd | ||
``` | ||
|
||
Such a configuration file can then be passed to the kubeadm command: | ||
|
||
```shell | ||
kubeadm init --config kubeadm-config.yaml | ||
``` | ||
|
||
{{< note >}} | ||
Kubeadm uses the same `KubeletConfiguration` for all nodes in the cluster. | ||
The `KubeletConfiguration` is stored in a [ConfigMap](docs/concepts/configuration/configmap) | ||
neolit123 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
object under the `kube-system` namespace. | ||
neolit123 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
Executing the sub commands `init`, `join` and `upgrade` would result in kubeadm | ||
writing the `KubeletConfiguration` as a file under `/var/lib/kubelet/config.yaml` | ||
and passing it to the local node kubelet. | ||
{{< /note >}} | ||
|
||
## Using the `cgroupfs` driver | ||
|
||
As this guide explains using the `cgroupfs` driver with kubeadm is not recommended. | ||
|
||
To continue using `cgroupfs` and to prevent `kubeadm upgrade` from modifying the | ||
`KubeletConfiguration` cgroup driver on existing setups, you must be explicit | ||
about its value. This applies to a case where you do not wish future versions | ||
of kubeadm to apply the `systemd` driver by default. | ||
|
||
See the below section on "Modify the kubelet ConfigMap" for details on | ||
how to be explicit about the value. | ||
|
||
If you wish to configure a container runtime to use the `cgroupfs` driver, | ||
you must refer to the documentation of the container runtime of your choice. | ||
|
||
## Migrating to the `systemd` driver | ||
|
||
To change the cgroup driver of an existing kubeadm cluster to `systemd` in-place, | ||
a similar procedure to a kubelet upgrade is required. This must include both | ||
steps outlined below. | ||
|
||
{{< note >}} | ||
Alternatively, it is possible to replace the old nodes in the cluster with new ones | ||
that use the `systemd` driver. This requires executing only the first step below | ||
before joining the new nodes and ensuring the workloads can safely move to the new | ||
nodes before deleting the old nodes. | ||
{{< /note >}} | ||
|
||
### Modify the kubelet ConfigMap | ||
|
||
- Find the kubelet ConfigMap name using `kubectl get cm -n kube-system | grep kubelet-config`. | ||
- Call `kubectl edit cm kubelet-config-x.yy -n kube-system` (replace `x.yy` with | ||
the Kubernetes version). | ||
- Either modify the existing `cgroupDriver` value or add a new field that looks like this: | ||
|
||
```yaml | ||
cgroupDriver: systemd | ||
``` | ||
This field must be present under the `kubelet:` section of the ConfigMap. | ||
|
||
### Update the cgroup driver on all nodes | ||
|
||
For each node in the cluster: | ||
|
||
- [Drain the node](/docs/tasks/administer-cluster/safely-drain-node) using `kubectl drain <node-name> --ignore-daemonsets` | ||
- Stop the kubelet using `systemctl stop kubelet` | ||
- Stop the container runtime | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sometimes, we need to clean up the container runtime dir. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. from my tests this was not needed. |
||
- Modify the container runtime cgroup driver to `systemd` | ||
- Set `cgroupDriver: systemd` in `/var/lib/kubelet/config.yaml` | ||
- Start the container runtime | ||
- Start the kubelet using `systemctl start kubelet` | ||
- [Uncordon the node](/docs/tasks/administer-cluster/safely-drain-node) using `kubectl uncordon <node-name>` | ||
|
||
Execute these steps on nodes one at a time to ensure workloads | ||
have sufficient time to schedule on different nodes. | ||
|
||
Once the process is complete ensure that all nodes and workloads are healthy. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2?utm_source=godoc uses
to define the cgroupfs.
Confusing...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
don't use kubeletExtraArgs, because the cgroup-driver flag is deprecated.
this new page has the right config example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand. However, this is very confusing, so where is an actual full reference for the kubeadm-kubelet-config-file to configure everything in one file?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there are also the support forums and #kubeadm on the k8s slack for users that need help:
https://github.com/kubernetes/kubernetes/blob/master/SUPPORT.md
i will send a PR to remove the kubeletExtraArgs examples in https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2?utm_source=godoc
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know. But the docs should be the first place to search, shouldn't it?
👍