あらすじ
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の修正が含まれています。
- https://github.com/containerd/containerd/releases/tag/v1.5.12
- https://github.com/containerd/containerd/releases/tag/v1.5.13
このことから、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側の問題のような気がします。