1ノードのk8sクラスタを簡単に作るmicrok8sという便利アプリがsnapで公開されています。それを使っているときにちょっとした不具合を見つけたのでメモ
- 1/29 更新: PR投げた
問題要旨
microk8sのアンインストールに失敗する
発生条件
/var/snapのファイルシステムがBtrfs
問題が発生したソフトウェアのバージョン
- Ubuntu 18.04
- snap: 2.36.3
- microk8s: v1.13.2
- kernel: 4.15.0-43-generic
再現方法
インストール後にpodを一回でも立ち上げた後で(一つでもimageを作った後で)アンインストールする。
$ sudo snap remove microk8s
期待される結果
アンインストールが成功する。
実際の結果
以下のようなメッセージと共にアンインストールが失敗する。
$ sudo snap remove microk8s error: cannot perform the following tasks: - Remove data for snap "microk8s" (383) (remove /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/<id>: operation not permitted)
原因
microk8sのアンインストール時には.../subvolumes/以下に配置されたコンテナイメージをsnapがrmコマンドによって削除しようとしているが、これらのイメージはbtrfsのサブボリュームであり、かつ、kernel 4.15系ではサブボリュームはrmコマンドでは削除できない。
解決方法
アンインストール時にsubvolumeを削除する
回避方法
2つの方法がある。
microk8sのコンテナ用snapshotを自力で削除する
アンインストールの前に次のようなコマンドを発行すればよい。
for i in $(sudo ls /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/) ; do sudo btrfs sub del /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/$i ; done
この後アンインストールすれば削除すべきイメージは既にないのでアンインストールは成功する。
$ sudo snap remove microk8s microk8s removed
kernelを4.18以上にアップデートする
$ uname -r 4.18.0-13-generic $ sudo ls /var/snap/microk8s/common/var/lib/docker/btrfs/subvolumes/ <id 0> <id 1> $ sudo snap remove microk8s microk8s removed $
なぜカーネルのバージョンアップで問題が解決するかというとkernel 4.18においてrmdir() syscallによって空のサブボリュームを削除できるようになったからです。
on user demand, rmdir() is able to delete an empty subvolume, export the capability in sysfs
ちなみにこの修正をしてくれたのはFujitsuのTomohiro Misonoさんというかたです。すごいぞMisonoさん。
今後の予定
microk8sのアンインストール時に動作するスクリプトを修正するpull requestをupstream communityに出したので、待ち状態。