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が出てきて、

github.com

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がサポートしてるやつを調べた。

kubernetes.io

Kubeletのオプションを調べるとどうやらimage-pull-progress-deadlinehは見つからず、ググるとimage-pull-progress-deadlineはもう新しいk8sでは使えないんだよ、これからはお前らdockerdとかcontenerdを使えよといってるらしき英語の文章が目に入った。

K8sがDockerのサポートをやめてContenerdに移行していくという噂は聞いており、マジかって思ってたらNTTの方がとてもよいまとめを作ってくださっていた。

t.co

一瞬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何使ってるか足さないといけないっぽかったので、これ見てやってみた。

kubernetes.io