事象
ローカルでbuildして作成した独自イメージをyamlファイルで起動しようとすると以下のようにポッドが起動しない。
> kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-84f8547f85-fc5cw 0/1 ImagePullBackOff 0 XX
原因
Kubernetesがレジストリ―からイメージをpullしようとして失敗している。
以下はdocker describe pod
の結果です。
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled default-scheduler Successfully assigned default/nginx-deployment-84f8547f85-52hcr to docker-desktop Normal Pulling kubelet, docker-desktop Pulling image "mynginx:latest" Warning Failed kubelet, docker-desktop Failed to pull image "mynginx:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for mynginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied Warning Failed kubelet, docker-desktop Error: ErrImagePull Normal BackOff kubelet, docker-desktop Back-off pulling image "mynginx:latest" Warning Failed kubelet, docker-desktop Error: ImagePullBackOff
対応策
リモートから取得しにいく動きを抑止するためにデプロイメント用のyamlファイルに imagePullPolicy: IfNotPresent を追記する。
spec: containers: - name: nginx image: mynginx:latest imagePullPolicy: IfNotPresent
以下、補足です。
補足
以下コマンドのようにDockerfileを利用して新たなイメージを作成した場合に
docker build -t mynginx .
そのままデプロイメントでポッドを立ち上げようとするとローカルのイメージを利用しないため失敗してしまいます。
よって上記で記載したようにポリシーを明示的に追記した上で
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: mynginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80
起動すると無事にローカルのイメージからコンテナが動きます。
起動済のポッドを再度describeで見てみると「already present on machine」ということで内部に既に存在するイメージを利用していることが分かります。
docker-desktop Container image "mynginx:latest" already present on machine Normal Created xx kubelet, docker-desktop Created container mynginx Normal Started xx kubelet, docker-desktop Started container mynginx
以上、ご参考になれば幸いです。