WSL2+Minikube1.27.1でImagePullBackoffになるやつ
最近自宅のパソコンの電源を落とすことがあり、そのときにminikubeが止まって、再起動してpodを立ち上げようとしたらImagePullBackOffが出た。どうやらコンテナイメージを取ってくるののタイムアウトに引っかかってたらしい。Torchが入ってるからそりゃデカいわなと。
kubectl describe podで調べたら、
$ kubectl get po -n cnn NAME READY STATUS RESTARTS AGE signma-chan-cnn-hlpdp 0/1 ImagePullBackOff 0 12m $ kubectl describe pod signma-chan-cnn-hlpdp -n cnn Name: signma-chan-cnn-hlpdp Namespace: cnn Priority: 0 Service Account: default Node: minikube/192.168.49.2 Start Time: Sun, 01 Jan 2023 01:15:13 +0900 Labels: controller-uid=091a21b9-f414-4e7e-83de-c5ba6e857228 job-name=signma-chan-cnn Annotations: <none> Status: Pending (中略) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 14m default-scheduler Successfully assigned cnn/signma-chan-cnn-hlpdp to minikube Normal Pulling 6m39s (x4 over 14m) kubelet Pulling image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e" Warning Failed 4m40s (x4 over 12m) kubelet Failed to pull image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e": rpc error: code = Unknown desc = context deadline exceeded Warning Failed 4m40s (x4 over 12m) kubelet Error: ErrImagePull Warning Failed 4m10s (x7 over 12m) kubelet Error: ImagePullBackOff Normal BackOff 3m56s (x8 over 12m) kubelet Back-off pulling image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e" $ kubectl delete -f manifest/run_single_job.yaml -n cnn
こんなんでてきて、つまり、コンテナを引っ張ってくるののタイムアウトに引っかかってるらしかった。
これまでも何回かImagePullBackOffが出ることがあったが、数時間ほっとけば勝手にpodが立ち上がってたが、今回はそうはいかなくて、色々調べてくとminikubeが新しくなって、k8sもアップデートされてこれまで通りに行かなくなった模様。色々調べたけど忘れたが、ググれば色々出てくるからいいことにする。
ちなみにコンテナイメージ自体はdockerhubにあげてて、普通にdocker pullできる状態。
Google先生にお伺いを立てたところ、こういうgithubのissueが出てきて、
image-pull-progress-deadlineというオプションをつけたらいいんやでってサジェストされたので、kubeletでオプション指定してminikubeを立ち上げなおそうとしたら、
$ minikube start --extra-config=kubelet.image-pull-progress-deadline=15m 😄 minikube v1.27.1 on Ubuntu 20.04 (amd64) ✨ Automatically selected the docker driver 📌 Using Docker driver with root privileges 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🔥 Creating docker container (CPUs=2, Memory=3400MB) ... 🐳 Preparing Kubernetes v1.25.2 on Docker 20.10.18 ... ▪ kubelet.image-pull-progress-deadline=15m ▪ Generating certificates and keys ... ▪ Booting up control plane ... 💢 initialization failed, will try again: wait: /bin/bash -c "sudo env PATH="/var/lib/minikube/binaries/v1.25.2:$PATH" kubeadm init --config /var/tmp/minikube/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests,DirAvailable--var-lib-minikube,DirAvailable--var-lib-minikube-etcd,FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml,FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml,FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml,FileAvailable--etc-kubernetes-manifests-etcd.yaml,Port-10250,Swap,Mem,SystemVerification,FileContent--proc-sys-net-bridge-bridge-nf-call-iptables": Process exited with status 1
といわれて、そんなオプションは知らんと言われたので、k8sのkubeletがサポートしてるやつを調べた。
Kubeletのオプションを調べるとどうやらimage-pull-progress-deadlinehは見つからず、ググるとimage-pull-progress-deadlineはもう新しいk8sでは使えないんだよ、これからはお前らdockerdとかcontenerdを使えよといってるらしき英語の文章が目に入った。
K8sがDockerのサポートをやめてContenerdに移行していくという噂は聞いており、マジかって思ってたらNTTの方がとてもよいまとめを作ってくださっていた。
一瞬contenerdに移行しようかと考えがよぎったが、よくよく見るとsystemctlとかsystemdを使わないといけないのだけれど、色々な理由でWSLでそれらを使うと僕の環境ではあまり嬉しくないので、そのやり方はちょっと避けたくて、再度minikubeのissueを見ると、minikubeでコンテナランタイムをcontainerdにするとcontainerd使えるらしいことが分かったので、それでなんとかしてみようとした。
$ minikube start --container-runtime=containerd 😄 minikube v1.27.1 on Ubuntu 20.04 (amd64) ✨ Automatically selected the docker driver 📌 Using Docker driver with root privileges 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 🔥 Creating docker container (CPUs=2, Memory=3400MB) ... 📦 Preparing Kubernetes v1.25.2 on containerd 1.6.8 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🔗 Configuring CNI (Container Networking Interface) ... 🔎 Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 🌟 Enabled addons: storage-provisioner, default-storageclass 🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Minikubeは動いたっぽいので、ジョブを流す。が、またImagePullBackOffが出るが、これはcontainerdがDockerHubのcredentialがねえって怒ってるみたいだった。
DockerHubはパブリックで使ってるがなんか認証しないといけないらしかった。
$ kubectl get po -n sigma-chan-cnn ]NAME READY STATUS RESTARTS AGE signma-chan-cnn-6gtjz 0/1 ImagePullBackOff 0 10m $ kubectl describe pod signma-chan-cnn-6gtjz -n sigma-chan-cnn Name: signma-chan-cnn-6gtjz Namespace: sigma-chan-cnn Priority: 0 Service Account: default Node: minikube/192.168.49.2 Start Time: Fri, 06 Jan 2023 15:12:15 +0900 Labels: controller-uid=e8c52db2-fdfe-4251-aec6-ea8f93ef000c job-name=signma-chan-cnn (中略) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 10m default-scheduler Successfully assigned sigma-chan-cnn/signma-chan-cnn-6gtjz to minikube Warning Failed 3m35s kubelet Failed to pull image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e": failed to copy: httpReadSeeker: failed open: server message: invalid_token: authorization failed Warning Failed 3m35s kubelet Error: ErrImagePull Normal BackOff 3m34s kubelet Back-off pulling image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e" Warning Failed 3m34s kubelet Error: ImagePullBackOff Normal Pulling 3m23s (x2 over 10m) kubelet Pulling image "nsakairi/sigma-chan-cnn@sha256:7d1879427b6fc4e438e1680069f327a14a5a664ca4f411fd760bd40d8b12773e"
一応手元のターミナルではdocker loginしてるけど、minikubeにsecret食わせないといけないみたいだった。
discuss.kubernetes.io
kubernetes.io
大体上のページに書いてある通りにやるとsecret作れた。
DockerHub使ってるときはこんな感じ。
$ kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username=<docker-hub-username> --docker-password=<docker-hub-password> --docker-email=<docker-hub-e-mail-address> secret/regcred created $ kubectl get secret NAME TYPE DATA AGE regcred kubernetes.io/dockerconfigjson 1 11s <|| うまくsecret作れてるっぽかった。 そしてまたminikubeにジョブを投げてみると、 >|| $ kubectl get po -n sigma-chan-cnn NAME READY STATUS RESTARTS AGE signma-chan-cnn-z7xh4 1/1 Running 0 1s
無事podが動いてるのが分かった。偉い解決に時間がかかってしまった。k8sはやっぱ色々あって大変だな。
# 追記
yamlにsecret何使ってるか足さないといけないっぽかったので、これ見てやってみた。