5.4. イメージプルシークレットの使用
OpenShift Container Platform の内部レジストリーを使用し、同じプロジェクトにあるイメージストリームからプルしている場合は、Pod のサービスアカウントには適切なパーミッションがすでに設定されているため、追加のアクションは不要です。
ただし、OpenShift Container Platform プロジェクト全体でイメージを参照する場合や、セキュリティー保護されたレジストリーからイメージを参照するなどの他のシナリオでは、追加の設定手順が必要になります。
5.4.1. Pod が複数のプロジェクト間でイメージを参照できるようにする設定
内部レジストリーを使用している場合で project-a の Pod が project-b のイメージを参照できるようにするには、project-a のサービスアカウントが project-b の system:image-puller
ロールにバインドされている必要があります。
手順
project-a の Pod が project-b のイメージを参照できるようにするには、project-a のサービスアカウントを project-b の
system:image-puller
ロールにバインドします。$ oc policy add-role-to-user \ system:image-puller system:serviceaccount:project-a:default \ --namespace=project-b
このロールを追加すると、デフォルトのサービスアカウントを参照する project-a の Pod は project-b からイメージをプルできるようになります。
project-a のすべてのサービスアカウントにアクセスを許可するには、グループを使用します。
$ oc policy add-role-to-group \ system:image-puller system:serviceaccounts:project-a \ --namespace=project-b
5.4.2. Pod が他のセキュリティー保護されたレジストリーからイメージを参照できるようにする設定
Docker クライアントの .dockercfg
$HOME/.docker/config.json
ファイルは、セキュア/非セキュアなレジストリーに事前にログインしている場合に認証情報を保存する Docker 認証情報ファイルです。
OpenShift Container Platform の内部レジストリーにないセキュリティー保護されたコンテナーイメージをプルするには、Docker 認証情報でプルシークレットを作成し、これをサービスアカウントに追加する必要があります。
手順
セキュリティー保護されたレジストリーの
.dockercfg
ファイルがすでにある場合は、以下を実行してそのファイルからシークレットを作成できます。$ oc create secret generic <pull_secret_name> \ --from-file=.dockercfg=<path/to/.dockercfg> \ --type=kubernetes.io/dockercfg
または、
$HOME/.docker/config.json
ファイルがある場合は以下を実行します。$ oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson
セキュリティー保護されたレジストリーの Docker 認証情報がない場合は、以下を実行してシークレットを作成できます。
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
Pod のイメージのプルにシークレットを使用するには、シークレットをサービスアカウントに追加する必要があります。この例では、サービスアカウントの名前は、Pod が使用するサービスアカウントの名前に一致している必要があります。
default
はデフォルトのサービスアカウントです。$ oc secrets link default <pull_secret_name> --for=pull
ビルドイメージのプッシュおよびプルにシークレットを使用するには、シークレットは Pod 内でマウント可能である必要があります。以下でこれを実行できます。
$ oc secrets link builder <pull_secret_name>
5.4.2.1. 委任された認証を使用したプライベートレジストリーからのプル
プライベートレジストリーは認証を別個のサービスに委任できます。この場合、イメージプルシークレットは認証およびレジストリーのエンドポイントの両方に対して定義される必要があります。
手順
委任された認証サーバーのシークレットを作成します。
$ oc create secret docker-registry \ --docker-server=sso.redhat.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ redhat-connect-sso secret/redhat-connect-sso
プライベートレジストリーのシークレットを作成します。
$ oc create secret docker-registry \ --docker-server=privateregistry.example.com \ --docker-username=developer@example.com \ --docker-password=******** \ --docker-email=unused \ private-registry secret/private-registry
5.4.3. グローバルクラスターのプルシークレットの更新
クラスターのグローバルプルシークレットを更新できます。
クラスターリソースは新規のプルシークレットに合わせて調整する必要がありますが、これにより、クラスターのユーザビリティーが一時的に制限される可能性があります。
前提条件
- アップロードする新規または変更されたプルシークレットファイルがある。
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
以下のコマンドを実行して、クラスターのグローバルプルシークレットを更新します。
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull-secret-location> 1
- 1
- 新規プルシークレットファイルへのパスを指定します。
この更新はすべてのノードにロールアウトされます。これには、クラスターのサイズに応じて多少時間がかかる場合があります。この間に、ノードがドレイン (解放) され、Pod は残りのノードで再スケジュールされます。