The Kubernetes documentation states:
When using Docker, kubeadm will automatically detect the cgroup driver for the kubelet and set it in the /var/lib/kubelet/config.yaml file during runtime.
If you are using a different CRI, you must pass your cgroupDriver value to kubeadm init, like so:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: <value>
Please mind, that you only have to do that if the cgroup driver of your CRI is not cgroupfs, because that is the default value in the kubelet already.
Note: Since --cgroup-driver flag has been deprecated by kubelet, if you have that in /var/lib/kubelet/kubeadm-flags.env or /etc/default/kubelet(/etc/sysconfig/kubelet for RPMs), please remove it and use the KubeletConfiguration instead (stored in /var/lib/kubelet/config.yaml by default).
Restarting the kubelet is required:
sudo systemctl daemon-reload sudo systemctl restart kubelet
The automatic detection of cgroup driver for other container runtimes like CRI-O and containerd is work in progress.
Admitidly, I could not figure out how to pass that cgroupDriver value to kubeadm. Using the Arch Wiki, I did find that you can create / edit
/etc/kubernetes/kubelet.env and add the line
KUBELET_EXTRA_ARGS="--cgroup-driver='systemd'". Then continue with the
Once the init is done, the line can be removed from the
kubelet.env file, and the line
cgroupDriver: systemd can be added to the
At the moment, you WILL need to add the line to the
/var/lib/kubelet/config.yaml file of EACH node that you add to the cluster which is using a cgroup driver that is not cgroupfs. I know of the following: