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
レジストリーからもプルできます。
-
デプロイメント YAML ファイルでイメージの名前とタグが正しく使用されていることを確認します。
ibmcloud cr images
-
プル・トラフィックとストレージ割り当て量を確認します。 限界に達した場合は、使用済みストレージを解放するか、割り当て量を増やすようにレジストリー管理者に依頼してください。
ibmcloud cr quota
-
失敗するポッドのポッド構成ファイルを取得して、
imagePullSecrets
セクションを探します。kubectl get pod <pod_name> -o yaml
出力例
... imagePullSecrets: - name: all-icr-io ...
-
イメージ・プル・シークレットが 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"
all-icr-io
Kubernetes 名前空間から、ワークロードをデプロイする名前空間に、default
イメージ・プル・シークレットをコピーします。- この Kubernetes 名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、名前空間内のすべてのポッドがイメージ・プル・シークレット資格情報を使用できるようにします。
-
イメージ・プル・シークレットがポッドにリストされている場合、IBM Cloud Container Registry にアクセスするために使用する資格情報のタイプを決定します。
- シークレットの名前に
icr
が入っている場合は、icr.io
ドメイン・ネームで認証する API キーを使用しています。 API キーを使用するイメージ・プル・シークレットのトラブルシューティングに進みます。 - 両方のタイプのシークレットがある場合は、両方の認証方式を使用しています。 今後は、コンテナー・イメージのデプロイメント YAML で
icr.io
ドメイン・ネームを使用します。 API キーを使用するイメージ・プル・シークレットのトラブルシューティングに進みます。
- シークレットの名前に
API キーを使用するイメージ・プル・シークレットのトラブルシューティング
ポッド構成で、API キーを使用するイメージ・プル・シークレットが使用されている場合、API キー資格情報が正しくセットアップされていることを確認します。
以下の手順では、API キーにサービス ID の資格情報が保管されていることを想定しています。 個別ユーザーの API キーを使用するイメージ・プル・シークレットをセットアップしている場合、ユーザーの IBM Cloud IAM 許可および資格情報を確認する必要があります。
-
説明を確認して、イメージ・プル・シークレット用に 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
-
サービス 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>
-
イメージ・プル・シークレットの資格情報が有効かどうかを確認します。
-
イメージ・プル・シークレットの構成を取得します。 ポッドが
default
名前空間にない場合は、-n
オプションを含めます。kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
-
出力で、
.dockerconfigjson
フィールドの base64 エンコード値をコピーします。apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ...
-
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>"}}}
-
イメージ・プル・シークレットのリージョンレジストリー・ドメイン・ネームと、コンテナー・イメージで指定されているドメイン・ネームを比較します。 デフォルトで、新規クラスターでは
default
Kubernetes 名前空間で実行されるコンテナーのリージョン・レジストリー・ドメイン・ネームごとにイメージ・プル・シークレットが作成されます。 ただし、デフォルト設定を変更した場合や、別の Kubernetes 名前空間を使用している場合は、リージョン・レジストリーのイメージ・プル・シークレットがない可能性があります。 リージョン・レジストリー・ドメイン・ネームのイメージ・プル・シークレットをコピーします。 -
イメージ・プル・シークレットの
username
とpassword
を使用して、ローカル・マシンからレジストリーにログインします。 ログインできない場合は、サービス ID を修正する必要がある場合があります。docker login -u iamapikey -p <password_string> <region>.icr.io
default
Kubernetes 名前空間で実行されるコンテナーのクラスター・サービス ID、IBM Cloud IAM ポリシー、API キー、およびイメージ・プル・シークレットを再作成します。ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
default
Kubernetes 名前空間のデプロイメントを再作成します。 それでも許可エラー・メッセージが表示される場合は、新規イメージ・プル・シークレットでステップ 1 から 5 を繰り返します。 それでもログインできない場合は、IBM Cloud サポートの Case をオープンしてください。
-
ログインに成功した場合は、イメージをローカルにプルします。 コマンドが
access denied
エラーで失敗する場合は、レジストリー・アカウントがクラスターとは別の IBM Cloud アカウントにあります。 他のアカウントにあるイメージにアクセスするためのイメージ・プル・シークレットを作成します。 イメージをローカル・マシンにプルできる場合、API キーには正しい権限がありますが、クラスター内の API セットアップは正しくありません。docker pull <region>icr.io/<namespace>/<image>:<tag>
-
プル・シークレットが、デプロイメントから直接参照されているか、デプロイメントで使用しているサービス・アカウントから参照されていることを確認します。 それでも問題が解決しない場合には、サポートにお問い合わせください。
-