ホストOS上にDockerイメージを作成し、minikube仮想環境上にPodを作成しようとした際に ErrImageNeverPull が発生した問題の原因と解決方法をまとめました。
環境/再現方法
macOS上にDocker,minikubeをインストール
アプリケーション | バージョン |
---|---|
Docker(Client,Server) | 19.03.8 |
minikube | v1.9.2 |
kubectl(Client) | v1.18.2 |
kubectl(Server) | v1.18.2 |
- ホストOS上にイメージを作成
$ docker image build -t test .
- イメージ作成結果
docker image ls | grep -B1 test
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest c73609119b74 55 minutes ago 282MB
- 利用したマニュフェストファイル
---
apiVersion: v1
kind: Pod
metadata:
name: testpod
namespace: default
labels:
app: hoge
env: fuga
spec:
containers:
- name: testpod
image: test
imagePullPolicy: Never # hostOS上のイメージを取得する
- マニュフェストファイルの適用
$ kubectl apply -f pod.yml
pod/testpod created
現象
- 作成したpodのlog確認
$ kubectl get po
NAME READY STATUS RESTARTS AGE
testpod 0/1 ErrImageNeverPull 0 2m43s
$ kubectl logs testpod
Error from server (BadRequest): container "test" in pod "testpod" is waiting to start: ErrImageNeverPull
イメージの取得に失敗している。
原因
ホストOS上にDockerイメージ作成したがマニュフェストファイルからはminikubeにて作成された仮想環境上に存在するDockerイメージを取得しようとしたためImagePullエラーが発生。
期待される状態
local上のDockerイメージからPodを作成する。
解決方法
- 作成失敗したPodを削除
$ kubectl delete -f pod.yml
- DockerHub上にlocalにて作成したイメージファイルをPush
$ docker login
$ docker push <user名>/<image名>:<tag名>
- マニュフェストファイル内のimagePullPolicyをAlwaysかIfNotPresentに修正
imagePullPolicyの各設定値の挙動は以下の通り
imagePullPolicy: Never
localからイメージを取得
imagePullPolicy: Always
Pod作成時常時イメージをPull
imagePullPolicy: IfNotPresent
ローカルでイメージが見つからない場合にのみイメージをPull
- 再度マニュフェストファイルを適用
$ kubectl apply -f pod.yml
pod/testpod created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 22s
STATUSがRunningとなり正常にPodが作成できました。
やや強引ではありますが擬似的にlocal上のイメージファイルから作成したPodと同等のPodをminikube上に作成することができました。
追記
Podのspec.volumeMountsもminikube上を見に行くので同様の原因でエラーとなりました。
こちらはminikube環境にssh接続して環境操作する方法にて解決できました。
(参考資料)
stackoverflow