microk8sアンインストール時に発生する不具合と解決方法

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によって空のサブボリュームを削除できるようになったからです。

btrfs.wiki.kernel.org

on user demand, rmdir() is able to delete an empty subvolume, export the capability in sysfs

ちなみにこの修正をしてくれたのはFujitsuのTomohiro Misonoさんというかたです。すごいぞMisonoさん。

github.com

今後の予定

microk8sのアンインストール時に動作するスクリプトを修正するpull requestをupstream communityに出したので、待ち状態。

github.com