【Kubernetes】ImagePullBackOffでハマった話

久しぶりの投稿となります。
ちょっとハマったポイントがあったので記事書きました。


やろうとしたこと

mysqlのイメージを(諸事情により)バージョン指定した上でデプロイしようとしました。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mysql
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: ********
            - name: MYSQL_DATABASE
              value: test_db
            - name: MYSQL_USER
              value: test_app
            - name: MYSQL_PASSWORD
              value: ********
          resources: {}
status: {}

何が起きたか

kubectl applyでデプロイ後、Podの状態を確認してみます。

kubectl get pods -n database 
NAME                     READY   STATUS             RESTARTS   AGE
mysql-58f55bdbf8-fs4jp   0/1     ImagePullBackOff   0          8m44s

ん・・・ImagePullBackOff・・・?
というわけで詳細を確認します。

kubectl describe pod mysql-58f55bdbf8-fs4jp -n database

(中略)
Events:
  Type     Reason     Age                     From               Message
  ----     ------     ----                    ----               -------
  Normal   Scheduled  9m53s                   default-scheduler  Successfully assigned database/mysql-58f55bdbf8-fs4jp to docker-desktop
  Normal   Pulling    8m6s (x4 over 9m53s)    kubelet            Pulling image "mysql:5.7"
  Warning  Failed     8m1s (x4 over 9m48s)    kubelet            Failed to pull image "mysql:5.7": no matching manifest for linux/arm64/v8 in the manifest list entries
  Warning  Failed     8m1s (x4 over 9m48s)    kubelet            Error: ErrImagePull
  Warning  Failed     7m50s (x6 over 9m48s)   kubelet            Error: ImagePullBackOff
  Normal   BackOff    4m51s (x18 over 9m48s)  kubelet            Back-off pulling image "mysql:5.7"

ErrImagePullとなっており、コンテナイメージをPullできていないようです。

なぜエラーになったのか。

いろいろ調べてみたところ、このMacBookのアーキテクチャに原因があるようです。
このMacBookはApple SiliconのM2プロセッサを搭載しています。IntelCPUなどとはアーキテクチャが異なるため、このアーキに対応していないコンテナイメージでは正しく稼動しないようです。
コンテナ含めて技術の勉強目的に買ったのですが、、、ちょびっと後悔。

対応策

このアーキテクチャに対応しているイメージを探し、そのハッシュタグをマニフェストファイルに指定することでうまくいきました。

(略)
      containers:
        - image: mysql@sha256:6d5a11994be8ca5e4cfaf4d370219f6eb6ef8fb41d57f9ed1568a93ffd5471ef
          name: mysql
(略)

kubectl apply でデプロイ後、Podの状態を確認。

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
mysql-6bbbdf8b88-zp2fk   1/1     Running   0          9s

ちゃんとRunningになってますね。一安心。

まとめ

MacでもDockerDesktopをインストールできるからコンテナ開発には特に支障ないだろうと思ってましたが甘かったです。まさかこんなところに落とし穴があるとは、、、また一つ勉強になりました。