IBM Cloud Docs
ImagePullBackOff エラーまたは許可エラーでレジストリーからイメージをプルできないのはなぜですか?

ImagePullBackOff エラーまたは許可エラーでレジストリーからイメージをプルできないのはなぜですか?

仮想プライベート・クラウド クラシック・インフラストラクチャー

IBM Cloud Container Registry からイメージをプルするワークロードをデプロイすると、ポッドが ImagePullBackOff 状況で失敗します。

kubectl get pods
NAME         READY     STATUS             RESTARTS   AGE
<pod_name>   0/1       ImagePullBackOff   0          2m

ポッドに describe を実行すると、以下のような認証エラーが表示されます。

kubectl describe pod <pod_name>
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... 401 Unauthorized
Failed to pull image "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... 401 Unauthorized
...
Failed to pull image "<image>:<tag>" ... Manifest for <image>:<tag> not found

クラスターは、 イメージ・プル・シークレット に保管されている API キーを使用して、 IBM Cloud Container Registryからイメージをプルする権限をクラスターに付与するか、特定のタグを持つイメージがリポジトリーに存在しません。

デフォルトで、新規クラスターでは API キーを使用するイメージ・プル・シークレットが作成されるので、クラスターは、icr.io Kubernetes 名前空間にデプロイされるコンテナーのイメージをどのリージョンの default レジストリーからもプルできます。

  1. デプロイメント YAML ファイルでイメージの名前とタグが正しく使用されていることを確認します。

    ibmcloud cr images
    
  2. プル・トラフィックとストレージ割り当て量を確認します。 限界に達した場合は、使用済みストレージを解放するか、割り当て量を増やすようにレジストリー管理者に依頼してください。

    ibmcloud cr quota
    
  3. 失敗するポッドのポッド構成ファイルを取得して、imagePullSecrets セクションを探します。

    kubectl get pod <pod_name> -o yaml
    

    出力例

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. イメージ・プル・シークレットが 1 つもリストされない場合は、名前空間にイメージ・プル・シークレットをセットアップします。

    1. default 名前空間に、使用する各リージョン・レジストリーの icr-io イメージ・プル・シークレットが含まれることを確認します。 名前空間に icr-io シークレットがリストされない場合は、ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> コマンドを使用して、イメージ・プル・シークレットを default 名前空間に作成します。
      kubectl get secrets -n default | grep "icr-io"
      
    2. all-icr-io Kubernetes 名前空間から、ワークロードをデプロイする名前空間に、default イメージ・プル・シークレットをコピーします
    3. この Kubernetes 名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、名前空間内のすべてのポッドがイメージ・プル・シークレット資格情報を使用できるようにします。
  5. イメージ・プル・シークレットがポッドにリストされている場合、IBM Cloud Container Registry にアクセスするために使用する資格情報のタイプを決定します。

API キーを使用するイメージ・プル・シークレットのトラブルシューティング

ポッド構成で、API キーを使用するイメージ・プル・シークレットが使用されている場合、API キー資格情報が正しくセットアップされていることを確認します。

以下の手順では、API キーにサービス ID の資格情報が保管されていることを想定しています。 個別ユーザーの API キーを使用するイメージ・プル・シークレットをセットアップしている場合、ユーザーの IBM Cloud IAM 許可および資格情報を確認する必要があります。

  1. 説明を確認して、イメージ・プル・シークレット用に API キーで使用されるサービス ID を見つけます。 クラスターを使用して作成されるサービス ID は cluster-<cluster_ID> という名前で、default Kubernetes 名前空間で使用されます。 別の Kubernetes 名前空間にアクセスする、または IBM Cloud IAM 許可を変更するなどのために、別のサービス ID を作成した場合は、説明はカスタマイズされています。

    ibmcloud iam service-ids
    

    出力例

    UUID                Name               Created At              Last Updated            Description                                                                                                                                                                                         Locked
    ServiceId-aa11...   <service_ID_name>  2019-02-01T19:01+0000   2019-02-01T19:01+0000   ID for <cluster_name>                                                                                                                                         false
    ServiceId-bb22...   <service_ID_name>  2019-02-01T19:01+0000   2019-02-01T19:01+0000   Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>                                                                                                                                         false
    
  2. サービス ID に少なくとも IBM Cloud IAM リーダーサービス・アクセス役割ポリシーが IBM Cloud Container Registry に対して割り当てられていることを確認します。 サービス ID にリーダーのサービス・アクセス役割が割り当てられていない場合は、IAM ポリシーを編集します。 ポリシーが正しい場合は、次のステップに進み、資格情報が有効かどうかを確認してください。

    ibmcloud iam service-policies <service_ID_name>
    

    出力例

    Policy ID:   a111a111-b22b-333c-d4dd-e555555555e5
    Roles:       Reader
    Resources:
                  Service Name       container-registry
                  Service Instance
                  Region
                  Resource Type      namespace
                  Resource           <registry_namespace>
    
  3. イメージ・プル・シークレットの資格情報が有効かどうかを確認します。

    1. イメージ・プル・シークレットの構成を取得します。 ポッドが default 名前空間にない場合は、 -n オプションを含めます。

      kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
      
    2. 出力で、.dockerconfigjson フィールドの base64 エンコード値をコピーします。

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. base64 ストリングをデコードします。 例えば、OS X の場合、以下のコマンドを実行できます。

      echo -n "<base64_string>" | base64 --decode
      

      出力例

      {"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
      
    4. イメージ・プル・シークレットのリージョンレジストリー・ドメイン・ネームと、コンテナー・イメージで指定されているドメイン・ネームを比較します。 デフォルトで、新規クラスターでは default Kubernetes 名前空間で実行されるコンテナーのリージョン・レジストリー・ドメイン・ネームごとにイメージ・プル・シークレットが作成されます。 ただし、デフォルト設定を変更した場合や、別の Kubernetes 名前空間を使用している場合は、リージョン・レジストリーのイメージ・プル・シークレットがない可能性があります。 リージョン・レジストリー・ドメイン・ネームのイメージ・プル・シークレットをコピーします

    5. イメージ・プル・シークレットの usernamepassword を使用して、ローカル・マシンからレジストリーにログインします。 ログインできない場合は、サービス ID を修正する必要がある場合があります。

      docker login -u iamapikey -p <password_string> <region>.icr.io
      
      1. default Kubernetes 名前空間で実行されるコンテナーのクラスター・サービス ID、IBM Cloud IAM ポリシー、API キー、およびイメージ・プル・シークレットを再作成します。
        ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. default Kubernetes 名前空間のデプロイメントを再作成します。 それでも許可エラー・メッセージが表示される場合は、新規イメージ・プル・シークレットでステップ 1 から 5 を繰り返します。 それでもログインできない場合は、IBM Cloud サポートの Case をオープンしてください
    6. ログインに成功した場合は、イメージをローカルにプルします。 コマンドが access denied エラーで失敗する場合は、レジストリー・アカウントがクラスターとは別の IBM Cloud アカウントにあります。 他のアカウントにあるイメージにアクセスするためのイメージ・プル・シークレットを作成します。 イメージをローカル・マシンにプルできる場合、API キーには正しい権限がありますが、クラスター内の API セットアップは正しくありません。

      docker pull <region>icr.io/<namespace>/<image>:<tag>
      
    7. プル・シークレットが、デプロイメントから直接参照されているか、デプロイメントで使用しているサービス・アカウントから参照されていることを確認します。 それでも問題が解決しない場合には、サポートにお問い合わせください。