仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ubuntu 22.04でkubeadmでKubernetesクラスターが動かない?

あらすじ

Ubuntu 22.04でkubeadmでKubernetesクラスターを作ってみたのですが、[WARNING SystemVerification]: missing optional cgroups: blkioなんていう警告が出ますし、セットアップ後のKubernetesもKubernetes APIの動きがおかしい状況になりました。

一方、同じ方法でセットアップしたUbuntu 20.04やUbuntu 18.04では特に問題なく動きます。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
...
$ sudo kubeadm init --kubernetes-version 1.24.1 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=172.17.28.62
[init] Using Kubernetes version: v1.24.1
[preflight] Running pre-flight checks
    [WARNING SystemVerification]: missing optional cgroups: blkio
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
...
Your Kubernetes control-plane has initialized successfully!
...

というわけで、問題を深掘りしてみます。 まず、kubectlでAPIにアクセスできません。

$ kubectl get po
The connection to the server 172.17.28.62:6443 was refused - did you specify the right host or port?
$ kubectl get po
The connection to the server 172.17.28.62:6443 was refused - did you specify the right host or port?

システムコンテナーがほとんど動いていない模様です。kube-apiserverが動いていないならしょうがないですね。

$ sudo crictl pods
POD ID              CREATED              STATE               NAME                                 NAMESPACE           ATTEMPT             RUNTIME
2217e69826b34       About a minute ago   Ready               kube-controller-manager-bay10-gen9   kube-system         4                   (default)
3b6fd1ed50b45       About a minute ago   Ready               kube-scheduler-bay10-gen9            kube-system         3                   (default)
fd095db1edf78       2 minutes ago        Ready               kube-apiserver-bay10-gen9            kube-system         6                   (default)
380ffb8a3255f       2 minutes ago        Ready               kube-proxy-vjbw5                     kube-system         5                   (default)
1a7e604c46b69       3 minutes ago        NotReady            kube-apiserver-bay10-gen9            kube-system         5                   (default)
f362cdad20a65       3 minutes ago        Ready               etcd-bay10-gen9                      kube-system         3                   (default)
91493193c6812       4 minutes ago        NotReady            kube-proxy-vjbw5                     kube-system         4                   (default)
e79ab83371776       4 minutes ago        NotReady            kube-controller-manager-bay10-gen9   kube-system         3                   (default)
831b9cae5e01b       5 minutes ago        NotReady            kube-scheduler-bay10-gen9            kube-system         2                   (default)
dd852d905fcea       8 minutes ago        NotReady            etcd-bay10-gen9                      kube-system         2                   (default)

公式のドキュメントのここら辺にcgroup-v2の件が言及されていました。Ubuntu 21.10くらいでcgroup v2に移行したから、もしかしてv1に戻したらうまくいくかなと思い、試してみることにしました。

早速試す

cgroup v2からcgroup v1に切り替えてみました。Ubuntuの場合、GRUB 2の設定は/etc/default/grubを書き換えます。 Kernel起動後に設定されていればいいので、GRUB_CMDLINE_LINUX_DEFAULTの方に追記します。

$ sudo  vi /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=false"    #追記
GRUB_CMDLINE_LINUX=""

設定変更をシステムに反映するにはsudo update-grubを実行し、そのあと再起動します。

再起動後、もう一度kubeadmを使ってクラスター作成を試してみました。設定変更前に出力されていたワーニングは出ていません。

$ sudo kubeadm reset
$ sudo kubeadm init --kubernetes-version 1.24.1 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=172.17.28.62
[init] Using Kubernetes version: v1.24.1
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
...
Your Kubernetes control-plane has initialized successfully!
...

その後は特に問題なくKubernetesクラスターを動かすことができました。 この後、CNIのインストールなどを続けます。

$ kubectl get no
NAME         STATUS     ROLES           AGE   VERSION
bay10-gen9   NotReady   control-plane   29s   v1.24.1
$ kubectl get no
NAME         STATUS     ROLES           AGE   VERSION
bay10-gen9   NotReady   control-plane   31s   v1.24.1

