KubernetesのImagePullBackOff・ErrImagePullの原因|認証・タグ・通信
ImagePullBackOff・ErrImagePullはイメージ取得段階の障害です。PodのEventsに出ている実際の失敗内容を起点に、名前・タグ・認証・通信の原因を分けます。
この記事の目的
アプリ起動後のクラッシュとは区別し、レジストリからのイメージ取得失敗を調べます。
最初にやること
kubectl describe podのEventsを確認し、設定したイメージの名前・タグ・認証を照合します。
app・APP・POD_NAME・CONTAINER_NAMEは例です。context・namespace・権限を実環境で確認してください。関連するガイド
Kubernetes・kubectl基本操作
対象と原因を絞り、変更前後の確認手順へ進みます。
記事を読む →KubernetesCrashLoopBackOffの原因
対象と原因を絞り、変更前後の確認手順へ進みます。
記事を読む →KubernetesDeploymentの更新と切り戻し
rollout history・status・undoと変更前後の確認を行います。
記事を読む →1. ErrImagePullとImagePullBackOffの違い
ErrImagePullはイメージ取得処理の失敗、ImagePullBackOffは失敗後の再試行待ちの表示です。まだアプリプロセスが起動できていない段階であり、CrashLoopBackOffとは切り分けの起点が異なります。
2. Eventsとimage指定を確認
エラー行の理由(例:manifest unknown・unauthorized・no such host・x509)を記録します。イメージ名・タグ・digestはリポジトリ側の公開内容と一致する必要があります。
3. エラー別の次の確認
| 表示例 | 確認先 |
|---|---|
| manifest unknown / not found | イメージのリポジトリ名・タグ・digestと公開状況 |
| unauthorized / denied | ServiceAccount、imagePullSecrets、レジストリ認証 |
| no such host | NodeからのDNS名前解決・レジストリ名 |
| i/o timeout / connection refused | Node→レジストリの通信・Proxy・Firewall |
| x509 | 証明書チェーン・CA設定・ノード時刻 |
| Too Many Requests | レジストリのレート制限・認証と利用枠 |
4. imagePullSecretsとNamespace
通常Podは同じNamespaceのpull Secretを参照します。ServiceAccountに設定されている場合もあるため、Podの実際の参照先を確認します。
kubectl get secret -o yamlで取得して公開ログへ貼らないでください。base64は暗号化ではありません。5. 実際にPullする場所を確認
Kubernetesでイメージを取得するのはNode側のコンテナランタイムです。作業端末でdocker pullが成功しても、NodeでのDNS・Proxy・証明書・認証が正しい証明にはなりません。
Nodeのネットワークが原因ならLinuxネットワークの確認手順も参考になります。
6. イベント別に修正して再確認する
以下は想定イベント例であり実機実測ではありません。 変更を行う前に対象のDeployment/Pod、Node、イメージのタグまたはdigest、Secret名、GitOps/CI等の管理元を記録します。
| 想定されたEvents表示 | 具体的な修正条件・次の確認 |
|---|---|
manifest unknown / not found | 配布元レジストリで実在するdigest・タグを管理担当者が確認。指定ミスならマニフェストの管理元で修正し、旧イメージ参照を保持する |
unauthorized / denied | Podで有効になったimagePullSecrets、同一NamespaceのSecret名・type、ServiceAccount、認証先と必要権限を照合。資格情報を出力・チャットへ貼らない |
no such host / i/o timeout | 実際のPod配置Node・ノードのDNS/Proxy/Firewall/レジストリ疎通を管理担当へ調査依頼。作業端末のDocker pull成功だけでは復旧と判断しない |
x509 / TLS検証エラー | Nodeの信頼CA、証明書の有効期限、ホスト名一致、時刻を調べ、正しい証明書を配布。TLS検証を無効化して通さない |
Too Many Requests | レジストリ側の制限と認証状態を確認し、承認された取得頻度・キャッシュ・認証方式に変更。単なる再起動連打を避ける |
SERVICEACCOUNT_NAMEはPodで実際に指定されているServiceAccount名に置き換えます。指定が省略されている場合は対象Namespaceのdefault ServiceAccountを確認します。SecretはPodと同じNamespaceに存在する必要があります。変更前にGitOps管理元・配布イメージの可用性・既存サービスへの影響を確認し、承認済みマニフェストの更新を優先してください。
完了条件:ImagePullのEventsが再発せず、コンテナが開始し、Pod Ready・アプリログ・業務通信まで正常であること。修正後も失敗する場合はNode側のコンテナランタイム・レジストリ運用者へ時刻・エラー種別・対象Nodeを渡します。実際に起動後クラッシュする場合はCrashLoopBackOffの調査に切り替えます。
7. 修正後の確認
Pullが解消してもPodがReadyにならない場合があります。コンテナ起動後に落ちるならCrashLoopBackOffの原因確認へ切り替えます。