M1 Mac で kind cluster create ができない場合の対処法

結論

遭遇したエラー

❯ kind create cluster --image=kindest/node-arm64:v1.30.0 --name node
Creating cluster "node" ...
 ✓ Ensuring node image (kindest/node-arm64:v1.30.0) 🖼
 ✗ Preparing nodes 📦
ERROR: failed to create cluster: command "docker run --name node-control-plane --hostname node-control-plane --label io.x-k8s.kind.role=control-plane --privileged --security-opt seccomp=unconfined --security-opt apparmor=unconfined --tmpfs /tmp --tmpfs /run --volume /var --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --label io.x-k8s.kind.cluster=node --net kind --restart=on-failure:1 --init=false --cgroupns=private --publish=127.0.0.1:51859:6443/TCP -e KUBECONFIG=/etc/kubernetes/admin.conf kindest/node-arm64:v1.30.0" failed with error: exit status 125
Command Output: Unable to find image 'kindest/node-arm64:v1.30.0' locally
v1.30.0: Pulling from kindest/node-arm64
Digest: sha256:5e4ce6f9033bdb9ce81a7fd699c8e67cfcacfab57076058e3e6f33c32036b42b
Status: Image is up to date for kindest/node-arm64:v1.30.0
docker: image with reference docker.io/kindest/node-arm64:v1.30.0 was found but does not match the specified platform: wanted linux/amd64, actual: linux/arm64.
See 'docker run --help'.

対処方法

❯ echo $DOCKER_DEFAULT_PLATFORM
linux/amd64

となっていたため、

export DOCKER_DEFAULT_PLATFORM=linux/arm64

で上書きしたことで解決しました。

手元の環境

  • M1 Mac(macOS 14.5)
  • Docker Desktop(4.31.0)
  • kind(0.23.0)

背景

「つくって、壊して、直して学ぶ Kubernetes入門」という本を購入したので、Kubernetes を弄ろうとしていたのですが、エラーが出てしまって cluster が作成できないという状態で詰まっていました。

真っ先にヒットする日本語の記事とは違う原因だったため、記事にしようと思った次第です。

発生したエラー

❯ kind create cluster --image=kindest/node-arm64:v1.30.0 --name node
Creating cluster "node" ...
 ✓ Ensuring node image (kindest/node-arm64:v1.30.0) 🖼
 ✗ Preparing nodes 📦
ERROR: failed to create cluster: command "docker run --name node-control-plane --hostname node-control-plane --label io.x-k8s.kind.role=control-plane --privileged --security-opt seccomp=unconfined --security-opt apparmor=unconfined --tmpfs /tmp --tmpfs /run --volume /var --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --label io.x-k8s.kind.cluster=node --net kind --restart=on-failure:1 --init=false --cgroupns=private --publish=127.0.0.1:51859:6443/TCP -e KUBECONFIG=/etc/kubernetes/admin.conf kindest/node-arm64:v1.30.0" failed with error: exit status 125
Command Output: Unable to find image 'kindest/node-arm64:v1.30.0' locally
v1.30.0: Pulling from kindest/node-arm64
Digest: sha256:5e4ce6f9033bdb9ce81a7fd699c8e67cfcacfab57076058e3e6f33c32036b42b
Status: Image is up to date for kindest/node-arm64:v1.30.0
docker: image with reference docker.io/kindest/node-arm64:v1.30.0 was found but does not match the specified platform: wanted linux/amd64, actual: linux/arm64.
See 'docker run --help'.

linux/arm64 のはずなのに、linux/amd64 を求められるのはなぜなのか。。。

作業ログ

仕方がないので linux/amd64 のイメージを指定してみたのですが、今度は下記のようなエラーが出ました。(正常に動作する場合は 10 秒かからずに結果が返ってくるのですが、失敗している時には結果が返ってくるまで非常に時間がかかります。)

❯ kind create cluster --image=kindest/node-amd64:v1.30.0 --name node
Creating cluster "node" ...
 ✓ Ensuring node image (kindest/node-amd64:v1.30.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✗ Starting control-plane 🕹️
Deleted nodes: ["node-control-plane"]
ERROR: failed to create cluster: failed to init node with kubeadm: command "docker exec --privileged node-control-plane kubeadm init --skip-phases=preflight --config=/kind/kubeadm.conf --skip-token-print --v=6" failed with error: exit status 1

略

kubelet.go:68] Stopping the kubelet

略

couldn't initialize a Kubernetes cluster

ちょっとエラーの情報量が多くなってきたので、困った時の Chat GPT に投げてみました。

すると回答としては、4 つほどあったのですが 3 以降は対応しようがない感じだったので、上の2つを確認していくことにしました。

  1. Docker Desktop の設定を確認する(”Use Rosetta for x86/amd64 emulation on Apple Silicon” をオフにせよ)
  2. DOCKER_DEFAULT_PLATFORM を linux/arm64 にせよ

1 に関しては、M1 Mac でも x86/amd64 を使えるようにするためのものという認識だったので、一旦無視。

DOCKER_DEFAULT_PLATFORM の値を確認しました。

少なくとも、ここ最近は触った記憶がないので、空なのでは?と思っていたのですが、まさかの結果でした。

❯ echo $DOCKER_DEFAULT_PLATFORM
linux/amd64

なるほど。

完全に解決した。

❯ export DOCKER_DEFAULT_PLATFORM=linux/arm64
❯ echo $DOCKER_DEFAULT_PLATFORM
linux/arm64

linux/arm64 に書き換わったことを確認し、再度クラスタを作成するコマンドを実施

❯ kind create cluster --image=kindest/node-arm64:v1.30.0 --name node
Creating cluster "node" ...
 ✓ Ensuring node image (kindest/node-arm64:v1.30.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-node"
You can now use your cluster with:

kubectl cluster-info --context kind-node

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

無事、作成されました!

コメント

タイトルとURLをコピーしました