IBM Cloud Docs
イメージ・レジストリーのセットアップ

イメージ・レジストリーのセットアップ

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 インフラストラクチャー上のバージョン 4 クラスター: プライベート・レジストリー・サービス・エンドポイントを使用することで、プライベート・クラウド・サービス・エンドポイントしか使用しないクラスターでもレジストリーにアクセスできる。
  • ストレージおよびイメージ・プル・トラフィックの割り当て量を設定できるのでイメージの保管、使用量、および請求処理の制御性が向上する。
  • 使用権を持つレジストリーから、ライセンス交付を受けた IBM コンテンツをプルできる。

始めに、以下のトピックを参照してください。

パブリック・レジストリー

Docker Hub などのパブリック・レジストリーを使用すると、チーム、会社、クラスター、またはクラウド・プロバイダー間でイメージを共有できます。 パブリック・レジストリーには、プライベート・レジストリー・コンポーネントを利用できるものもあります。 ユース・ケース:

  • パブリック・ネットワークでのイメージのプッシュおよびプル。
  • 複数のクラウド・プロバイダーでコンテナーを素早くテストする。
  • 脆弱点スキャンやアクセス管理などのエンタープライズ・グレードの機能が不要。

詳しくは、パブリック・レジストリーの資料 ( QuayDocker 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 バケットに自動的にバックアップされます。 オブジェクト・ストレージ・バケットに保管されているデータは、クラスターを削除しても残ります。

VPC インフラストラクチャーでバージョン 4 を実行する Red Hat OpenShift on IBM Cloud クラスターの場合のみ、内部レジストリーが 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 でローカルに保管することでパフォーマンスが向上する可能性があります。

このデータは永続的ではないので、ポッドまたはワーカー・ノードが再始動された場合には、保管データが削除され、リカバリー不能になることに注意してください。

  1. Red Hat OpenShift クラスターにアクセスします
  2. イメージ・レジストリー・オペレーターの構成マップを更新 して、ワーカー・ノードの emptyDir を使用するようにストレージを設定します。
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
    
  3. イメージ・レジストリー・オペレーターの管理状態Unmanaged に設定されている場合 ( Satellite クラスターなど)、管理状態を Managed に更新します。 そうすると、オペレーターが内部レジストリー・ポッドを更新します。
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
    
  4. 内部レジストリー・ポッドの詳細を取得して、更新内容を確認できるようにします。
    1. 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
      
    2. ** ポッドが実行されている**ノード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 アドレスをメモします。

    3. ポッド YAML の ** セクションにある ** ポッドの image-registryUIDmetadata.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
      ...
      
  5. 内部レジストリーが、ワーカー・ノードの emptyDir にデータを保管することを確認します。
    1. 前に取得したワーカー・ノードを使用して、 クラスターから直接レジストリーにアクセスします。 テスト・イメージを内部レジストリーにプッシュする手順に従ってください。

      Red Hat OpenShift の資料に記載されているこの手順を実行するには、podman CLI ツールが必要です。 デフォルトでは、ワーカー・ノードにこの CLI ツールがない場合があります。 使用可能な RHEL バージョンについては、 Podman インストール・ガイド を参照してください。

    2. emptyDir に保存される内部レジストリー・ポッドのフォルダーに移動します。 <pod_uid> には、先ほど取得したポッド UID を使用します。

      cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
      
    3. イメージがリポジトリー・ディレクトリーにあることを確認します。

      ls
      

      出力例

      <myimage>  nginx  ...
      

内部イメージ・レジストリーの削除

Virtual Private Cloud

内部イメージ・レジストリーを使用しない場合は、以下のステップを実行して削除できます。

  1. 内部レジストリー構成のコピーを保存します。
    oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
    
  2. 以下のパッチ・コマンドを実行して、イメージ・レジストリーの管理状態を Removed に変更します。
    kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
    
  3. 管理状態を変更すると、クラスター内の openshift-image-registry 名前空間からイメージ・レジストリー・サービスとデプロイメントが削除されます。 以下のコマンドを実行して、削除されたことを確認できます。 イメージ・レジストリーのデプロイメントとサービスのみが削除されることに注意してください。 イメージ・レジストリー・オペレーターのデプロイメントとサービスは残ります。
    oc get deployment -n openshift-image-registry
    
    oc get svc -n openshift-image-registry
    

内部レジストリーのためのセキュアな外部経路のセットアップ

デフォルトでは、Red Hat OpenShift クラスターの内部レジストリーは、内部 IP アドレスを割り当てられたサービスを介して使用できます。 内部レジストリーをパブリック・ネットワークに公開するには、セキュアな再暗号化経路をセットアップします。 例えば、他のプロジェクトやクラスターでのデプロイメントでパブリック・レジストリーとして機能するように、クラスターの内部レジストリーをセットアップできます。

始める前に

内部レジストリーを使用するために、そのレジストリーにアクセスするためのパブリック経路をセットアップします。 次に、レジストリーにアクセスするための資格情報が含まれるイメージ・プル・シークレットを作成します。これにより、他のプロジェクトのデプロイメントでこのレジストリーからイメージをプルできるようになります。

  1. 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
    
  2. image-registry サービスのために、reencrypt の TLS 終端処理を使用するセキュアな経路を作成します。 再暗号化では、ルーターは、証明書を使用して TLS 接続を終端してから、別の証明書を使用して内部レジストリーへの接続を再暗号化します。 この方式を使用すると、ユーザーと内部レジストリーの間の接続パスの全体が暗号化されます。 独自のカスタム・ドメイン・ネームを指定するには、 --hostname オプションを含めます。

    oc create route reencrypt --service=image-registry -n openshift-image-registry
    
  3. ** 経路に割り当てられたホスト名 (HOST/PORT) と **PORTimage-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
    
  4. 経路を編集して ロード・バランシング戦略source に設定し、パススルー経路セットアップの場合と同様に、同じクライアント IP アドレスが同じサーバーに到達するようにします。 この戦略を設定するには、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
    ...
    
  5. ローカル・システムからプロキシーまたはファイアウォールを経由してパブリック・エンドポイントにアクセスすることが、企業のネットワーク・ポリシーによって禁止されている場合は、以下の手順に従って、内部レジストリー用に作成した経路のサブドメインへのアクセスを許可します

  6. ホスト名として経路を使用して内部レジストリーにログインします。

    docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
    
  7. ログインしたら、サンプルの hello-world アプリを内部レジストリーにプッシュしてみます。

    1. DockerHub から hello-world イメージをプルするか、ローカル・マシンでイメージを作成します。

      docker pull hello-world
      
    2. 内部レジストリーのホスト名、イメージのデプロイ先のプロジェクト、イメージ名とタグを指定して、ローカル・イメージにタグを付けます。

      docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    3. クラスターの内部レジストリーにイメージをプッシュします。

      docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    4. イメージが 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
      
  8. プロジェクトのデプロイメントで、この内部レジストリーからイメージをプルできるように、内部レジストリーにアクセスするための資格情報を保持するイメージ・プル・シークレットをプロジェクト内に作成します。 次に、そのイメージ・プル・シークレットを各プロジェクトのデフォルトのサービス・アカウントに追加します。

    1. デフォルトのサービス・アカウントで使用されているイメージ・プル・シークレットをリストし、default-dockercfg で始まるシークレットをメモします。

      oc describe sa default
      

      出力例

      ...
      Image pull secrets:
      all-icr-io
      default-dockercfg-mpcn4
      ...
      
    2. 構成ファイルの data フィールドから、エンコードされたシークレット情報を取得します。

      oc get secret <default-dockercfg-name> -o yaml
      

      出力例

      apiVersion: v1
      data:
        .dockercfg: ey...=
      
    3. data フィールドの値をデコードします。

      echo "<ey...=>" | base64 -D
      

      出力例

      {"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
      
    4. 内部レジストリーの新規イメージ・プル・シークレットを作成します。

      • 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 image-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
      
    5. イメージ・プル・シークレットをプロジェクトのデフォルトのサービス・アカウントに追加します。

      oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
    6. 内部レジストリーからイメージをプルする必要があるプロジェクトごとに、この手順を繰り返します。

アクセス可能な経路が内部レジストリーにセットアップされたので、このレジストリーにログインし、イメージをプッシュ/プルすることができます。 詳しくは、 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 資料を読むか、 コンテナー・イメージの管理に関するこのブログを参照してください。

  1. Red Hat OpenShift クラスターにアクセスします

  2. イメージをイメージ・ストリームにプルする default プロジェクトに切り替えます。 default プロジェクトには、icr.io レジストリーにアクセスするための資格情報が既にセットアップされています。

    oc project default
    
  3. IBM Cloud Container Registry にあるイメージをリストします。 Red Hat OpenShift クラスターの内部レジストリーにプルしたいイメージの リポジトリータグ をメモします。

    ibmcloud cr images
    
  4. そのイメージに、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 資料を参照してください。
  5. イメージ・ストリームが作成されたことを確認します。

    oc get imagestreams
    
  6. イメージ・ストリームがイメージを 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 からイメージをプルするための読み取り権限しかありません。 イメージをプッシュするには、書き込み権限を持つシークレットを追加する必要があります。

  1. Red Hat OpenShift クラスターにアクセスします

  2. default プロジェクトに切り替えます。

    oc project default
    
  3. レジストリーでイメージのプルとプッシュを行えるように、IBM Cloud IAM の API キーをセットアップする手順Readerに従って、Writericr.ioのサービス・アクセス役割を持つ API キーをセットアップします。

    プロジェクトにアクセスできるユーザーは誰でも、このシークレットを使用してイメージをプライベート・レジストリーにプッシュできることに注意してください。 クラスター内で誰がどのようなアクションを実行したかを監視できるように、ロギングとモニタリングのツールをセットアップすることをお勧めします。

  4. イメージをプッシュする icr.io リージョンごとに、前の手順を繰り返します。

  5. シークレットをビルドのサービス・アカウントに追加し、ビルド構成ファイルでそのシークレットを参照します。 詳しくは、 Red Hat OpenShift 資料を参照してください。

    1. 先ほど作成したシークレットを、クラスター内のすべてのビルドで使用する builder 役割にリンクすることで、シークレットをビルドのサービス・アカウントに追加します。

      oc secrets link builder <secret_name>
      
    2. ビルド構成をリストし、IBM Cloud Container Registry に対するプッシュとプルのアクセス権限を付与するものをメモします。

      oc get bc
      
    3. 先ほど作成した、IBM Cloud Container Registry に対するWriterのサービス・アクセス権限を持つシークレットを使用するように、ビルド構成のイメージ・プッシュ・シークレットを設定します。

      oc set build-secret --push bc/<build_config_name> <secret_name>
      
    4. 最初のビルドのイメージをプルするレジストリーからプルできるように、ビルド構成のイメージ・プル・シークレットを設定します。 例えば、ソース・イメージが IBM Cloud Container Registry リポジトリーにある場合は、先ほど作成した、IBM Cloud Container Registry に対するReaderのサービス・アクセス権限を持つシークレットを使用できます。

      oc set build-secret --pull bc/<build_config_name> <secret_name>
      
  6. IBM Cloud Container Registry にプッシュできるようにビルドのサービス・アカウントとビルド構成ファイルを更新したら、ビルドを再始動します。

    oc start-build <build_name>
    
  7. ビルド・ポッドの名前 (<build>-2-build など) を取得します。

    oc get pods
    
  8. ビルドのログを確認し、イメージがプッシュされた場所をメモします。

    oc logs <build_pod>
    

    イメージが正常にプッシュされたログの例。

    ...
    Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash>
    Push successful
    
  9. プライベート・レジストリー内のイメージを確認して、イメージが作成されていることを確認します。

    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 からイメージを直接プルするには、以下のトピックを参照してください。

プライベート・レジストリーからイメージをプルする権限をクラスターに与える方法について

レジストリーからイメージをプルするために、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 ドメインからイメージをプルするようにセットアップされます。 以下の FAQ で、他の Red Hat OpenShift プロジェクトまたは他のアカウントでイメージをプルする方法、プル・アクセスを制限する方法、クラスターにデフォルトのイメージ・プル・シークレットがない場合の理由について理解してください。

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 Container Registry のプライベート・ネットワークに関する資料を参照してください。

サービス・エンドポイントを使用するように IBM Cloud アカウントをセットアップすると、IBM Cloud Container Registry との間で行うイメージのプッシュとプルにプライベート・ネットワーク接続を使用できます。

icr.io レジストリーへのプライベート接続を使用するようにクラスターをセットアップするには、どうすればよいですか?

  1. IBM Cloud Container Registry プライベート・クラウド・サービス・エンドポイントを使用できるように、 IBM Cloud インフラストラクチャー・アカウントの 仮想ルーター機能(VRF) を有効にします。 VRF を有効にするには、VRF の有効化を参照してください。 VRF が既に有効になっているかどうかを確認するには、ibmcloud account show コマンドを使用します。
  2. IBM Cloud アカウントでサービス・エンドポイントを使用できるようにします

これで、IBM Cloud Container Registry は自動的にプライベート・クラウド・サービス・エンドポイントを使用するようになります。 Red Hat OpenShift on IBM Cloud クラスターのプライベート・クラウド・サービス・エンドポイントを有効にする必要はありません。

他にもプライベート icr.io レジストリー・アドレスを使用する必要がありますか?
はい。信頼できるコンテンツのイメージに署名した場合は、署名にレジストリー・ドメイン名が含まれています。 署名したイメージにプライベートの icr.io ドメインを使用するには、プライベート icr.io ドメインを使用してイメージの署名を再作成してください。

API キーのイメージ・プル・シークレットを使用するように既存のクラスターを更新する

新しい Red Hat OpenShift on IBM Cloud クラスターでは、IBM Cloud Container Registry へのアクセス権限を与えるために、イメージ・プル・シークレットに API キーを保管します。 それらのイメージ・プル・シークレットを使用すれば、icr.io レジストリー・ドメインに保管されているイメージからコンテナーをデプロイできます。 クラスターの作成時にイメージ・プル・シークレットを使用しなかった場合は、シークレットをクラスターに追加できます。

開始前に

  1. Red Hat OpenShift クラスターにアクセスします

  2. IBM Cloud に対する Red Hat OpenShift on IBM Cloud IAM のオペレーターまたは管理者のプラットフォーム・アクセス役割の許可があることを確認します。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. すべてのリージョンとリソース・グループにおける、IBM Cloud に対する IBM Cloud Container Registry IAM 管理者プラットフォーム・アクセス役割。 ポリシーのスコープを特定のリージョンまたはリソース・グループに設定することはできません。 アカウント所有者は、次のコマンドを実行することでユーザーにこの役割を付与できます。

    シークレットが正常に作成されたことを確認します。

    ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
    
  4. アカウントでサービス ID の作成を制限している場合は、**「ID およびアクセス管理」に対する「サービス ID 作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は iam-identity)。

  5. アカウントで API キーの作成を制限している場合は、**「ID およびアクセス管理」に対する「ユーザー API キー作成者」**の役割を追加します (コンソールの場合)(API または CLI の場合は iam-identity)。

イメージ・プル・シークレットの更新

Kubernetes の default 名前空間にあるクラスターのイメージ・プル・シークレットを更新するには、以下のようにします。

  1. クラスター ID を取得します。

    ibmcloud oc cluster ls
    
  2. クラスターのサービス 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 ドメインからイメージをプルするコンテナーをデプロイできません。

  3. クラスター内にイメージ・プル・シークレットが作成されていることを確認します。

    oc get secrets | grep icr-io
    

    出力例

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. コンテナー・デプロイメント を更新して、 icr.io ドメイン・ネームからイメージをプルします。

  5. オプション: ファイアウォールがある場合は、使用するドメインでレジストリー・サブネットへのアウトバウンド・ネットワーク・トラフィックを許可してください。

  6. 以下のいずれかのオプションを使用して、セットアップを完了します。

イメージ・プル・シークレットを使用してデフォルト以外の IBM Cloud プロジェクトから他の Red Hat OpenShift アカウントまたは外部プライベート・レジストリーにあるイメージにアクセスする方法

default 以外の Red Hat OpenShift プロジェクトにコンテナーをデプロイしたり、他の IBM Cloud アカウントに保管されているイメージを使用したり、外部プライベート・レジストリーに保管されているイメージを使用したりするには、クラスター内に独自のイメージ・プル・シークレットをセットアップします。 さらに、独自のイメージ・プル・シークレットを作成して、特定のレジストリー・イメージ名前空間または操作 (pushpull など) にアクセス権を制限する IAM アクセス・ポリシーを適用することも可能です。

イメージ・プル・シークレットを作成したら、コンテナーがそのシークレットを使用してレジストリーからイメージをプルすることを許可する必要があります。 イメージ・プル・シークレットをプロジェクトのサービス・アカウントに追加することも、各デプロイメントでシークレットを参照することもできます。 手順については、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。

イメージ・プル・シークレットは、それらが作成された対象の Red Hat OpenShift プロジェクトに対してのみ有効です。 コンテナーをデプロイする名前空間ごとに、以下の手順を繰り返してください。

始める前に

  1. IBM Cloud Container Registry に名前空間をセットアップして、その名前空間にイメージをプッシュします
  2. クラスターを作成します。
  3. Red Hat OpenShift クラスターにアクセスします

独自のイメージ・プル・シークレットを使用する方法としては、以下の選択肢があります。

デプロイメントで使用するプロジェクトにイメージ・プル・シークレットを既に作成した場合は、作成済みの imagePullSecret を使用したコンテナーのデプロイを参照してください。

既存のイメージ・プル・シークレットのコピー

イメージ・プル・シークレットをクラスター内の他のプロジェクトにコピーできます (default Red Hat OpenShift プロジェクト用に自動的に作成されたイメージ・プル・シークレットなど)。 例えば、特定のプロジェクトへのアクセスを制限するために、または他の IBM Cloud アカウントからイメージをプルするために、このプロジェクトで別の IBM Cloud IAM API キー資格情報を使用する必要がある場合は、代わりに、イメージ・プル・シークレットを作成します

  1. クラスター内に存在する 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>
    
  2. IBM Cloud Container Registry の default Red Hat OpenShift プロジェクト内の既存のイメージ・プル・シークレットをリストします。

    oc get secrets -n default | grep icr-io
    

    出力例

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. 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 -   
    
  4. シークレットが正常に作成されたことを確認します。

    oc get secrets -n <project_name> | grep icr-io
    
  5. コンテナーをデプロイするには、各デプロイメントにイメージ・プル・シークレットを追加します。または、プロジェクトのサービス・アカウントに追加して、そのプロジェクトのすべてのデプロイメントでイメージをレジストリーからプルできるようにします。

異なる IAM API キー資格情報を使用したイメージ・プル・シークレットの作成

IBM Cloud の IAM アクセス・ポリシーをユーザーまたはサービス ID に割り当てて、特定のレジストリー・イメージ名前空間または操作 (pushpull など) にアクセス権を制限できます。 次に、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 にしてください。あるいは、その特定のユーザーがいなくなってもクラスターがレジストリーにアクセスできるように計画しておいてください。

  1. クラスター内に存在する 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>
    
  2. イメージ・プル・シークレットの 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>"
    
  3. 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 に対するサービス・アクセス役割を入力します。 指定できる値は、ReaderWriterManager です。
    --region <IAM_region>
    オプション。 アクセス・ポリシーの有効範囲を特定の IAM リージョンに制限する場合は、コンマ区切りリスト形式でリージョンを入力します。 指定可能な値は global およびローカル・レジストリーのリージョンです。
    --resource-type namespace --resource <registry_namespace>
    オプション。 特定の IBM Cloud Container Registry 名前空間 内のイメージのみにアクセスを制限する場合は、リソース・タイプとして namespace を入力し、<registry_namespace> を指定します。 レジストリーの名前空間をリストするには、ibmcloud cr namespaces を実行します。
  4. サービス ID の API キーを作成します。 サービス ID に似た名前を API キーに付け、以前に作成したサービス 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>"
    
  5. 前のコマンドの出力から 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   
    
  6. 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 シークレットの作成には必要ですが、作成後は使用されません。
  7. シークレットが正常に作成されたことを確認します。 <project> を、イメージ・プル・シークレットを作成した project に置き換えます。

    oc get secrets --namespace <project>
    
  8. コンテナーをデプロイする際に、プロジェクト内の任意のポッドでそのイメージ・プル・シークレットを使用できるよう、イメージ・プル・シークレットを Kubernetes サービス・アカウントに追加します

他のプライベート・レジストリー内に保管されているイメージへのアクセス

プライベート・レジストリーが既にある場合は、そのレジストリーの資格情報を Kubernetes イメージ・プル・シークレットに保管し、構成ファイルからそのシークレットを参照する必要があります。

始める前に

  1. クラスターを作成します。
  2. Red Hat OpenShift クラスターにアクセスします

イメージ・プル・シークレットを作成するには、以下のようにします。

  1. プライベート・レジストリーの資格情報を保管する 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 シークレットの作成には必要ですが、作成後は使用されません。
  2. シークレットが正常に作成されたことを確認します。 <project> を、イメージ・プル・シークレットを作成したプロジェクトの名前に置き換えます。

    oc get secrets --namespace <project>
    
  3. イメージ・プル・シークレットを参照するポッドを作成します

イメージ・プル・シークレットを使用したコンテナーのデプロイ

ポッド・デプロイメントでイメージ・プル・シークレットを定義するか、Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管して、プロジェクトで Kubernetes サービス・アカウントを指定しないすべてのデプロイメントで使用できるようにすることができます。

クラスターでイメージ・プル・シークレットを使用する方法を計画するときには、以下の選択肢があります。

  • ポッド・デプロイメントでイメージ・プル・シークレットを参照する: プロジェクト内のすべてのポッドに対してデフォルトでレジストリーへのアクセス権限を付与しない場合は、このオプションを使用します。 開発者は、レジストリーにアクセスする必要がある各ポッドのデプロイメントに、イメージ・プル・シークレットを含めることができます。
  • Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する: 選択した Red Hat OpenShift プロジェクト内のすべてのデプロイメントについて、レジストリー内のイメージへのアクセス権限を付与する場合は、このオプションを使用します。 Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管するには、以下の手順を使用します。

選択したプロジェクトの Kubernetes サービス・アカウントにイメージ・プル・シークレットを保管する

すべての Red Hat OpenShift プロジェクトに、default という名前の Kubernetes サービス・アカウントがあります。 プロジェクト内でイメージ・プル・シークレットをこのサービス・アカウントに追加すると、レジストリーからイメージをプルするためのアクセス権限をポッドに付与できます。 サービス・アカウントを指定しないデプロイメントでは、この Red Hat OpenShift プロジェクトの default サービス・アカウントが自動的に使用されます。

  1. default サービス・アカウントにイメージ・プル・シークレットが既に存在しているかどうかを確認します。

    oc describe serviceaccount default -n <project_name>
    

    <none>イメージ・プル・シークレット エントリーに表示される場合、イメージ・プル・シークレットは存在しません。

  2. イメージ・プル・シークレットを 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>"}}]'
      
  3. イメージ・プル・シークレットが 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 を実行して、サービス・アカウントと同じプロジェクトにイメージ・プル・シークレットが存在することを確認します。

  4. レジストリー内のmypod.yamlイメージからコンテナーをデプロイするために、 という名前のポッド構成ファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<project>/<image>:<tag>
    
  5. 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 クラスターにアクセスします。

  1. 使用権付きソフトウェア・ライブラリーのための使用権キーを取得します。

    1. MyIBM.com にログインし、 「Container software library」 セクションまでスクロールします。 **「ライブラリーの表示」**をクリックします。
    2. **「Access your container software」>「Entitlement keys」ページで、「キーのコピー」**をクリックします。 このキーは、コンテナー・ソフトウェア・ライブラリー内のすべての使用権付きソフトウェアへのアクセスを許可します。
  2. 使用権付きコンテナーをデプロイするプロジェクトでイメージ・プル・シークレットを作成して、使用権付きレジストリー 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>
    
  3. 名前空間のサービス・アカウントにイメージ・プル・シークレットを追加して、そのプロジェクトのすべてのコンテナーが使用権キーを使用して使用権付きイメージをプルできるようにします。 詳しくは、イメージ・プル・シークレットを使用したコンテナーのデプロイを参照してください。

    oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. 使用権付きレジストリー内のイメージからコンテナーをビルドするポッドをプロジェクト内で作成します。

    oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
    
  5. ポッドが**「実行中」**状況になっていることを検証することによって、使用権付きイメージからコンテナーが正常にビルドされたことを確認します。

    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 など) は、これらのレジストリーからイメージをプルできないために失敗する可能性があります。

