メインコンテンツまでスキップ

ImagePullBackOff - パブリックイメージ

このセクションでは、ECRパブリックイメージに関するpodのImagePullBackOffエラーのトラブルシューティング方法を学びます。まず、デプロイメントが作成されているか確認し、トラブルシューティングのシナリオを開始できるようにしましょう。

~$kubectl get deployment ui-new -n default
NAME     READY   UP-TO-DATE   AVAILABLE   AGE
ui-new   0/1     1            0           75s
備考

同じ出力が得られた場合は、トラブルシューティングを開始する準備ができています。

このトラブルシューティングセクションでの課題は、デプロイメントui-newが0/1の準備状態にある原因を特定し、修正してデプロイメントがpodを1つ準備して実行している状態にすることです。

トラブルシューティングを始めましょう

ステップ1:podのステータスを確認する

まず、kubectlツールを使用してpodのステータスを確認する必要があります。

~$kubectl get pods -l app=app-new
NAME                      READY   STATUS             RESTARTS   AGE
ui-new-5654dd8969-7w98k   0/1     ImagePullBackOff   0          13s

ステップ2:podを詳しく調べる

podのステータスがImagePullBackOffとして表示されていることがわかります。イベントを確認するためにpodを詳細に調べてみましょう。

~$POD=`kubectl get pods -l app=app-new -o jsonpath='{.items[*].metadata.name}'`
~$kubectl describe pod $POD | awk '/Events:/,/^$/'
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  48s                default-scheduler  Successfully assigned default/ui-new-5654dd8969-7w98k to ip-10-42-33-232.us-west-2.compute.internal
  Normal   BackOff    23s (x2 over 47s)  kubelet            Back-off pulling image "public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1"
  Warning  Failed     23s (x2 over 47s)  kubelet            Error: ImagePullBackOff
  Normal   Pulling    12s (x3 over 47s)  kubelet            Pulling image "public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1"
  Warning  Failed     12s (x3 over 47s)  kubelet            Failed to pull image "public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1": rpc error: code = NotFound desc = failed to pull and unpack image "public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1": failed to resolve reference "public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1": public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1: not found
  Warning  Failed     12s (x3 over 47s)  kubelet            Error: ErrImagePull

podのイベントから、エラーコードNotFoundで「Failed to pull image」警告が表示されています。これは、pod/デプロイメント仕様で参照されているイメージがそのパスに見つからなかったことを示しています。

ステップ3:イメージ参照を確認する

podが使用しているイメージを確認しましょう。

~$kubectl get pod $POD -o jsonpath='{.spec.containers[*].image}'
public.ecr.aws/aws-containers/retailing-store-sample-ui:1.2.1

イメージURIから、このイメージはAWSのパブリックECRリポジトリから参照されていることがわかります。

ステップ4:イメージの存在を確認する

aws-containers ECRでretailing-store-sample-uiという名前でタグ1.2.1が付いたイメージが存在するかどうかを確認してみましょう。「retailing-store-sample-ui」を検索すると、そのようなイメージリポジトリが表示されないことがわかります。また、ブラウザでイメージURIを使用して、パブリックECRでイメージの存在を簡単に確認することもできます。私たちのケースでは、image-uriに「Repository not found」(リポジトリが見つかりません)というメッセージが表示されます。

RepoDoesNotExist

ステップ5:正しいイメージでデプロイメントを更新する

この問題を解決するには、正しいイメージ参照でデプロイメント/pod仕様を更新する必要があります。私たちのケースでは、それはpublic.ecr.aws/aws-containers/retail-store-sample-ui:1.2.1です。

5.1. イメージが存在するか確認する

デプロイメントを更新する前に、前述の方法でこのイメージが存在するかどうかを確認しましょう。つまり、image-uriにアクセスします。retail-store-sample-uiイメージが1.2.1を含む複数のタグで利用可能であることが確認できるはずです。

RepoExist

5.1. デプロイメントのイメージを正しい参照で更新する

~$kubectl patch deployment ui-new --patch '{"spec": {"template": {"spec": {"containers": [{"name": "ui", "image": "public.ecr.aws/aws-containers/retail-store-sample-ui:1.2.1"}]}}}}'
deployment.apps/ui-new patched

ステップ6:修正を確認する

新しいpodが作成され、正常に実行されていることを確認します。

~$kubectl get pods -l app=app-new
NAME                     READY   STATUS    RESTARTS   AGE
ui-new-77856467b-2z2s6   1/1     Running   0          13s

まとめ

パブリックイメージに関するpodのImagePullBackOffのトラブルシューティングの一般的なワークフローには以下が含まれます:

  • 「not found」、「access denied」または「timeout」などの問題の原因に関する手がかりについて、podイベントを確認します。
  • 「not found」の場合、参照されたパスにイメージが存在することを確認します。
  • 「access denied」の場合、ワーカーノードロールの権限を確認します。
  • ECRのパブリックイメージでタイムアウトが発生した場合は、ワーカーノードのネットワーク設定がIGW/TGW/NATを介してインターネットに到達するように構成されていることを確認します。