イメージ・レジストリーのセットアップ
Red Hat® OpenShift® on IBM Cloud® クラスターには、コンテナー・イメージをローカルにビルド、デプロイ、管理するための内部レジストリーが含まれています。 プライベート・レジストリーで企業全体のイメージへのアクセスを管理および制御するために、IBM Cloud® Container Registry を使用するようにクラスターをセットアップすることもできます。
イメージ・レジストリー・ソリューションの選択
コンテナ・イメージは、クラスタにアプリをデプロイするためにクラスタがアクセスできるコンテナ・レジストリに保存する必要があります。 Red Hat OpenShift クラスターの組み込みレジストリー、特定のユーザーにアクセス権限が制限されているプライベート・レジストリー、またはパブリック・レジストリーを使用することを選択できます。 以下の表を参照して、お客様のユース・ケースに最適なオプションを選択してください。
- 内部 Red Hat OpenShift コンテナー・レジストリー (OCR)
-
クラスターには内部 Red Hat OpenShift コンテナー・レジストリーがセットアップされているので、Red Hat OpenShift はクラスター内からアプリケーション・ライフサイクルを自動的にビルド、デプロイ、および管理できます。 イメージは、クラスターの作成時にプロビジョンされるバッキング用の IBM Cloud クラシック・ファイル・ストレージ・デバイスに保管されます。 ストレージが足りない場合は、デバイスのサイズを変更できます。 ユース・ケース:
- クラスター単位で実行される Red Hat OpenShift ネイティブのイメージのストリーム、ビルド、およびアプリのデプロイメント・プロセス。
- イメージはクラスター内のすべてのプロジェクトで共有できます。そのアクセスは RBAC 役割によって制御されます。
- 脆弱点スキャンなどの拡張機能のために、内部レジストリーに CloudForms などの他の Red Hat 製品を統合できます。
- ユーザーがパブリック・ネットワークを介してレジストリーからイメージをプルできるように、経路を使用して内部レジストリーを公開するオプション。
- プライベート・レジストリー (IBM Cloud Container Registry など) を使用してイメージのプルまたはイメージのプッシュを行うように内部レジストリーをセットアップするオプション。
-
詳しくは、内部レジストリーの使用を参照してください。
- プライベート・レジストリー
-
プライベート・レジストリーは、無許可ユーザーからイメージを保護するのに適した選択肢です。 プライベート・レジストリーは、アクセス権限、ストレージ割り当て量、イメージ・トラスト、その他の機能が意図したとおりに機能するように、クラスター管理者がセットアップする必要があります。 デフォルトでは、Red Hat OpenShift クラスター は、
default
プロジェクトのイメージ・プル・シークレットを介してプライベート IBM Cloud Container Registry と統合されます。IBM Cloud Container Registry は、独自のイメージを保管するための高可用性マルチテナント・プライベート・レジストリーです。 また、IBM 提供のイメージをグローバルicr.io
レジストリーからプルしたり、使用権を持つ適格なレジストリーから、ライセンス交付を受けたソフトウェアをプルしたりすることもできます。 IBM Cloud Container Registry では、IBM Cloud の IAM および請求処理との統合を利用して、複数のクラスターのイメージを管理できます。 内部レジストリーと一緒に IBM Cloud Container Registry を使用することの利点:- ローカル・イメージ・キャッシュにより、内部レジストリーを使用するビルドを高速化。
- 他のプロジェクトのデプロイメントでイメージ・ストリームを参照できるため、プル・シークレットを各プロジェクトにコピーする必要がない。
- 複数のクラスター間でイメージを共有できるので、複数のレジストリーにイメージをプッシュする必要がない。
- イメージの脆弱性の自動スキャン。
- IBM Cloud の IAM ポリシーおよび分離されたリージョンのレジストリーによるアクセスの制御。
- クラスター内のストレージ・スペースや接続されたストレージ・デバイスを必要としないイメージの保持。 イメージの数量を管理するポリシーを設定して、過剰なスペース使用を防止することも可能。
- VPCインフラストラクチャ:プライベート・レジストリ・サービス・エンドポイントを使用することで、プライベート・クラウド・サービス・エンドポイントのみを使用するクラスタもレジストリにアクセスできます。
- ストレージおよびイメージ・プル・トラフィックの割り当て量を設定できるのでイメージの保管、使用量、および請求処理の制御性が向上する。
- 使用権を持つレジストリーから、ライセンス交付を受けた IBM コンテンツをプルできる。
-
始めに、以下のトピックを参照してください。
- IBM Cloud Container Registry の概要。
- IBM Cloud Container Registry から内部レジストリーのイメージ・ストリームにイメージをインポートする。
- IBM Cloud Container Registry の使用。
- パブリック・レジストリー
-
Docker Hub などのパブリック・レジストリーを使用すると、チーム、会社、クラスター、またはクラウド・プロバイダー間でイメージを共有できます。 パブリック・レジストリーには、プライベート・レジストリー・コンポーネントを利用できるものもあります。 ユース・ケース:
- パブリック・ネットワークでのイメージのプッシュおよびプル。
- 複数のクラウド・プロバイダーでコンテナーを素早くテストする。
- 脆弱点スキャンやアクセス管理などのエンタープライズ・グレードの機能が不要。
-
詳細については、 Quayや Docker Hubなど、パブリック・レジストリのドキュメントを参照のこと。
内部レジストリーへのイメージの保管
Red Hat OpenShift クラスターには、デフォルトで内部レジストリーがあります。 内部レジストリー内のイメージはバックアップされますが、Red Hat OpenShift on IBM Cloud クラスターのインフラストラクチャー・プロバイダーに応じて異なる方法でバックアップされます。
- クラシック・クラスター
- Red Hat OpenShift クラスタはデフォルトで、 File Storage for Classic をバッキング・ストレージとして使用する内部レジストリでセットアップされています。 クラスターを削除すると、内部レジストリーとそのレジストリー内のイメージも削除されます。 イメージを保持する必要がある場合は、プライベート・レジストリー (IBM Cloud Container Registry など) を使用するか、イメージを永続ストレージ (Object Storage など) にバックアップするか、または独立した別個の Red Hat OpenShift コンテナー・レジストリー (OCR) クラスターを作成することを検討してください。 詳しくは、 Red Hat OpenShift 資料を参照してください。
- VPC クラスター
- Red Hat OpenShift クラスタの内部レジストリは、アカウント内の IBM Cloud Object Storage インスタンスに自動的に作成されるバケットにイメージをバックアップします。 オブジェクト・ストレージ・バケットに保管されているデータは、クラスターを削除しても残ります。
- クラシック、VPC、または Satellite のクラスター
- オプションで、内部レジストリを設定して、内部レジストリポッドが実行されるワーカーノードの
emptyDir
にデータを保存することもできます。 このデータは永続的ではないので、ポッドまたはワーカー・ノードが再始動された場合には、保管データが削除され、リカバリー不能になることに注意してください。 大きなイメージからコンテナーを定期的にビルドする場合は、イメージをemptyDir
でローカルに保管することでパフォーマンスが向上する可能性があります。
内部イメージ・レジストリのバックアップ先 IBM Cloud Object Storage
Virtual Private Cloud
Red Hat OpenShift クラスターの内部レジストリー内のイメージは、IBM Cloud Object Storage バケットに自動的にバックアップされます。 オブジェクト・ストレージ・バケットに保管されているデータは、クラスターを削除しても残ります。
ただし、クラスターの作成時にバケットの作成に失敗した場合は、バケットを手動で作成して、そのバケットを使用するようにクラスターをセットアップする必要があります。 それまでの間、内部レジストリーは、ワーカー・ノードの 2 次ディスクにコンテナー・イメージを保管する、emptyDir
Kubernetes ボリュームを使用します。 emptyDir
ボリュームは、永続的な高可用性ストレージとは見なされていません。イメージを使用するポッドを削除すると、イメージは自動的に削除されます。
内部レジストリー用のバケットを手動で作成するには、クラウド・オブジェクト・ストレージ・バケットに関するクラスター作成エラーを参照してください。
クラシック・クラスターの内部レジストリーへのイメージの保管
デフォルトでは、 Red Hat OpenShift クラスタの内部レジストリは IBM Cloud File Storage for Classic ボリュームを使用します。 このストレージ・ボリュームのデフォルトのサイズを確認したり、ボリューム・サイズを更新したりできます。
ボリュームの詳細の表示
ストレージ・クラスやサイズなどのボリュームの詳細を参照するには、永続ボリューム請求の詳細を表示します。
oc describe pvc -n openshift-image-registry image-registry-storage
ボリューム詳細の変更
レジストリーのイメージの保管容量をギガバイト単位で追加する必要がある場合は、ファイル・ストレージ・ボリュームのサイズを変更できます。 詳しくは、既存のストレージ・デバイスのサイズと IOPS の変更を参照してください。 IBM Cloud インフラストラクチャー・アカウントでボリュームのサイズを変更しても、アタッチされている
PVC の説明は更新されません。 代わりに、registry-backing
PVC を使用する openshift-image-registry
ポッドにログインして、ボリュームがサイズ変更されたことを確認できます。
ワーカー・ノードの空のディレクトリーへのイメージの保管
大きなイメージからコンテナーを定期的にビルドする場合は、内部レジストリーのイメージを、ベアメタル・ワーカー・ノードなどのワーカーノードの emptyDir
でローカルに保管することでパフォーマンスが向上する可能性があります。
このデータは永続的ではないので、ポッドまたはワーカー・ノードが再始動された場合には、保管データが削除され、リカバリー不能になることに注意してください。
- Red Hat OpenShift クラスターにアクセスします。
- イメージレジストリオペレータの configmap を更新して、ワーカーノードの
emptyDir
を使うようにストレージを設定します。emptyDir
を使用するように構成マップを更新しても、イメージ・レジストリーの元の PVC は削除 されない ことに注意してください。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
- イメージ・レジストリ・オペレータの管理状態が
Unmanaged
に設定されている場合( Satellite クラスターなど)、管理状態をManaged
に更新します。 そうすると、オペレーターが内部レジストリー・ポッドを更新します。oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
- 内部レジストリー・ポッドの詳細を取得して、更新内容を確認できるようにします。
-
image-registry
ポッドが実行されていること、また、クラスター内のワーカー・ノードごとにポッドが実行されていることを確認します。oc get pods -n openshift-image-registry
出力例
NAME READY STATUS RESTARTS AGE cluster-image-registry-operator-695bf78ffc-zvkhd 2/2 Running 0 33m image-registry-6774598589-65cnx 1/1 Running 0 112s node-ca-gg66r 1/1 Running 0 113s node-ca-n8jpq 1/1 Running 0 113s node-ca-p2d7j 1/1 Running 0 113s
-
** ポッドが実行されている**ノード
image-registry
のパブリック IP アドレスを取得します。oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node
出力例
Node: 169.xx.xxx.xxx/169.xx.xxx.xxx
ワーカー・ノードの IP アドレスがプライベートの場合は、
ibmcloud oc worker ls -c <cluster> | grep <private_IP>
を実行し、対応するパブリック IP アドレスをメモします。 -
ポッド YAML の ** セクションにある ** ポッドの
image-registry
UIDmetadata.uid
を取得します (metadata.ownerReferences.uid
セクションのレプリカ・セットの UID ではありません)。oc get pod -n openshift-image-registry <image-registry-pod> -o yaml
出力例
apiVersion: v1 kind: Pod metadata: uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b ...
-
- 内部レジストリーが、ワーカー・ノードの
emptyDir
にデータを保管することを確認します。-
以前に取得したワーカー・ノードを使用して、 クラスタからレジストリに直接アクセスします。 テスト・イメージを内部レジストリーにプッシュする手順に従ってください。
Red Hat OpenShift の資料に記載されているこの手順を実行するには、
podman
CLI ツールが必要です。 デフォルトでは、ワーカー・ノードにこの CLI ツールがない場合があります。 使用可能な RHEL バージョンについては、 Podman インストール・ガイド を参照してください。 -
emptyDir
に保存される内部レジストリー・ポッドのフォルダーに移動します。<pod_uid>
には、先ほど取得したポッド UID を使用します。cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
-
イメージがリポジトリー・ディレクトリーにあることを確認します。
ls
出力例
<myimage> nginx ...
-
内部イメージ・レジストリーの削除
Virtual Private Cloud
イメージレジストリオペレータの展開は Red Hat OpenShift on IBM Cloud 管理下のクラスターでのみ利用可能です。 HyperShiftのマネージドクラスターは、コントロールプレーンでイメージレジストリオペレーターを実行する。
内部イメージ・レジストリーを使用しない場合は、以下のステップを実行して削除できます。
- 内部レジストリー構成のコピーを保存します。
oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
- 以下のパッチ・コマンドを実行して、イメージ・レジストリーの管理状態を
Removed
に変更します。kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
- 管理状態を変更すると、クラスター内の
openshift-image-registry
名前空間からイメージ・レジストリー・サービスとデプロイメントが削除されます。 以下のコマンドを実行して、削除されたことを確認できます。 イメージ・レジストリーのデプロイメントとサービスのみが削除されることに注意してください。 イメージ・レジストリー・オペレーターのデプロイメントとサービスは残ります。oc get deployment -n openshift-image-registry
oc get svc -n openshift-image-registry
内部レジストリーのためのセキュアな外部経路のセットアップ
デフォルトでは、Red Hat OpenShift クラスターの内部レジストリーは、内部 IP アドレスを割り当てられたサービスを介して使用できます。 内部レジストリーをパブリック・ネットワークに公開するには、セキュアな再暗号化経路をセットアップします。 例えば、他のプロジェクトやクラスターでのデプロイメントでパブリック・レジストリーとして機能するように、クラスターの内部レジストリーをセットアップできます。
始める前に
- クラスターに対してマネージャーの IBM Cloud IAM サービス・アクセス役割を持っていることを確認します。
- パブリック経路を使用して内部レジストリーを公開するためにパブリック・ネットワークに接続できるクラスターであることを確認します。
- ローカル・マシンに Docker をインストールします。
- Red Hat OpenShift クラスターにアクセスします。
内部レジストリーを使用するために、そのレジストリーにアクセスするためのパブリック経路をセットアップします。 次に、レジストリーにアクセスするための資格情報が含まれるイメージ・プル・シークレットを作成します。これにより、他のプロジェクトのデプロイメントでこのレジストリーからイメージをプルできるようになります。
-
openshift-image-registry
プロジェクトから、内部レジストリー用のimage-registry
サービスが存在することを確認します。oc get svc -n openshift-image-registry
出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE image-registry ClusterIP 172.21.xxx.xxx <none> 5000/TCP 36d image-registry-operator ClusterIP None <none> 60000/TCP 36d
-
image-registry
サービスのために、reencrypt
の TLS 終端処理を使用するセキュアな経路を作成します。 再暗号化では、ルーターは、証明書を使用して TLS 接続を終端してから、別の証明書を使用して内部レジストリーへの接続を再暗号化します。 この方式を使用すると、ユーザーと内部レジストリーの間の接続パスの全体が暗号化されます。 独自のカスタムドメイン名を提供するには、--hostname
オプションを含めます。oc create route reencrypt --service=image-registry -n openshift-image-registry
-
** 経路に割り当てられたホスト名 (HOST/PORT) と **PORT
image-registry
を取得します。oc get route image-registry -n openshift-image-registry
出力例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD image-registry image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud image-registry 5000-tcp reencrypt None
-
パススルールートセットアップのように、同じクライアントIPアドレスが同じサーバーに到達するように、ルートを編集して ロードバランシングストラテジーを
source
。 この戦略を設定するには、metadata.annotations
セクションにアノテーション「haproxy.router.openshift.io/balance: source
」を追加します。 構成ファイルは、Red Hat OpenShift アプリケーション・コンソールで編集するか、またはコマンド・ラインで次のコマンドを実行して編集します。oc edit route image-registry -n openshift-image-registry
アノテーションを追加します。
apiVersion: route.openshift.io/v1 kind: Route metadata: annotations: haproxy.router.openshift.io/balance: source ...
-
ローカル・システムからプロキシーまたはファイアウォールを経由してパブリック・エンドポイントにアクセスすることが、企業のネットワーク・ポリシーによって禁止されている場合は、以下の手順に従って、内部レジストリー用に作成した経路のサブドメインへのアクセスを許可します。
-
ホスト名として経路を使用して内部レジストリーにログインします。
docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
-
ログインしたら、サンプルの
hello-world
アプリを内部レジストリーにプッシュしてみます。-
DockerHub から
hello-world
イメージをプルするか、ローカル・マシンでイメージを作成します。docker pull hello-world
-
内部レジストリーのホスト名、イメージのデプロイ先のプロジェクト、イメージ名とタグを指定して、ローカル・イメージにタグを付けます。
docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
-
クラスターの内部レジストリーにイメージをプッシュします。
docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
-
イメージが Red Hat OpenShift イメージ・ストリームに追加されていることを確認します。
oc get imagestream
出力例
NAME DOCKER REPO TAGS UPDATED hello-world image-registry-openshift-image-registry.svc:5000/default/hello-world latest 7 hours ago
-
-
プロジェクトのデプロイメントで、この内部レジストリーからイメージをプルできるように、内部レジストリーにアクセスするための資格情報を保持するイメージ・プル・シークレットをプロジェクト内に作成します。 次に、そのイメージ・プル・シークレットを各プロジェクトのデフォルトのサービス・アカウントに追加します。
-
デフォルトのサービス・アカウントで使用されているイメージ・プル・シークレットをリストし、
default-dockercfg
で始まるシークレットをメモします。oc describe sa default
出力例
... Image pull secrets: all-icr-io default-dockercfg-mpcn4 ...
-
構成ファイルの
data
フィールドから、エンコードされたシークレット情報を取得します。oc get secret <default-dockercfg-name> -o yaml
出力例
apiVersion: v1 data: .dockercfg: ey...=
-
data
フィールドの値をデコードします。echo "<ey...=>" | base64 -D
出力例
{"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
-
内部レジストリーの新規イメージ・プル・シークレットを作成します。
secret_name
: イメージ・プル・シークレットにinternal-registry
などの名前を付けます。--namespace
: イメージ・プル・シークレットを作成するプロジェクト (default
など) を入力します。--docker-server
: 内部サービス IP アドレス (172.21.xxx.xxx:5000
) の代わりに、ポート (image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000
) を使用してimage-registry
経路のホスト名を入力します。--docker-username
: 上記のイメージ・プル・シークレットの"username"
(serviceaccount
など) をコピーします。--docker-password
: 上記のイメージ・プル・シークレットの"password"
をコピーします。--docker-email
: Docker の E メール・アドレスがある場合は、その値を入力します。 ない場合は、a@b.c
のような架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。
oc create secret docker-registry internal-registry --namespace default --docker-server image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000 --docker-username serviceaccount --docker-password <eyJ...> --docker-email a@b.c
-
イメージ・プル・シークレットをプロジェクトのデフォルトのサービス・アカウントに追加します。
oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
-
内部レジストリーからイメージをプルする必要があるプロジェクトごとに、この手順を繰り返します。
-
アクセス可能な経路が内部レジストリーにセットアップされたので、このレジストリーにログインし、イメージをプッシュ/プルすることができます。 詳しくは、 Red Hat OpenShift 資料を参照してください。
IBM Cloud Container Registry から内部レジストリーのイメージ・ストリームにイメージをインポートする
デフォルトでは、Red Hat OpenShift on IBM Cloud クラスターは、icr.io
プロジェクトのリモートのプライベート IBM Cloud Container Registry default
ドメインからイメージをプルするようにセットアップされます。 イメージを イメージ・ストリームとしてタグ付けすることで、 IBM Cloud Container Registry から Red Hat OpenShift クラスタの内部レジストリにイメージをインポートできます。 このセットアップでは、内部レジストリーのローカル・キャッシュを使用してイメージからアプリをデプロイできるので、アプリ・デプロイメントのビルドが高速化されます。 また、他のプロジェクトのデプロイメントでもイメージ・ストリームを参照できるので、各プロジェクトに
IBM Cloud Container Registry のイメージ・プル・シークレットの資格情報を作成する必要がありません。
IBM Cloud Container Registry のイメージを更新しても、自動的にイメージが Red Hat OpenShift クラスターの内部レジストリーにプルされることはありません。 代わりに、 定期的なインポートを設定するか、以下の手順を繰り返して画像にタグを付けます。 デプロイメントで使用するイメージ・プル・ポリシーによっては、デプロイメントの再始動が必要になる場合もあります。
ビルド、イメージ・ストリーム、内部レジストリーがどのように連携して機能するか調べることができます。 Red Hat OpenShift 資料を読むか、 コンテナー・イメージの管理に関するこのブログを参照してください。
-
イメージをイメージ・ストリームにプルする
default
プロジェクトに切り替えます。default
プロジェクトには、icr.io
レジストリーにアクセスするための資格情報が既にセットアップされています。oc project default
-
IBM Cloud Container Registry にあるイメージをリストします。 Red Hat OpenShift クラスターの内部レジストリーにプルしたいイメージの リポジトリー と タグ をメモします。
ibmcloud cr images
-
そのイメージに、IBM Cloud Container Registry 名前空間から内部レジストリーにイメージ・ストリームとしてプルするためのタグを付けます。 詳しくは、 Red Hat OpenShift のドキュメントを参照するか、
oc tag --help
を実行してください。oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]
<region>.icr.io/<namespace>/<image>:<tag>
: 前に取得したリポジトリーおよびタグの情報を使用して、プルするイメージの IBM Cloud Container Registry 領域、名前空間、イメージ、およびタグ名を入力します。default/<image>:<tag>
: IBM Cloud Container Registry タグ付きイメージから作成する内部イメージ・ストリームの情報を入力します。 このイメージ・ストリームはdefault
プロジェクトに作成します。このプロジェクトは、プロジェクトを指定しない場合にイメージ・ストリームが作成されるプロジェクトでもあります。<image>:<tag>
の値は通常、前に取得した値と一致します。--reference-policy=local
: この値にはlocal
を設定します。これにより、IBM Cloud Container Registry のイメージのコピーが内部レジストリーのローカル・キャッシュにインポートされ、イメージ・ストリームとしてクラスターのプロジェクトで使用できるようになります。 この値を指定しない場合は、デプロイメントでイメージ・ストリームを使用するときに IBM Cloud Container Registry があらためて参照されるので、プロジェクトに資格情報が必要になります。--scheduled
: IBM Cloud Container Registry から内部レジストリへのイメージの定期的なインポートを設定するには、このオプションオプションを設定します。 デフォルトの頻度は 15 分です。 詳しくは、 Red Hat OpenShift 資料を参照してください。
-
イメージ・ストリームが作成されたことを確認します。
oc get imagestreams
-
イメージ・ストリームがイメージを IBM Cloud Container Registry から正常にプルしたことを確認します。 出力で、最新のタグ付け元 イメージが
* <region>.icr.io/<namespace>/<image>@<digest>
イメージと一致することを確認します。oc describe is/<imagestream>
出力例
NAME: <imagestream> Namespace: default Created: 2 days ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2020-03-31T09:41:36Z Image Repository: image-registry.openshift-image-registry.svc:5000/default/ant1 Image Lookup: local=false Unique Images: 1 Tags: 1 latest tagged from <region>.icr.io/<namespace>/<image>:<tag> * <region>.icr.io/<namespace>/<image>@<digest> 2 days ago
これで、開発者はアプリのデプロイメントでイメージ・ストリームを使用できるようになりました。 ローカルにプルされた内部レジストリー内のイメージから、イメージを正常にビルドできます。 イメージ・ストリームはクラスターのローカルにあるので、プロジェクト内に IBM Cloud Container Registry へのイメージ・プル・シークレットをセットアップする必要はありません。
IBM Cloud Container Registry にイメージをプッシュするように内部レジストリーのビルドをセットアップする
Red Hat OpenShift on IBM Cloud クラスターで ビルドを作成する際、 IBM Cloud Container
Registry にある 外部リポジトリにイメージをプッシュするように内部レジストリを設定できます。 デフォルトでは、クラスターの default
プロジェクトのイメージ・プル・シークレットには、IBM Cloud Container Registry からイメージをプルするための読み取り権限しかありません。 イメージをプッシュするには、書き込み権限を持つシークレットを追加する必要があります。
-
default
プロジェクトに切り替えます。oc project default
-
レジストリーでイメージのプルとプッシュを行えるように、IBM Cloud IAM の API キーをセットアップする手順
Reader
に従って、Writer
とicr.io
のサービス・アクセス役割を持つ API キーをセットアップします。プロジェクトにアクセスできるユーザーは誰でも、このシークレットを使用してイメージをプライベート・レジストリーにプッシュできることに注意してください。 クラスター内で誰がどのようなアクションを実行したかを監視できるように、ロギングとモニタリングのツールをセットアップすることをお勧めします。
-
イメージをプッシュする
icr.io
リージョンごとに、前の手順を繰り返します。 -
シークレットをビルドのサービス・アカウントに追加し、ビルド構成ファイルでそのシークレットを参照します。 詳しくは、 Red Hat OpenShift 資料を参照してください。
-
先ほど作成したシークレットを、クラスター内のすべてのビルドで使用する
builder
役割にリンクすることで、シークレットをビルドのサービス・アカウントに追加します。oc secrets link builder <secret_name>
-
ビルド構成をリストし、IBM Cloud Container Registry に対するプッシュとプルのアクセス権限を付与するものをメモします。
oc get bc
-
先ほど作成した、IBM Cloud Container Registry に対する
Writer
のサービス・アクセス権限を持つシークレットを使用するように、ビルド構成のイメージ・プッシュ・シークレットを設定します。oc set build-secret --push bc/<build_config_name> <secret_name>
-
最初のビルドのイメージをプルするレジストリーからプルできるように、ビルド構成のイメージ・プル・シークレットを設定します。 例えば、ソース・イメージが IBM Cloud Container Registry リポジトリーにある場合は、先ほど作成した、IBM Cloud Container Registry に対する
Reader
のサービス・アクセス権限を持つシークレットを使用できます。oc set build-secret --pull bc/<build_config_name> <secret_name>
-
-
IBM Cloud Container Registry にプッシュできるようにビルドのサービス・アカウントとビルド構成ファイルを更新したら、ビルドを再始動します。
oc start-build <build_name>
-
ビルド・ポッドの名前 (
<build>-2-build
など) を取得します。oc get pods
-
ビルドのログを確認し、イメージがプッシュされた場所をメモします。
oc logs <build_pod>
イメージが正常にプッシュされたログの例。
... Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash> Push successful
-
プライベート・レジストリー内のイメージを確認して、イメージが作成されていることを確認します。
ibmcloud cr image list
出力例
Repository Tag Digest Namespace Created Size Security status <region>.icr.io/<namespace>/<build_name> latest <digest> <namespace> 2 minutes ago 182 MB 33 Issues
これで、この Red Hat OpenShift のビルドは、IBM Cloud Container Registry との間でイメージのプルとプッシュを行えるようになりました。
IBM Cloud Container Registry の使用
デフォルトでは、Red Hat OpenShift on IBM Cloud クラスターは、icr.io
プロジェクトのリモートのプライベート IBM Cloud Container Registry default
ドメインからイメージをプルするようにセットアップされます。 IBM Cloud Container Registry に保管されているイメージを他のプロジェクトで使用するには、イメージ・ストリームで内部レジストリーにイメージをプルするか、プロジェクトごとに各グローバル・レジストリーおよびリージョン・レジストリーのイメージ・プル・シークレットを作成します。
イメージを内部レジストリーにインポートするには、IBM Cloud Container Registry から内部レジストリーのイメージ・ストリームにイメージをインポートするを参照してください。
外部の IBM Cloud Container Registry からイメージを直接プルするには、以下のトピックを参照してください。
- レジストリーからイメージをプルすることをクラスターに許可する方法について。
- プロジェクトの
all-icr-io
シークレットを、イメージをプルするプロジェクトにコピーするdefault
。 - 独自のイメージ・プル・シークレットの作成。
- デプロイメント構成またはプロジェクト・サービス・アカウントへのイメージ・プル・シークレットの追加。
プライベート・レジストリーからイメージをプルする権限をクラスターに与える方法について
レジストリーからイメージをプルするために、Red Hat OpenShift on IBM Cloud クラスターは特別なタイプの Kubernetes シークレットである imagePullSecret
を使用します。 このイメージ・プル・シークレットには、コンテナー・レジストリーにアクセスするための資格情報が保管されます。
コンテナー・レジストリーとして以下を使用できます。
- 自分が所有している IBM Cloud Container Registry のプライベート名前空間。
- 別の IBM Cloud Container Registry アカウントが所有している IBM Cloud のプライベート名前空間。
- その他のプライベート・レジストリー (Docker など)。
ただし、デフォルトでは、クラスターは、IBM Cloud Container Registry 内のアカウントの名前空間からのみイメージをプルし、それらのイメージからクラスター内の default
Red Hat OpenShift プロジェクトにコンテナーをデプロイするようにセットアップされます。 クラスターの他のプロジェクトでイメージをプルしたり、他のコンテナー・レジストリーからイメージをプルしたりする必要がある場合は、イメージ・プル・シークレットを独自でセットアップする必要があります。
デフォルトのイメージ・プル・シークレットのセットアップ
通常、Red Hat OpenShift on IBM Cloud クラスターは、default
Red Hat OpenShift プロジェクトからのみ、すべての IBM Cloud Container Registry icr.io
ドメインからイメージをプルするようにセットアップされます。 他の Red Hat OpenShift プロジェクトやアカウントで画像をプルする方法、プルアクセスの制限、クラスタにデフォルトの画像プルシークレットがない理由などについては、以下の
FAQ をご覧ください。
default
Red Hat OpenShift プロジェクトから画像をプルするために、私のクラスタはどのように設定されていますか?- クラスターを作成すると、そのクラスターの IBM Cloud IAM サービス ID に、IBM Cloud Container Registry に対するリーダーの IAM サービス・アクセス役割ポリシーが与えられます。 このサービス ID の資格情報が擬人化され、有効期限のない API キーの中に含められ、API キーがクラスターのイメージ・プル・シークレットに保管されます。 イメージ・プル・シークレットは、
default
Kubernetes 名前空間、およびこの Red Hat OpenShift プロジェクトのdefault
サービス・アカウント内のシークレットのリストに追加されます。 イメージ・プル・シークレットを使用することで、デプロイメントで グローバルおよび地域 IBM Cloud Container Registry からイメージをプル (読み取り専用アクセス) して、default
Red Hat OpenShift プロジェクトにコンテナーをデプロイできます。
- グローバル・レジストリーには、IBM 提供のパブリック・イメージが安全に保管されています。 各リージョン・レジストリーに保管されたイメージを別々に参照することなく、すべてのデプロイメントでこれらのパブリック・イメージを参照できます。
- リージョンレジストリーには、独自のプライベート Docker イメージが安全に保管されます。
default
Red Hat OpenShift プロジェクトに画像のプルシークレットがない場合は?- イメージ・プル・シークレットを確認するには、クラスターにログインし、
oc get secrets -n default | grep "icr-io"
を実行します。icr
シークレットがリストされない場合は、クラスターを作成したユーザーが、IAM で IBM Cloud Container Registry に対する必要な許可を持っていなかった可能性があります。 API キーのイメージ・プル・シークレットを使用するように既存のクラスターを更新するを参照してください。 - 特定の地域レジストリへのプルアクセスを制限することはできますか?
- はい。サービス ID の既存の IAM ポリシーを編集して、リーダーのサービス・アクセス役割をそのリージョン・レジストリーまたはレジストリー・リソース (名前空間など) に制限できます。 レジストリーの IAM ポリシーをカスタマイズする前に IBM Cloud で IBM Cloud Container Registry IAM ポリシーを有効にしておく必要があります。
レジストリー資格情報の安全性をさらに高めたいですか? クラスター内の Kubernetes シークレット (レジストリー資格情報を保管するイメージ・プル・シークレットなど) を暗号化するために、クラスターで鍵管理サービス・プロバイダーを有効にするようにクラスター管理者に依頼してください。
default
以外の Red Hat OpenShift プロジェクトの画像を引っ張ってくることはできますか?- デフォルトではできません。 デフォルトのクラスター・セットアップを使用する場合は、IBM Cloud Container Registry の名前空間に保管されている任意のイメージから、クラスターの
default
Red Hat OpenShift プロジェクトにコンテナーをデプロイできます。 これらのイメージを他の Red Hat OpenShift プロジェクトや他の IBM Cloud アカウントで使用するためには、イメージ・プル・シークレットをコピーするか作成します。 - 別の IBM Cloud アカウントから画像を取り込むことはできますか?
- はい。使用する IBM Cloud アカウントで API キーを作成してください。 次に、その IBM Cloud アカウントからイメージをプルする各クラスターのプロジェクトごとに、API キーを入れたシークレットを作成します。 詳しくは、許可されたサービス ID の API キーを使用するこちらの例の手順に従ってください。
Docker などの非 IBM Cloud レジストリーを使用する場合は、他のプライベート・レジストリーに格納されたイメージへのアクセスを参照してください。
- APIキーはサービスIDのものである必要がありますか? 自分のアカウントのサービスIDが上限に達した場合はどうなりますか?
- デフォルトのクラスター・セットアップでは、IBM Cloud IAM API キー資格情報をイメージ・プル・シークレットに保管するためのサービス ID が作成されます。 ただし、個別ユーザー用の API キーを作成して、それらの資格情報をイメージ・プル・シークレットに保管することもできます。 サービス ID の IAM 制限 に到達した場合、クラスターはサービス
ID とイメージ・プル・シークレットなしで作成され、デフォルトでは
icr.io
レジストリー・ドメインからイメージをプルできません。 独自のイメージ・プル・シークレットを作成する必要がありますが、そのためには、IBM Cloud IAM サービス ID ではなく、部門 ID などの個別ユーザー用の API キーを使用します。 - 地域レジストリ・ドメインと全レジストリ・ドメインの画像プルシークレットが見えます。 どれを使えばいい?
- 以前は、Red Hat OpenShift on IBM Cloud によって、リージョンのパブリック
icr.io
レジストリー・ドメインごとに別々のイメージ・プル・シークレットが作成されていました。 現在は、すべてのリージョンのパブリックとプライベートのすべてのicr.io
レジストリー・ドメインが、クラスターのall-icr-io
Kubernetes プロジェクトに自動的に作成される単一のdefault
イメージ・プル・シークレットに保管されます。
クラスターの他の Kubernetes 名前空間のワークロードでプライベート・レジストリーからコンテナー・イメージをプルする場合に、all-icr-io
イメージ・プル・シークレットをその Kubernetes プロジェクトにコピーするだけで済むようになりました。 その後、サービス・アカウントまたはデプロイメントに all-icr-io
シークレットを指定します。 イメージのリージョン別レジストリーと一致するイメージ・プル・シークレットをコピーする必要がなくなりました。
また、認証を必要としないパブリック・レジストリーのイメージ・プル・シークレットは必要ないことに注意してください。
- 別のプロジェクト( Red Hat OpenShift )で画像のプルシークレットをコピーまたは作成したら、それで終わりですか?
- 十分ではありません。 コンテナーが、作成したシークレットを使用してイメージをプルすることを許可されている必要があります。 イメージ・プル・シークレットを名前空間のサービス・アカウントに追加することも、各デプロイメントでシークレットを参照することもできます。 手順については、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
icr.io
レジストリーへのプライベート・ネットワーク接続
サービス・エンドポイントを使用するように IBM Cloud アカウントをセットアップすると、IBM Cloud Container Registry との間で行うイメージのプッシュとプルにプライベート・ネットワーク接続を使用できます。
icr.io
レジストリへのプライベート接続を使用するようにクラスタを設定するには、何をする必要がありますか?
- IBM Cloud Container Registry プライベート・クラウド・サービスのエンドポイントを使用できるように、 IBM Cloud インフラストラクチャ・アカウントの 仮想ルーター機能(VRF )を有効にします。 VRF を有効にするには、VRF の有効化を参照してください。
VRF が既に有効になっているかどうかを確認するには、
ibmcloud account show
コマンドを使用します。 - IBM Cloud アカウントでサービス・エンドポイントを使用できるようにします。
IBM Cloud Container Registry は自動的にプライベート・クラウド・サービスのエンドポイントを使用する。 Red Hat OpenShift on IBM Cloud クラスターのプライベート・クラウド・サービス・エンドポイントを有効にする必要はありません。
API キーのイメージ・プル・シークレットを使用するように既存のクラスターを更新する
新しい Red Hat OpenShift on IBM Cloud クラスターでは、IBM Cloud Container Registry へのアクセス権限を与えるために、イメージ・プル・シークレットに API キーを保管します。 それらのイメージ・プル・シークレットを使用すれば、icr.io
レジストリー・ドメインに保管されているイメージからコンテナーをデプロイできます。
クラスターの作成時にイメージ・プル・シークレットを使用しなかった場合は、シークレットをクラスターに追加できます。
開始前に
-
IBM Cloud に対する Red Hat OpenShift on IBM Cloud IAM のオペレーターまたは管理者のプラットフォーム・アクセス役割の許可があることを確認します。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。
ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
-
すべてのリージョンとリソース・グループにおける、IBM Cloud に対する IBM Cloud Container Registry IAM 管理者プラットフォーム・アクセス役割。 ポリシーのスコープを特定のリージョンまたはリソース・グループに設定することはできません。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。
シークレットが正常に作成されたことを確認する
ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
-
アカウントでサービス ID の作成を制限している場合は、**「ID およびアクセス管理」に対する「サービス ID 作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は
iam-identity
)。 -
アカウントで API キーの作成を制限している場合は、**「ID およびアクセス管理」に対する「ユーザー API キー作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は
iam-identity
)。
イメージ・プル・シークレットの更新
Kubernetes の default
名前空間にあるクラスターのイメージ・プル・シークレットを更新するには、以下のようにします。
-
クラスター ID を取得します。
ibmcloud oc cluster ls
-
クラスターのサービス ID を作成し、そのサービス ID に IBM Cloud Container Registry に対するリーダーの IAM サービス・アクセス役割を割り当てるために、以下のコマンドを実行します。 また、このコマンドは、サービス ID の資格情報を擬人化する API キーを作成し、クラスター内の Kubernetes イメージ・プル・シークレットに保管します。 イメージ・プル・シークレットは、
default
Red Hat OpenShift プロジェクト内にあります。ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
このコマンドを実行すると、IAM 資格情報とイメージ・プル・シークレットの作成が開始されます。これが完了するまで、しばらく時間がかかる場合があります。 イメージ・プル・シークレットが作成されるまでは、IBM Cloud Container Registry
icr.io
ドメインからイメージをプルするコンテナーをデプロイできません。 -
クラスター内にイメージ・プル・シークレットが作成されていることを確認します。
oc get secrets | grep icr-io
出力例
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
icr.io
ドメイン名からイメージをプルするように、 コンテナのデプロイメントを 更新する。 -
オプション: ファイアウォールがある場合は、使用するドメインでレジストリー・サブネットへのアウトバウンド・ネットワーク・トラフィックを許可してください。
-
以下のいずれかのオプションを使用して、セットアップを完了します。
default
以外の Red Hat OpenShift プロジェクトまたは他の IBM Cloud アカウントからイメージをプルするには、別のイメージ・プル・シークレットをコピーまたは作成します。- イメージ・プル・シークレットのアクセスを特定のレジストリー・リソース (名前空間やリージョンなど) に制限する場合は、以下のようにします。
画像プルシークレットを使用して、外部プライベートレジストリの画像にアクセスする
default
以外の Red Hat OpenShift プロジェクトにコンテナーをデプロイしたり、他の IBM Cloud アカウントに保管されているイメージを使用したり、外部プライベート・レジストリーに保管されているイメージを使用したりするには、クラスター内に独自のイメージ・プル・シークレットをセットアップします。 さらに、独自のイメージ・プル・シークレットを作成して、特定のレジストリー・イメージ名前空間または操作 (push
や pull
など) にアクセス権を制限する IAM アクセス・ポリシーを適用することも可能です。
イメージ・プル・シークレットを作成したら、コンテナーがそのシークレットを使用してレジストリーからイメージをプルすることを許可する必要があります。 イメージ・プル・シークレットをプロジェクトのサービス・アカウントに追加することも、各デプロイメントでシークレットを参照することもできます。 手順については、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
イメージ・プル・シークレットは、それらが作成された対象の Red Hat OpenShift プロジェクトに対してのみ有効です。 コンテナーをデプロイする名前空間ごとに、以下の手順を繰り返してください。
始める前に
- IBM Cloud Container Registry に名前空間をセットアップして、その名前空間にイメージをプッシュします。
- クラスターを作成します。
- Red Hat OpenShift クラスターにアクセスします。
独自のイメージ・プル・シークレットを使用する方法としては、以下の選択肢があります。
- デフォルトの Red Hat OpenShift プロジェクトからクラスター内の他のプロジェクトへの イメージ・プル・シークレットをコピーします。
- 新しい IAM API キー資格情報を作成して、それらをイメージ・プル・シークレット内に保管することで、他の IBM Cloud アカウント内のイメージにアクセスしたり、特定のレジストリー・ドメインやレジストリー名前空間へのアクセスを制限する IAM ポリシーを適用したりする。
- 外部プライベート・レジストリーのイメージにアクセスするためのイメージ・プル・シークレットを作成する。
デプロイメントで使用するプロジェクトにイメージ・プル・シークレットを既に作成した場合は、作成済みの imagePullSecret
を使用したコンテナーのデプロイを参照してください。
既存のイメージ・プル・シークレットのコピー
イメージ・プル・シークレットをクラスター内の他のプロジェクトにコピーできます (default
Red Hat OpenShift プロジェクト用に自動的に作成されたイメージ・プル・シークレットなど)。 例えば、特定のプロジェクトへのアクセスを制限するために、または他の IBM Cloud アカウントからイメージをプルするために、このプロジェクトで別の IBM Cloud IAM API キー資格情報を使用する必要がある場合は、代わりに、イメージ・プル・シークレットを作成します。
-
クラスター内に存在する Red Hat OpenShift プロジェクトをリストするか、使用するプロジェクトを作成します。
oc get projects
出力例
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active
プロジェクトを作成するには、以下のようにします。
oc new-project <project_name>
-
IBM Cloud Container Registry の
default
Red Hat OpenShift プロジェクト内の既存のイメージ・プル・シークレットをリストします。oc get secrets -n default | grep icr-io
出力例
all-icr-io kubernetes.io/dockerconfigjson 1 16d
-
all-icr-io
プロジェクトから任意のプロジェクトにdefault
イメージ・プル・シークレットをコピーします。 新しいイメージ・プル・シークレットの名前は<project_name>-icr-<region>-io
です。oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -
-
シークレットが正常に作成されたことを確認します。
oc get secrets -n <project_name> | grep icr-io
-
コンテナーをデプロイするには、各デプロイメントにイメージ・プル・シークレットを追加します。または、プロジェクトのサービス・アカウントに追加して、そのプロジェクトのすべてのデプロイメントでイメージをレジストリーからプルできるようにします。
異なる IAM API キー資格情報を使用したイメージ・プル・シークレットの作成
IBM Cloud の IAM アクセス・ポリシーをユーザーまたはサービス ID に割り当てて、特定のレジストリー・イメージ名前空間または操作 (push
や pull
など) にアクセス権を制限できます。 次に、API キーを作成して、これらのレジストリー資格情報をクラスターのイメージ・プル・シークレットに保管します。
例えば、他の IBM Cloud アカウント内のイメージにアクセスするには、そのアカウント内のユーザーまたはサービス ID の IBM Cloud Container Registry 資格情報を保管する API キーを作成します。 次に、クラスターのアカウント内で、それぞれのクラスターとクラスター・プロジェクトのイメージ・プル・シークレットにその API キー資格情報を保存します。
以下のステップでは、IBM Cloud の IAM サービス ID の資格情報を保管する API キーを作成します。 サービス ID を使用する代わりに、IBM Cloud に対する IBM Cloud Container Registry IAM サービス・アクセス・ポリシーを割り当てたユーザー ID の API キーを作成することもできます。 ただし、そのユーザー ID は部門 ID にしてください。あるいは、その特定のユーザーがいなくなってもクラスターがレジストリーにアクセスできるように計画しておいてください。
-
クラスター内に存在する Red Hat OpenShift プロジェクトをリストするか、レジストリー・イメージからコンテナーをデプロイする場所として使用するプロジェクトを作成します。
oc get projects
出力例
default Active ibm-cert-store Active ibm-system Active kube-public Active kube-system Active
プロジェクトを作成するには、以下のようにします。
oc new-project <project_name>
-
イメージ・プル・シークレットの IAM ポリシーと API キー資格情報のために使用するクラスターの IBM Cloud IAM サービス ID を作成します。 サービス ID には、後からサービス ID を特定できるように、必ず説明を付けておいてください。例えば、クラスター名とプロジェクト名の両方を記載してください。
ibmcloud iam service-id-create <cluster_name>-<project>-id --description "Service ID for IBM Cloud Container Registry in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
-
IBM Cloud へのアクセス権を与えるカスタム IBM Cloud Container Registry IAM ポリシーを、クラスター・サービス ID に対して作成します。
ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
cluster_service_ID
- 必須。 Kubernetes クラスター用に以前に作成した
<cluster_name>-<kube_namespace>-id
サービス ID に置き換えます。 --service-name container-registry
- 必須。
container-registry
を入力して、IAM ポリシーの対象を IBM Cloud Container Registry にします。 --roles <service_access_role>
- 必須。 サービス ID のアクセス権限の範囲にする IBM Cloud Container Registry に対するサービス・アクセス役割を入力します。 指定できる値は、
Reader
、Writer
、Manager
です。 --region <IAM_region>
- オプション。 アクセス・ポリシーの有効範囲を特定の IAM リージョンに制限する場合は、コンマ区切りリスト形式でリージョンを入力します。 指定可能な値は
global
およびローカル・レジストリーのリージョンです。 --resource-type namespace --resource <registry_namespace>
- オプション。 特定の IBM Cloud Container Registry 名前空間 内のイメージのみにアクセスを制限する場合は、リソース・タイプとして
namespace
を入力し、<registry_namespace>
を指定します。 レジストリーの名前空間をリストするには、ibmcloud cr namespaces
を実行します。
-
サービス ID の API キーを作成します。 APIキーにはサービスIDと同様の名前を付け、以前に作成したサービスIDを含める、
<cluster_name>-<kube_namespace>-id
. 必ず、後でキーを思い出せるように説明を付けてください。ibmcloud iam service-api-key-create <cluster_name>-<project>-key <cluster_name>-<project>-id --description "API key for service ID <service_id> in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
-
前のコマンドの出力から API キーの値を取得します。
Please preserve the API key! It can't be retrieved after it's created. Name <cluster_name>-<kube_namespace>-key Description key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test Bound To crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh Created At 2019-02-01T19:06+0000 API Key i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1 Locked false UUID ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4
-
API キーの資格情報を保管するイメージ・プル・シークレットをクラスターのプロジェクトに作成します。 各クラスターの各プロジェクトで、イメージをプルする
icr.io
ドメインごとに、この手順を繰り返します。oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
--namespace <project>
- 必須。 サービス ID 名に使用したクラスターの Red Hat OpenShift プロジェクトを指定します。
<secret_name>
- 必須。 イメージ・プル・シークレットの名前を入力します。
--docker-server <registry_URL>
- 必須。 レジストリーの名前空間がセットアップされているイメージ・レジストリーの URL を設定します。 使用可能なドメインについては、ローカルのリージョンを参照してください。
--docker-username iamapikey
- 必須。 プライベート・レジストリーにログインするためのユーザー名を入力します。 IBM Cloud Container Registry を使用する場合は、
iamapikey
を入力します。 --docker-password <token_value>
- 必須。 前に取得した
API Key
の値を入力します。 --docker-email <docker-email>
- 必須。 Docker E メール・アドレスがある場合は、その値を入力します。 ない場合は、
a@b.c
のような架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。
-
シークレットが正常に作成されたことを確認します。
<project>
を、イメージ・プル・シークレットを作成したproject
に置き換えます。oc get secrets --namespace <project>
-
コンテナーをデプロイする際に、プロジェクト内の任意のポッドでそのイメージ・プル・シークレットを使用できるよう、イメージ・プル・シークレットを Kubernetes サービス・アカウントに追加します。
他のプライベート・レジストリー内に保管されているイメージへのアクセス
プライベート・レジストリーが既にある場合は、そのレジストリーの資格情報を Kubernetes イメージ・プル・シークレットに保管し、構成ファイルからそのシークレットを参照する必要があります。
始める前に
イメージ・プル・シークレットを作成するには、以下のようにします。
-
プライベート・レジストリーの資格情報を保管する Kubernetes シークレットを作成します。
oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
--namespace <project>
- 必須。 シークレットを使用してコンテナーをデプロイする、クラスターの Red Hat OpenShift プロジェクト。 クラスター内の使用可能なプロジェクトをリストするには、
oc get projects
を実行します。 <secret_name>
- 必須。 イメージ・プル・シークレットに使用する名前。
--docker-server <registry_URL>
- 必須。 プライベート・イメージが保管されているレジストリーの URL。
--docker-username <docker_username>
- 必須。 プライベート・レジストリーにログインするためのユーザー名。
--docker-password <token_value>
- 必須。 プライベート・レジストリーにログインするためのパスワード (トークン値など)。
--docker-email <docker-email>
- 必須。 Docker E メール・アドレスがある場合は、その値を入力します。 ない場合は、
a@b.c
などの架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。
-
シークレットが正常に作成されたことを確認します。
<project>
を、イメージ・プル・シークレットを作成したプロジェクトの名前に置き換えます。oc get secrets --namespace <project>
イメージ・プル・シークレットを使用したコンテナーのデプロイ
ポッド・デプロイメントでイメージ・プル・シークレットを定義するか、Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管して、プロジェクトで Kubernetes サービス・アカウントを指定しないすべてのデプロイメントで使用できるようにすることができます。
クラスターでイメージ・プル・シークレットを使用する方法を計画するときには、以下の選択肢があります。
- ポッド・デプロイメントでイメージ・プル・シークレットを参照する: プロジェクト内のすべてのポッドに対してデフォルトでレジストリーへのアクセス権限を付与しない場合は、このオプションを使用します。 開発者は、レジストリーにアクセスする必要がある各ポッドのデプロイメントに、イメージ・プル・シークレットを含めることができます。
- Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する: 選択した Red Hat OpenShift プロジェクト内のすべてのデプロイメントについて、レジストリー内のイメージへのアクセス権限を付与する場合は、このオプションを使用します。 Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管するには、以下の手順を使用します。
選択したプロジェクトの Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する
すべての Red Hat OpenShift プロジェクトに、default
という名前の Kubernetes サービス・アカウントがあります。 プロジェクト内でイメージ・プル・シークレットをこのサービス・アカウントに追加すると、レジストリーからイメージをプルするためのアクセス権限をポッドに付与できます。 サービス・アカウントを指定しないデプロイメントでは、この Red Hat OpenShift プロジェクトの default
サービス・アカウントが自動的に使用されます。
-
default サービス・アカウントにイメージ・プル・シークレットが既に存在しているかどうかを確認します。
oc describe serviceaccount default -n <project_name>
<none>
が イメージ・プル・シークレット エントリーに表示される場合、イメージ・プル・シークレットは存在しません。 -
イメージ・プル・シークレットを default サービス・アカウントに追加します。
-
イメージ・プル・シークレットが定義されていない場合に、イメージ・プル・シークレットを追加するコマンドの例。
oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
-
イメージ・プル・シークレットが既に定義されている場合に、イメージ・プル・シークレットを追加するコマンドの例。
oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
-
-
イメージ・プル・シークレットが default サービス・アカウントに追加されたことを確認します。
oc describe serviceaccount default -n <project_name>
出力例
Name: default Namespace: <namespace_name> Labels: <none> Annotations: <none> Image pull secrets: <image_pull_secret_name> Mountable secrets: default-token-sh2dx Tokens: default-token-sh2dx Events: <none>
イメージ・プル・シークレット に
<secret> (not found)
と表示されている場合は、oc get secrets -n project
を実行して、サービス・アカウントと同じプロジェクトにイメージ・プル・シークレットが存在することを確認します。 -
レジストリー内の
mypod.yaml
イメージからコンテナーをデプロイするために、 という名前のポッド構成ファイルを作成します。apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod-container image: <region>.icr.io/<project>/<image>:<tag>
-
mypod.yaml
構成ファイルを適用して、クラスターにポッドを作成します。oc apply -f mypod.yaml
使用権付きソフトウェアをプルするようにクラスターをセットアップする
使用権付きソフトウェアをプルするように Red Hat OpenShift on IBM Cloud クラスターをセットアップできます。使用権付きソフトウェアとは、IBM から使用のライセンス交付を受けた、Helm チャート内でパッケージ化されている保護されたコンテナー・イメージの集合です。 使用権付きソフトウェアは、IBM Cloud Container Registry の cp.icr.io
という特別なドメインに保管されます。 このドメインにアクセスするには、クラスターの使用権キーを使用してイメージ・プル・シークレットを作成し、この使用権付きソフトウェアをデプロイする各プロジェクトの
Kubernetes サービス・アカウントにこのイメージ・プル・シークレットを追加する必要があります。
始める前に、Red Hat OpenShift クラスターにアクセスします。
-
使用権付きソフトウェア・ライブラリーのための使用権キーを取得します。
- MyIBM.comにログインし、 コンテナ・ソフトウェア・ライブラリのセクションまでスクロールする。 **「ライブラリーの表示」**をクリックします。
- **「Access your container software」>「Entitlement keys」ページで、「キーのコピー」**をクリックします。 このキーは、コンテナー・ソフトウェア・ライブラリー内のすべての使用権付きソフトウェアへのアクセスを許可します。
-
使用権付きコンテナーをデプロイするプロジェクトでイメージ・プル・シークレットを作成して、使用権付きレジストリー
cp.icr.io
にアクセスできるようにします。 先ほど取得した使用権キーを--docker-password
の値として使用します。 詳しくは、他のプライベート・レジストリー内に保管されているイメージへのアクセスを参照してください。oc create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <project>
-
名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、そのプロジェクトのすべてのコンテナーが使用権キーを使用して使用権付きイメージをプルできるようにします。 詳しくは、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。
oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
-
使用権付きレジストリー内のイメージからコンテナーをビルドするポッドをプロジェクト内で作成します。
oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
-
ポッドが**「実行中」**状況になっていることを検証することによって、使用権付きイメージからコンテナーが正常にビルドされたことを確認します。
oc get pod <pod_name> -n <project>
次に何をしますか? entitled Helm チャート・リポジトリーをセットアップできます。使用権付きソフトウェアを取り込んでいる Helm チャートはそこに保管されています。 クラスター内に Helm が既にインストールされている場合は、helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled
を実行します。
グローバル・プル・シークレットへのプライベート・レジストリーの追加
OpenShift Container Platform では、クラスター内のすべてのワーカー・ノードがプライベート・レジストリーからのイメージのプルに使用できるグローバル・イメージ・プル・シークレットをセットアップできます。
デフォルトの Red Hat OpenShift on IBM Cloud コンポーネントをデプロイできるように、Red Hat OpenShift クラスターにはデフォルトで、以下のレジストリー用のグローバル・イメージ・プル・シークレットがあります。
cloud.openshift.com
quay.io
registry.connect.redhat.com
registry.redhat.io
グローバル・プル・シークレットを、デフォルトの Red Hat レジストリーに対する資格情報が含まれていないプル・シークレットに置き換えないでください。 これを行うと、クラスターにインストールされているデフォルトの Red Hat OpenShift コンポーネント (OperatorHub など) は、これらのレジストリーからイメージをプルできないために失敗する可能性があります。
始める前に
jq
JSONプロセッサー・コマンドライン・パッケージをダウンロードする。jq
を使用して、デフォルトのグローバル・プル・シークレットの JSON 値を、追加するプライベート・レジストリーのプル・シークレットと結合します。- Red Hat OpenShift クラスターにアクセスします。
プライベート・レジストリーを追加するには、pull-secret
プロジェクトのグローバルなopenshift-config
を編集します。
-
プライベート・レジストリーにアクセスするための資格情報が入ったシークレット値を作成し、デコードしたそのシークレット値を JSON ファイル形式で保管します。 シークレット値を作成すると、資格情報が自動的に base64 でエンコードされます。
--dry-run
オプションを使用すると、シークレット値だけが作成され、クラスター内にはシークレット・オブジェクトが作成されません。 その後、後でグローバル・プル・シークレットで使用するために、デコードしたシークレット値を JSON ファイル形式で保管しています。oc create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email> --dry-run=true --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > myregistryconfigjson
--namespace <project>
- 必須。 シークレットを使用してコンテナーをデプロイする、クラスターの Red Hat OpenShift プロジェクト。 クラスター内の使用可能なプロジェクトをリストするには、
oc get ns
を実行します。 <secret_name>
- 必須。 イメージ・プル・シークレットに使用する名前。
--docker-server <registry_URL>
- 必須。 プライベート・イメージが保管されているレジストリーの URL。
--docker-username <docker_username>
- 必須。 プライベート・レジストリーにログインするためのユーザー名。
--docker-password <token_value>
- 必須。 プライベート・レジストリーにログインするためのパスワード (トークン値など)。
--docker-email <docker-email>
- 必須。 Docker E メール・アドレスがある場合は、その値を入力します。 ない場合は、
a@b.c
などの架空の E メール・アドレスを入力します。 この E メールは、Kubernetes シークレットの作成には必要ですが、作成後は使用されません。 --dry-run=true
- シークレット値のみを作成し、シークレット・オブジェクトをクラスタ内に作成および保存しない場合は、このオプションを指定します。
--output="jsonpath={.data.\.dockerconfigjson}"
- Kubernetes シークレットの data セクションから
.dockerconfigjson
値のみを取得します。 | base64 --decode > myregistryconfigjson
- デコードしたシークレット・データをローカルの
myregistryconfigjson
ファイルにダウンロードします。
-
デフォルトのグローバル・プル・シークレットのシークレット値をデコードしたものを取得し、その値を
dockerconfigjson
ファイルに保管します。oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
-
ダウンロードしたプライベート・レジストリーのプル・シークレットの
myregistryconfigjson
ファイルを、デフォルトのグローバル・プル・シークレットのdockerconfigjson
ファイルと結合します。jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
-
結合した
dockerconfigjson-merged
ファイルを使用して、グローバル・プル・シークレットを更新します。oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
-
グローバル・プル・シークレットが更新されたことを確認します。 プライベート・レジストリーおよび Red Hat のデフォルトの各レジストリーが、以下のコマンドの出力にあることを確認します。
oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
出力例
{ "auths": { "cloud.openshift.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "quay.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.connect.redhat.com": { "auth": "<encoded_string>", "email": "email@example.com" }, "registry.redhat.io": { "auth": "<encoded_string>", "email": "email@example.com" }, "<private_registry>": { "username": "iamapikey", "password": "<encoded_string>", "email": "email@example.com", "auth": "<encoded_string>" } } }
-
グローバル構成の変更を反映するには、クラスター内のすべてのワーカー・ノードを再ロードします。
-
クラスターのワーカー・ノードの ID をメモします。
ibmcloud oc worker ls -c <cluster_name_or_ID>
-
クラシック・クラスターの場合 各ワーカー・ノードを再ロードします。 複数の
-w
オプションを含めることで、複数のワーカーノードをリロードすることができますが、アプリが停止しないように、十分な数のワーカーノードを同時に稼働させておくようにしてください。ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
-
VPC クラスターの場合 各ワーカー・ノードを置き換えます。 始める前に、ご使用のクラスターにその他のワーカー・ノードが十分にあることを確認して、ポッドのスケジュールを変更し、ポッドの実行を続行できるようにしてください。
ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
-
-
ワーカー・ノードが正常な状態に戻ったら、ワーカー・ノードでグローバル・プル・シークレットが更新されていることを確認します。
-
デバッグ・ポッドを開始して、ワーカー・ノードにログインします。
<node_name>
には、前に取得した プライベート IP を使用します。oc debug node/<node_name>
-
ワーカー・ノードのファイルを表示するために、ルート・ディレクトリーをホストに変更します。
chroot /host
-
Docker 構成ファイルに、設定したグローバル・プル・シークレットに一致するレジストリー資格情報があることを確認します。
vi /.docker/config.json
-
グローバルプルシークレットの更新
以下の手順を実行して、Red Hat OpenShift on IBM Cloudクラスタのグローバル・プル・シークレットを更新します。
- 使用したいレジストリの認証情報を持つシークレットを作成する。
oc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=USERNAME \ --docker-password=PASSWORD \ --namespace kube-system
create secret
コマンドの例。oc create secret docker-registry docker-auth-secret \ --docker-server=REGISTRY \ --docker-username=cp \ --docker-password=ENTITLEMENT-KEY \ --namespace kube-system
- すべてのワーカーノードにシークレットを適用するDaemonSetを作成する。
cat << EOF | oc create -f - apiVersion: apps/v1 kind: DaemonSet metadata: name: update-docker-config namespace: kube-system labels: app: update-docker-config spec: selector: matchLabels: name: update-docker-config template: metadata: labels: name: update-docker-config spec: initContainers: - command: ["/bin/sh", "-c"] args: - > echo "Checking if RHEL or RHCOS host"; [[ -s /docker-config/.docker/config.json ]] && CONFIG_PATH=/docker-config/.docker || CONFIG_PATH=/docker-config/root/.docker; echo "Backing up or restoring config.json"; [[ -s \$CONFIG_PATH/config.json ]] && cp \$CONFIG_PATH/config.json \$CONFIG_PATH/config.json.bak || cp \$CONFIG_PATH/config.json.bak \$CONFIG_PATH/config.json; echo "Merging secret with config.json"; /host/usr/bin/jq -s '.[0] * .[1]' \$CONFIG_PATH/config.json /auth/.dockerconfigjson > \$CONFIG_PATH/config.tmp; mv \$CONFIG_PATH/config.tmp \$CONFIG_PATH/config.json; echo "Sending signal to reload crio config"; pidof crio; kill -1 \$(pidof crio) image: icr.io/ibm/alpine:latest imagePullPolicy: IfNotPresent name: updater resources: {} securityContext: privileged: true volumeMounts: - name: docker-auth-secret mountPath: /auth - name: docker mountPath: /docker-config - name: bin mountPath: /host/usr/bin - name: lib64 mountPath: /lib64 containers: - resources: requests: cpu: 0.01 image: icr.io/ibm/alpine:latest name: sleepforever command: ["/bin/sh", "-c"] args: - > while true; do sleep 100000; done hostPID: true volumes: - name: docker-auth-secret secret: secretName: docker-auth-secret - name: docker hostPath: path: / - name: bin hostPath: path: /usr/bin - name: lib64 hostPath: path: /lib64 hostPathType: Directory EOF
- ポッドが動作していることを確認する。
oc get daemonset -n kube-system update-docker-config
IBM Cloud Kubernetes Service containerd カスタム・レジストリー構成の更新
Kubernetes バージョン 1.22 以降では、ワーカー・ノード上で containerd 構成ファイルを使用して、コンテナー・レジストリーからのプルを構成できます。 daemonset を使用して、クラスター内のすべてのノードの構成を更新することができます。これにより、ワーカー・ノードの再ロード時や新規ワーカーの追加時に構成がワイプされなくなります。
containerd カスタム・レジストリー構成を更新する daemonset の例
YAML ファイルの例を使用して、すべてのワーカー・ノードで実行されるデーモン・セットを定義し、containerd レジストリー・ホスト構成を設定または更新し、対応する containerd レジストリー・パスにマウントします。
この例では、dockerhub の以下のレジストリー・ホスト構成を設定します。 このレジストリー・ホスト構成は既に提供されており、ワーカー・プロビジョニング・フェーズ中に自動的に構成されます。 init
コンテナは、デプロイ後と、ワーカーノードのリロードまたは再起動後に、すべてのワーカーノードで hosts.toml
を初期化する。
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
YAML ファイルの例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
matchLabels:
name: containerd-dockerhub-registry-config
template:
metadata:
labels:
name: containerd-dockerhub-registry-config
spec:
initContainers:
- image: alpine:3.13.6
name: containerd-dockerhub-registry-config
command:
- /bin/sh
- -c
- |
#!/bin/sh
set -uo pipefail
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
EOF
volumeMounts:
- mountPath: /etc/containerd/certs.d/docker.io/
name: dockerhub-registry-config
containers:
- name: pause
image: "us.icr.io/armada-master/pause:3.5"
imagePullPolicy: IfNotPresent
volumes:
- name: dockerhub-registry-config
hostPath:
path: /etc/containerd/certs.d/docker.io/
containerd レジストリー・ホスト構成の更新について詳しくは、 containerd の資料を参照してください。