(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

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


他の記事を読む