(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】ローカルでbuildしたimageのコンテナがrepository does not existで起動できない

スポンサーリンク

事象

ローカルで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

以上、ご参考になれば幸いです。