5.4. イメージプルシークレットの使用
OpenShift イメージレジストリーを使用し、同じプロジェクトにあるイメージストリームからプルしている場合は、Pod のサービスアカウントに適切なパーミッションがすでに設定されているために追加のアクションは不要です。
ただし、OpenShift Container Platform プロジェクト全体でイメージを参照する場合や、セキュリティー保護されたレジストリーからイメージを参照するなどの他のシナリオでは、追加の設定手順が必要になります。
イメージの プルシークレットは、Red Hat OpenShift Cluster Manager から取得 できます。このプルシークレットは pullSecret
と呼ばれます。
このプルシークレットを使用し、OpenShift Container Platform コンポーネントのコンテナーイメージを提供する組み込まれた各種の認証局 (Quay.io および registry.redhat.io) によって提供されるサービスで認証できます。
5.4.1. Pod が複数のプロジェクト間でイメージを参照できるようにする設定 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift イメージレジストリーを使用している場合で project-a
の Pod が project-b
のイメージを参照できるようにするには、project-a
のサービスアカウントが project-b
の system:image-puller
ロールにバインドされている必要があります。
Pod サービスアカウントまたは namespace を作成するときは、サービスアカウントが Docker プルシークレットでプロビジョニングされるまで待ちます。サービスアカウントが完全にプロビジョニングされる前に Pod を作成すると、Pod は OpenShift イメージレジストリーにアクセスできません。
手順
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
$ oc policy add-role-to-user \ system:image-puller system:serviceaccount:project-a:default \ --namespace=project-b
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このロールを追加すると、デフォルトのサービスアカウントを参照する
project-a
の Pod はproject-b
からイメージをプルできるようになります。project-a
のすべてのサービスアカウントにアクセスを許可するには、グループを使用します。oc policy add-role-to-group \ system:image-puller system:serviceaccounts:project-a \ --namespace=project-b
$ oc policy add-role-to-group \ system:image-puller system:serviceaccounts:project-a \ --namespace=project-b
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4.2. Pod が他のセキュリティー保護されたレジストリーからイメージを参照できるようにする設定 リンクのコピーリンクがクリップボードにコピーされました!
他のプライベートレジストリーレジストリーまたは保護されたレジストリーから保護されたコンテナーをプルするには、Docker や Podman などのコンテナークライアント認証情報からプルシークレットを作成し、それをサービスアカウントに追加する必要があります。
Docker と Podman は設定ファイルを使用して、保護されたレジストリーまたは保護されていないレジストリーへのログインに使用する認証の詳細を保存します。
-
Docker: Docker は、デフォルトで
$HOME/.docker/config.json
を使用します。 -
Podman: Podman は、デフォルトで
$HOME/.config/containers/auth.json
を使用します。
以前に保護されたレジストリーまたは保護されていないレジストリーにログインしたことがある場合、これらのファイルには認証情報が保存されます。
quay.io
や quay.io/<example_repository>
のような一意のパスがある場合、Docker と Podman の認証情報ファイルおよび関連するプルシークレットには、同一レジストリーへの複数の参照を含めることができます。ただし、Docker および Podman のいずれも、まったく同じレジストリーパスの複数エントリーはサポートしていません。
config.json
ファイルのサンプル
プルシークレットの例
5.4.2.1. プルシークレットの作成 リンクのコピーリンクがクリップボードにコピーされました!
手順
既存の認証ファイルからシークレットを作成します。
.docker/config.json
を使用する Docker クライアントの場合は、次のコマンドを入力します。oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson
$ oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<path/to/.docker/config.json> \ --type=kubernetes.io/dockerconfigjson
Copy to Clipboard Copied! Toggle word wrap Toggle overflow .config/containers/auth.json
を使用する Podman クライアントの場合は、次のコマンドを入力します。oc create secret generic <pull_secret_name> \ --from-file=<path/to/.config/containers/auth.json> \ --type=kubernetes.io/podmanconfigjson
$ oc create secret generic <pull_secret_name> \ --from-file=<path/to/.config/containers/auth.json> \ --type=kubernetes.io/podmanconfigjson
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
セキュアなレジストリーの Docker 認証情報ファイルがまだない場合は、次のコマンドを実行してシークレットを作成できます。
oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4.2.2. ワークロードでのプルシークレットの使用 リンクのコピーリンクがクリップボードにコピーされました!
プルシークレットを使用すると、ワークロードが次のいずれかの方法でプライベートレジストリーからイメージをプルできるようになります。
-
シークレットを
ServiceAccount
にリンクする。これにより、そのサービスアカウントを使用するすべての Pod にシークレットが自動的に適用されます。 -
ワークロード設定で
imagePullSecrets
を直接定義する。これは GitOps や ArgoCD などの環境に役立ちます。
手順
サービスアカウントにシークレットを追加することで、Pod のイメージをプルするためのシークレットを使用できます。サービスアカウントの名前は、Pod が使用するサービスアカウントの名前と一致する必要があることに注意してください。デフォルトのサービスアカウントは
default
です。次のコマンドを入力してプルシークレットを
ServiceAccount
にリンクします。oc secrets link default <pull_secret_name> --for=pull
$ oc secrets link default <pull_secret_name> --for=pull
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を確認するために、次のコマンドを入力します。
oc get serviceaccount default -o yaml
$ oc get serviceaccount default -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
シークレットをサービスアカウントにリンクする代わりに、Pod またはワークロード定義で直接参照することもできます。これは ArgoCD などの GitOps ワークフローに役立ちます。以下に例を示します。
Pod 仕様の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ArgoCD ワークフローの例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4.2.3. 委任された認証を使用したプライベートレジストリーからのプル リンクのコピーリンクがクリップボードにコピーされました!
プライベートレジストリーは認証を別個のサービスに委任できます。この場合、イメージプルシークレットは認証およびレジストリーのエンドポイントの両方に対して定義される必要があります。
手順
委任された認証サーバーのシークレットを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow プライベートレジストリーのシークレットを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4.3. グローバルクラスターのプルシークレットの更新 リンクのコピーリンクがクリップボードにコピーされました!
現在のプルシークレットを置き換えるか、新しいプルシークレットを追加することで、クラスターのグローバルプルシークレットを更新できます。
クラスターを別の所有者に移譲するには、まず OpenShift Cluster Manager で移譲を開始し、次にクラスターのプルシークレットを更新する必要があります。OpenShift Cluster Manager で委譲を開始せずに、クラスターのプルシークレットを更新すると、クラスターは OpenShift Cluster Manager での Telemetry メトリクスの報告を停止します。
クラスターの所有権の委譲 に関する詳細は、Red Hat OpenShift Cluster Manager ドキュメントの「クラスター所有権の委譲」を参照してください。
前提条件
-
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
オプション: 既存のプルシークレットに新しいプルシークレットを追加するには、以下の手順を実行します。
以下のコマンドを入力してプルシークレットをダウンロードします。
oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location>
$ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- プルシークレットファイルへのパスを指定します。
以下のコマンドを実行して、新しいプルシークレットを追加します。
oc registry login --registry="<registry>" \ --auth-basic="<username>:<password>" \ --to=<pull_secret_location>
$ oc registry login --registry="<registry>" \
1 --auth-basic="<username>:<password>" \
2 --to=<pull_secret_location>
3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、プルシークレットファイルを手動で更新することもできます。
以下のコマンドを実行して、クラスターのグローバルプルシークレットを更新します。
oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location>
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新規プルシークレットファイルへのパスを指定します。
この更新はすべてのノードにロールアウトされます。これには、クラスターのサイズに応じて多少時間がかかる場合があります。
注記OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードドレインまたは再起動がトリガーされなくなりました。