Amazon EKS のポッドステータスエラーの ErrImagePull エラーと ImagePullBackoff エラーをトラブルシューティングする方法を教えてください。

所要時間5分
0

使用している Amazon Elastic Kubernetes Service (Amazon EKS) のポッドステータスが ErrImagePull または ImagePullBackoff ステータスになっています。

簡単な説明

kubectl コマンドの get pods を実行したときに、ポッドが ImagePullBackoff ステータスになっている場合、ポッドは正しく実行されていません。ImagePullBackOff ステータスは、イメージを取得またはプルできなかったためにコンテナを起動できなかったことを意味します。詳細については、「Amazon EKS コネクタポッドが ImagePullBackoff ステータスになっています」を参照してください。

次の場合、ImagePull エラーが表示されることがあります。

  • イメージ名、タグ、またはダイジェストが正しくない場合。
  • イメージの認証に認証情報が必要な場合。
  • レジストリにアクセスできない場合。

解決方法

1.ポッドのステータス、エラーメッセージを確認し、イメージ名、タグ、SHA が正しいことを確認します。

ポッドのステータスを取得するには、kubectl コマンドの get pods を実行します。

$ kubectl get pods -n default
NAME                              READY   STATUS             RESTARTS   AGE
nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s

ポッドのエラーメッセージの詳細を取得するには、次のように、kubectl コマンドの describe pod を実行します。

$ kubectl describe pod nginx-7cdbb5f49f-2p6p2

