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このロールを追加すると、デフォルトのサービスアカウントを参照する
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 や 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 ファイルのサンプル
{
"auths":{
"cloud.openshift.com":{
"auth":"b3Blb=",
"email":"you@example.com"
},
"quay.io":{
"auth":"b3Blb=",
"email":"you@example.com"
},
"quay.io/repository-main":{
"auth":"b3Blb=",
"email":"you@example.com"
}
}
}
プルシークレットの例
apiVersion: v1
data:
.dockerconfigjson: ewogICAiYXV0aHMiOnsKICAgICAgIm0iOnsKICAgICAgIsKICAgICAgICAgImF1dGgiOiJiM0JsYj0iLAogICAgICAgICAiZW1haWwiOiJ5b3VAZXhhbXBsZS5jb20iCiAgICAgIH0KICAgfQp9Cg==
kind: Secret
metadata:
creationTimestamp: "2021-09-09T19:10:11Z"
name: pull-secret
namespace: default
resourceVersion: "37676"
uid: e2851531-01bc-48ba-878c-de96cfe31020
type: Opaque
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.config/containers/auth.jsonを使用する Podman クライアントの場合は、次のコマンドを入力します。$ oc create secret generic <pull_secret_name> \ --from-file=<path/to/.config/containers/auth.json> \ --type=kubernetes.io/podmanconfigjson
セキュアなレジストリーの Docker 認証情報ファイルがまだない場合は、次のコマンドを実行してシークレットを作成できます。
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
5.4.2.2. ワークロードでのプルシークレットの使用 リンクのコピーリンクがクリップボードにコピーされました!
プルシークレットを使用すると、ワークロードが次のいずれかの方法でプライベートレジストリーからイメージをプルできるようになります。
-
シークレットを
ServiceAccountにリンクする。これにより、そのサービスアカウントを使用するすべての Pod にシークレットが自動的に適用されます。 -
ワークロード設定で
imagePullSecretsを直接定義する。これは GitOps や ArgoCD などの環境に役立ちます。
手順
サービスアカウントにシークレットを追加することで、Pod のイメージをプルするためのシークレットを使用できます。サービスアカウントの名前は、Pod が使用するサービスアカウントの名前と一致する必要があることに注意してください。デフォルトのサービスアカウントは
defaultです。次のコマンドを入力してプルシークレットを
ServiceAccountにリンクします。$ oc secrets link default <pull_secret_name> --for=pull変更を確認するために、次のコマンドを入力します。
$ oc get serviceaccount default -o yaml出力例
apiVersion: v1 imagePullSecrets: - name: default-dockercfg-123456 - name: <pull_secret_name> kind: ServiceAccount metadata: annotations: openshift.io/internal-registry-pull-secret-ref: <internal_registry_pull_secret> creationTimestamp: "2025-03-03T20:07:52Z" name: default namespace: default resourceVersion: "13914" uid: 9f62dd88-110d-4879-9e27-1ffe269poe3 secrets: - name: <pull_secret_name>
シークレットをサービスアカウントにリンクする代わりに、Pod またはワークロード定義で直接参照することもできます。これは ArgoCD などの GitOps ワークフローに役立ちます。以下に例を示します。
Pod 仕様の例
apiVersion: v1 kind: Pod metadata: name: <secure_pod_name> spec: containers: - name: <container_name> image: quay.io/my-private-image imagePullSecrets: - name: <pull_secret_name>ArgoCD ワークフローの例
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: <example_workflow> spec: entrypoint: <main_task> imagePullSecrets: - name: <pull_secret_name>
5.4.2.3. 委任された認証を使用したプライベートレジストリーからのプル リンクのコピーリンクがクリップボードにコピーされました!
プライベートレジストリーは認証を別個のサービスに委任できます。この場合、イメージプルシークレットは認証およびレジストリーのエンドポイントの両方に対して定義される必要があります。
手順
委任された認証サーバーのシークレットを作成します。
$ 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. グローバルクラスターのプルシークレットの更新 リンクのコピーリンクがクリップボードにコピーされました!
現在のプルシークレットを置き換えるか、新しいプルシークレットを追加することで、クラスターのグローバルプルシークレットを更新できます。
クラスターを別の所有者に譲渡するには、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>1 - 1
<pull_secret_location>: プルシークレットファイルへのパスを指定します。
以下のコマンドを実行して、新しいプルシークレットを追加します。
$ oc registry login --registry="<registry>" \1 --auth-basic="<username>:<password>" \2 --to=<pull_secret_location>3 プルシークレットファイルを手動で更新することもできます。
以下のコマンドを実行して、クラスターのグローバルプルシークレットを更新します。
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location>1 - 1
<pull_secret_location>: 新しいプルシークレットファイルへのパスを指定します。
この更新はすべてのノードにロールアウトされます。これには、クラスターのサイズに応じて多少時間がかかる場合があります。
注記OpenShift Container Platform 4.7.4 の時点で、グローバルプルシークレットへの変更によってノードの drain (Pod の退避) の実行または再起動がトリガーされなくなりました。