いぶろぐ雑記

kindをZFS上で利用する場合はおまじないが必要なんです

ローカルにKubernetesクラスタをお手軽に構築できるのが「kind」さんです。「Kubernetes in Docker」でkind。

仕組みとしてはDockerコンテナをNodeとし、その中にPodを構築しているみたい。Dockerとkubectlがあれば動きます。

ひょんなことで利用する機会があったのですが、どーもうちの環境ではControl Planeの起動に失敗するようで…

調べてみるとおまじないが必要だったので、備忘録。

rootディスクがZFSだとなんかダメみたい

とりあえずエラーメッセージでググる

OSはUbuntu 20.04。VirtualBoxにクリーンインストールしたUbuntuではControl Planeの起動に成功するのに、ベアメタルで実行した場合はなぜか失敗する…

エラーメッセージで検索すると、同じエラーに悩まされている人を発見。

RROR: failed to create cluster: failed to init node with kubeadm · Issue #1437 · kubernetes-sigs/kind

ここには解決策はありませんでしたが、ヒントを掴むことはできました。

using a filesystem that doesn’t work out of the box with docker in docker #1416 (comment

Dockerコンテナの中でDockerコンテナを動かせないファイルシステムが存在する…?

ZFSとbtrfsはちょっと前までkindで問題が生じていたらしい

もう少し探すと、下記の記事がヒット。

Cannot create cluster in Arch Linux with ZFS Storage Driver · Issue #1121 · kubernetes-sigs/kind

ZFS/btrfs上でDocker in Dockerすると、overlayfsに問題が生じるらしい。

ただ、「問題は解決した」とあるので、もう少し調べます。

ZFSでもkindを使える解決策を発見

下記のissueに解決策がありました。

Create cluster fails - kind-control-plane does not work on zfs · Issue #1719 · kubernetes-sigs/kind

具体的には、kind実行時に指定するconfigファイルを以下のように書けばOK。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
 [plugins."io.containerd.grpc.v1.cri".containerd]
 snapshotter = "native"

キモはsnapshotter = "native"で、ZFSを使ってsnapshotを取るようにしている点。

これを指定しないとsnapshotを取得するストレージドライバーにoverlayfsが使われてしまい問題が発生する模様。

microk8sでも同じ問題が起こっていて、こちらが先に修正されていたようです。

Use native containerd snapshotter for ZFS (#1000) · canonical/microk8s@a5ec1f9

無事動いた

kind create cluster --config config.yamlで先ほどのオプションを読み込ませると、無事Control Planeが起動してClusterを構築できました。

めでたしめでたし。

P.S.

最近知ったLinuxのランチャー「Ulauncher」、かなりよい。

Ulauncher — Application launcher for Linux 🐧