...
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  4m23s                 default-scheduler  Successfully assigned default/nginx-7cdbb5f49f-2p6p2 to ip-192-168-149-143.us-east-2.compute.internal
  Normal   Pulling    2m44s (x4 over 4m9s)  kubelet            Pulling image "nginxx:latest"
  Warning  Failed     2m43s (x4 over 4m9s)  kubelet            Failed to pull image "nginxx:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for nginxx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     2m43s (x4 over 4m9s)  kubelet            Error: ErrImagePull
  Warning  Failed     2m32s (x6 over 4m8s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    2m17s (x7 over 4m8s)  kubelet            Back-off pulling image "nginxx:latest"

$ kubectl describe pod nginx-55d75d5f56-qrqmp ...Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m20s default-scheduler Successfully assigned default/nginx-55d75d5f56-qrqmp to ip-192-168-149-143.us-east-2.compute.internal Normal Pulling 40s (x4 over 2m6s) kubelet Pulling image "nginx:latestttt" Warning Failed 39s (x4 over 2m5s) kubelet Failed to pull image "nginx:latestttt": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:latestttt not found: manifest unknown: manifest unknown Warning Failed 39s (x4 over 2m5s) kubelet Error: ErrImagePull Warning Failed 26s (x6 over 2m5s) kubelet Error: ImagePullBackOff Normal BackOff 11s (x7 over 2m5s) kubelet Back-off pulling image "nginx:latestttt" イメージタグと名前が存在し、正しいことを確認してください。イメージレジストリが認証を必要とする場合は、アクセスする権限があることを確認してください。ポッドで使用されているイメージが正しいことを確認するには、次のコマンドを実行します。

$ kubectl get pods nginx-7cdbb5f49f-2p6p2  -o jsonpath="{.spec.containers[*].image}" | \sort

nginxx:latest

ポッドのステータス値については、Kubernetes ウェブサイトの「ポッドフェーズ」を参照してください。

詳細については、「Amazon EKS でポッドのステータスをトラブルシューティングするにはどうすればよいですか?」を参照してください。

2.Amazon Elastic Container Registry (Amazon ECR) イメージ

Amazon EKS を使用して Amazon ECR からイメージを取得しようとしている場合は、追加の設定が必要になる場合があります。イメージが Amazon ECR プライベートレジストリに保存されている場合は、ポッドに imagePullSecrets という認証情報を必ず指定してください。この認証情報は、プライベートレジストリでの認証に使用します。

regcred という名前のシークレットを作成します。

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

必ず次の認証情報を置き換えてください。

  • <your-registry-server> はプライベート Docker レジストリの FQDN です。DockerHub には https://index.docker.io/v1/ を使用します。
  • <your-name> はあなたの Docker ユーザー名です。
  • <your-pword> はあなたの Docker パスワードです。
  • <your-email> はあなたの Docker E メールアドレスです。

これで、クラスター内の Docker 認証情報が regcred という名前のシークレットとして正常に設定されました。

regcred シークレットの内容を理解するには、シークレットを YAML 形式でご覧ください。

kubectl get secret regcred --output=yaml

次の例では、ポッドは regcred 内の Docker 認証情報にアクセスする必要があります。

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

your.private.registry.example を、次のようなプライベートレジストリ内のイメージへのパスに置き換えます。

your.private.registry.example.com/bob/bob-private:v1

プライベートレジストリからイメージを取得するには、Kubernetes には認証情報が必要です。設定ファイルの imagePullSecrets フィールドには、Kubernetes が regcred という名前のシークレットから認証情報を取得する必要があると指定されています。

シークレットを作成するその他のオプションについては、Kubernetes ウェブサイトの「シークレットを使用してイメージを取得するポッドの作成」を参照してください。

3.レジストリのトラブルシューティング

次の例では、kubelet がプライベートレジストリエンドポイントにアクセスできないため、ネットワーク接続の問題によりレジストリにアクセスできません。

$ kubectl describe pods nginx-9cc69448d-vgm4m

...
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  16m                default-scheduler  Successfully assigned default/nginx-9cc69448d-vgm4m to ip-192-168-149-143.us-east-2.compute.internal
  Normal   Pulling    15m (x3 over 16m)  kubelet            Pulling image "nginx:stable"
  Warning  Failed     15m (x3 over 16m)  kubelet            Failed to pull image "nginx:stable": rpc error: code = Unknown desc = Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  Warning  Failed     15m (x3 over 16m)  kubelet            Error: ErrImagePull
  Normal   BackOff    14m (x4 over 16m)  kubelet            Back-off pulling image "nginx:stable"
  Warning  Failed     14m (x4 over 16m)  kubelet            Error: ImagePullBackOff

「イメージをプルできませんでした...」というエラーは、kubelet が Docker レジストリエンドポイントに接続しようとしたが、接続タイムアウトにより失敗したことを意味します。

このエラーをトラブルシューティングするには、指定されたレジストリエンドポイントへの通信を許可するサブネット、セキュリティグループ、ネットワーク ACL を確認してください。

次の例では、レジストリのレート制限を超えています。

$ kubectl describe pod nginx-6bf9f7cf5d-22q48

...
Events:
  Type     Reason                  Age                   From               Message
  ----     ------                  ----                  ----               -------
  Normal   Scheduled               3m54s                 default-scheduler  Successfully assigned default/nginx-6bf9f7cf5d-22q48 to ip-192-168-153-54.us-east-2.compute.internal
  Warning  FailedCreatePodSandBox  3m33s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "82065dea585e8428eaf9df89936653b5ef12b53bef7f83baddb22edc59cd562a" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m53s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "20f2e27ba6d813ffc754a12a1444aa20d552cc9d665f4fe5506b02a4fb53db36" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m35s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "d9b7e98187e84fed907ff882279bf16223bf5ed0176b03dff3b860ca9a7d5e03" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "c02c8b65d7d49c94aadd396cb57031d6df5e718ab629237cdea63d2185dbbfb0" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Normal   SandboxChanged          119s (x4 over 3m13s)  kubelet            Pod sandbox changed, it will be killed and re-created.
  Normal   Pulling                 56s (x3 over 99s)     kubelet            Pulling image "httpd:latest"
  Warning  Failed                  56s (x3 over 99s)     kubelet            Failed to pull image "httpd:latest": rpc error: code = Unknown desc = Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
  Warning  Failed                  56s (x3 over 99s)     kubelet            Error: ErrImagePull
  Normal   BackOff                 43s (x4 over 98s)     kubelet            Back-off pulling image "httpd:latest"
  Warning  Failed                  43s (x4 over 98s)     kubelet            Error: ImagePullBackOff

Docker レジストリのレート制限は、匿名使用の場合は 6 時間あたり 100 件のコンテナイメージリクエストで、Docker アカウントの場合は 200 件です。これらの制限を超えるイメージリクエストは、6 時間が経過するまでアクセスが拒否されます。使用状況を管理し、レジストリのレート制限を理解するには、Docker ウェブサイトの「Docker Hub のレート制限について」を参照してください。


関連情報

Amazon EKS のトラブルシューティング

Amazon EKS で Amazon ECR の問題をトラブルシューティングする方法を教えてください。

Amazon EKS のセキュリティベストプラクティス

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