Docker Desktopの有料化の発表に伴い、自宅のWindows10マシンのDocker環境をWSL2 + Dockerに移行したところ、kindクラスタの作成に失敗したので対処MEMOを記載しておきます。
ちなみにkind v0.12がリリースされたら問題は修正されるはずです。
事象
WSL2でkind v0.11.1を使用してkind cluster create
を実行した場合、Kubernetes v1.21.1のクラスタ生成が行われますが"Starting control-plane"のところで固まり以下のエラーが発生します。(再現性が100%なのかは不明)
ERROR: failed to create cluster: failed to init node with kubeadm: command "docker exec --privileged kind-control-plane kubeadm init --skip-phases=preflight --config=/kind/kubeadm.conf --skip-token-print --v=6" failed with error: exit status 1
Command Output: I1016 08:52:21.466228 216 initconfiguration.go:246] loading configuration from "/kind/kubeadm.conf"
...
I1016 08:53:02.942960 216 round_trippers.go:454] GET https://kind-control-plane:6443/healthz?timeout=10s in 0 milliseconds
[kubelet-check] Initial timeout of 40s passed.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
...
原因
以下のIssueが原因です。
詳しくは説明しませんが、ざっくりと言うと「WSL2ではsystemdが動作しておらず、これが原因でkubelet起動に失敗する」ようなバージョンの組み合わせがあるため、kindクラスタ作成に失敗します。Issueを見る限りはv1.21以外では発生しないようです。
既に対処PRもmasterブランチにはマージされていますが、後述するように現時点ではリリースはされていません。
対処方法
kind v0.12のリリースで対処PRが盛り込まれる予定ですが、現時点ではv0.12はリリースされていません。もしkind v0.11.x以下のバージョンで問題を回避したい場合は、以下のようにkindクラスタ作成時に--image
オプションで対処PRで作成されたイメージのタグ(v1.22.1)とハッシュを指定します。
NOTE: kindでは各バージョンでkindクラスタ向けのイメージのタグおよびハッシュが固定されているため、タグだけではなくハッシュも含めて指定が必要となります。
kind create cluster --image kindest/node:v1.22.1@sha256:e0bf222d7dd1589075117c51740903017b328c59ffb0c3d97187a2b3de1f92b3
ちなみにv1.17等のv1.21未満のバージョンであれば本問題は再現しなかったため、古めのバージョンでも問題なければ古いバージョンを指定することでも対処できるようです。
指定可能なバージョンのイメージ情報はkindのReleasesページの各リリースに掲載されているのでそちらを参照してください。