始める前に

プライベート・レジストリーを追加するには、pull-secret プロジェクトのグローバルなopenshift-configを編集します。

  1. プライベート・レジストリーにアクセスするための資格情報が入ったシークレット値を作成し、デコードしたそのシークレット値を 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 ファイルにダウンロードします。
  2. デフォルトのグローバル・プル・シークレットのシークレット値をデコードしたものを取得し、その値を dockerconfigjson ファイルに保管します。

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
    
  3. ダウンロードしたプライベート・レジストリーのプル・シークレットの myregistryconfigjson ファイルを、デフォルトのグローバル・プル・シークレットの dockerconfigjson ファイルと結合します。

    jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
    
  4. 結合した dockerconfigjson-merged ファイルを使用して、グローバル・プル・シークレットを更新します。

    oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
    
  5. グローバル・プル・シークレットが更新されたことを確認します。 プライベート・レジストリーおよび 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>"
            }
        }
    }
    
  6. グローバル構成の変更を反映するには、クラスター内のすべてのワーカー・ノードを再ロードします。

    1. クラスターのワーカー・ノードの ID をメモします。

      ibmcloud oc worker ls -c <cluster_name_or_ID>
      
    2. クラシック・クラスターの場合 各ワーカー・ノードを再ロードします。 複数の -w オプションを含めることで複数のワーカー・ノードを再ロードできますが、停止を回避するために、アプリ用に十分な数のワーカー・ノードを同時に実行したままにしておく必要があります。

      ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
      
    3. VPC クラスターの場合 各ワーカー・ノードを置き換えます。 始める前に、ご使用のクラスターにその他のワーカー・ノードが十分にあることを確認して、ポッドのスケジュールを変更し、ポッドの実行を続行できるようにしてください。

      ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
      
  7. ワーカー・ノードが正常な状態に戻ったら、ワーカー・ノードでグローバル・プル・シークレットが更新されていることを確認します。

    1. デバッグ・ポッドを開始して、ワーカー・ノードにログインします。 <node_name> には、前に取得した プライベート IP を使用します。

      oc debug node/<node_name>
      
    2. ワーカー・ノードのファイルを表示するために、ルート・ディレクトリーをホストに変更します。

      chroot /host
      
    3. Docker 構成ファイルに、設定したグローバル・プル・シークレットに一致するレジストリー資格情報があることを確認します。

      vi /.docker/config.json
      

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 の資料を参照してください。