$ sudo crictl pods
...
POD ID              CREATED             STATE               NAME                                 NAMESPACE           ATTEMPT             RUNTIME
07bc892032e19       8 minutes ago       Ready               kube-proxy-z4zcp                     kube-system         0                   (default)
005f1e7803df9       9 minutes ago       Ready               kube-scheduler-bay10-gen9            kube-system         0                   (default)
ec7bae35a877e       9 minutes ago       Ready               kube-controller-manager-bay10-gen9   kube-system         0                   (default)
b972cf9bb7086       9 minutes ago       Ready               kube-apiserver-bay10-gen9            kube-system         0                   (default)
1bb69d80f6ba2       9 minutes ago       Ready               etcd-bay10-gen9                      kube-system         0                   (default)

「[WARNING SystemVerification]: missing optional cgroups: blkio」とか出ていたし、Ubuntu 22.04のcgroup v2の実装やsystemd関連の問題なのかもしれない。 関係ないけど、NVIDIA Container Toolkitもcgroup v2はサポートされていないようですね。

cgroup v2対応はOS側とアプリケーション側の対応が必要なので時が解決してくれるとは思いますが、cgroup v2移行前のUbuntuからUbuntu 22.04 LTSに移行したときに色々影響が出そうですね。注意が必要かもしれません。

追記(2022年6月10日)

Ubuntu Archives版のcontainerdはバージョン1.5.9-0ubuntu3でした。

~$ apt-cache policy containerd
containerd:
  Installed: (none)
  Candidate: 1.5.9-0ubuntu3
  Version table:
     1.5.9-0ubuntu3 500
        500 http://ja.archive.ubuntu.com/ubuntu jammy/main amd64 Packages

Docker CEリポジトリーからダウンロードできるパッケージは1.6.6でした。

~$ apt-cache policy containerd.io
containerd.io:
  Installed: 1.6.6-1
  Candidate: 1.6.6-1
  Version table:
 *** 1.6.6-1 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
        100 /var/lib/dpkg/status
     1.6.4-1 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     1.5.11-1 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     1.5.10-1 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

より新しいバージョンを使えば、本記事で書いた問題が起きなくなるのかなと思い、調査することにしました。

双方のパッケージのバージョン比較

Ubuntuのcontainerdパッケージの変更履歴を確認すると、一つ前のバージョン(1.5.9-0ubuntu2)でCVE-2022-23648が修正されています。

この修正はアップストリームでは1.5.10に修正されたものです。 1.5.10では脆弱性の他、いろいろな修正がされています(そのため、現時点ではUbuntu Archives版のcontainerdは1.5.10相当であるようです)。

そして、アップストリームの1.5.11でCVE-2022-24769が報告されています。これについてはまだUbuntu Archives版のcontainerdにはパッチが提供されていません。

その後もバージョン1.5.12や1.5.13がアップストリームではリリースされています。1.5.13ではCVE-2022-31030の修正が含まれています。

このことから、Docker CEリポジトリーに含まれるcontainerd.ioを使う方が良さそうです。 これをインストールすると、現時点では最新の1.6.6がインストールされます。1.5系では1.5.13で修正されたセキュリティ脆弱性の修正がされています。

containerd.ioベースでKubeadmでクラスターを作ってみた

というわけでcontainerd.ioを使って同じようにクラスターを構築してみたところ、kubeadm initの実行時に「[WARNING SystemVerification]: missing optional cgroups: blkio」というメッセージが現れること、CNIのインストールなどをしてPodを作成するとシステムコンテナーなどがクラッシュするという同症状が再現しました。

「GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=false"」の追記と同じ対処をした上で、kubeadmを使ってクラスターの作成が必要でした。 これはKubernetesというよりはUbuntu 22.04側の問題のような気がします。