OpenShift on IBM Cloud で IBM Cloud Container Registry にイメージを保管する

#1.目的
OpenShift on IBM Cloud で IBM Cloud Container Registry にイメージを保管する手順をまとめ確認してみました。

逆のケースIBM Cloud Container RegistryにあるイメージをOpenShift on IBM Cloudで使う場合、defaultプロジェクトのImagePullSecretをコピーして使い回せばいいのですが、pushする場合IBM Cloud IAMのServiceID作成から始める必要があり結構大変になります。

[OpenShift on IBM Cloud で IBM Cloud Container Registry にあるイメージを使う](https://qiita.com/kissyy/items/175230885270f70de867)


#2.手順

###1.サービス IDの作成(IBM Cloud IAM)
IAMポリシーと API キーのために使用するクラスターの IBM Cloud IAM サービス ID を作成します。ここではservice99の名前で作成します。

```
 % ibmcloud iam service-id-create service99
nsakata@jp.ibm.com として 現行アカウント にバインドされるサービス ID service99 を作成しています...
OK
サービス ID service99 が正常に作成されました
                
ID           ServiceId-aa7c7cd6-29ea-411c-8a62-bc6d0b0aa495   
名前         service99   
説明            
CRN          crn:v1:bluemix:public:iam-identity::a/039dbe6794084c7cb514a276dd2345da::serviceid:ServiceId-aa7c7cd6-29ea-411c-8a62-bc6d0b0aa495   
バージョン   1-5724e0df9fe031f518ec6cf708d7b040   
ロック中     false
```
###2.IBM Cloud Container Registryへのアクセス権限の付与(IAM)

ICR(IBM Cloud Container Registry)へのアクセス権を与えるため、上記で作成したサービス ID に対してWriter権限を与えます。--rolesにWriterを指定して"役割 Writer が見つかりませんでした。 有効な役割は 管理者, ライター, リーダー, ビューアー, 管理者, オペレーター, エディター です。"のエラーが出たら、メッセージの通りに日本語でライターを指定ください。

```
 % ibmcloud iam service-policy-create service99 --roles ライター --service-name container-registry
nsakata@jp.ibm.com としてサービス ID service99 の 現行アカウント にポリシーを作成しています...
OK
サービス・ポリシーは正常に作成されます

                  
ポリシー ID:   0ee6a548-307e-4718-bbd0-5d390901f39f   
バージョン:    1-fe2a60b718fc9eece90c415b7358dcb8   
役割:          ライター   
リソース:                         
               サービス名   container-registry

```
###3.API キーの作成(IAM)
サービス ID の API キーを作成します。ここではapikey99の名前で作成します。

```
 % ibmcloud iam service-api-key-create apikey99 service99 
nsakata@jp.ibm.com としてアカウント 039dbe6794084c7cb514a276dd2345da にサービス ID service99 の API キー apikey99 を作成しています...
OK
サービス ID API キー apikey99 が作成されます

API キーを保存してください。 作成後に取得することはできません。
              
ID         ApiKey-49ceb0f7-4339-4a20-b559-bc9eb2b83e9d   
名前       apikey99   
説明          
作成日時   2021-10-22T08:09+0000   
API キー   xqgbZXXXXXXXXXXXXXXXXXXXXXXXXXXX 
ロック中   false  
```
###4.シークレットの作成(OpenShift on IBM Cloud)
ICRをpullする権限のあるシークレットをROKS(OpenShift on IBM Cloud)クラスターのプロジェクトtest20に作成します。--docker-password には上記で取得したAPIキーを入力します。--docker-emailは適当にx@y.zを指定します。シークレット名はsecret99とします

```
 % oc --namespace test20 create secret docker-registry secret99 --docker-server icr.io --docker-username iamapikey --docker-password xqgbZXXXXXXXXXXXXXXXXX --docker-email x@y.z 
secret/secret99 created

```
###4.シークレットをサービス・アカウントに追加(ROKS)
先ほど作成したシークレットsecret99を、クラスター内のビルドで使用する サービス・アカウントbuilderに追加します。

```
 % oc secrets link builder secret99
```

###4.ビルドの実行及び確認(ROKS)
BuildCondigを作成して実行します。--to-dockerを指定することで生成されたイメージを外部のレジストリに登録することを指定し、--toでICRのicr.ioの名前空間test1(事前作成済み)を指定します。

```
 % oc new-build openshift/nodejs~https://github.com/sclorg/nodejs-ex.git --to-docker --to icr.io/test1/nodejs-ex
--> Found image b23116f (9 days old) in image stream "openshift/nodejs" under tag "14-ubi8" for "openshift/nodejs"

    Node.js 14 
    ---------- 
    Node.js 14 available as container is a base platform for building and running various Node.js 14 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

    Tags: builder, nodejs, nodejs14

    * A source build using source code from https://github.com/sclorg/nodejs-ex.git will be created
      * The resulting image will be pushed with Docker to "icr.io/test1/nodejs-ex"
      * Use 'oc start-build' to trigger a new build

--> Creating resources with label build=nodejs-ex ...
    buildconfig.build.openshift.io "nodejs-ex" created
--> Success
```

ビルドログを確認します。ICRに正常に保管されていることを確認します。

```
 % oc get pods
NAME                     READY   STATUS      RESTARTS   AGE
nodejs-ex-1-build        0/1     Completed   0          2m11s

 % oc logs -f nodejs-ex-1-build 
Caching blobs under "/var/cache/blobs".
Getting image source signatures
Copying blob sha256:06038631a24a25348b51d1bfc7d0a0ee555552a8998f8328f9b657d02dd4c64c

中途略

Successfully pushed icr.io/test1/nodejs-ex@sha256:19924bfd6fafff6a06ef52b705f60a88d4415124f30eeadd9f3a7f2fc333f001
Push successful
```

#3.IBM Cloud Portalからの確認

ICRの画面から上記で作成したイメージnodejs-exが作成されたことを確認できました。

![スクリーンショット 2021-10-27 10.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/238ae839-0584-5f26-056d-c97e367652e7.png)

#4.参考情報
IBM Cloud DOCの関連情報リンクは以下になります。

[異なる IAM API キー資格情報を使用してイメージ・プル・シークレットを作成することで、より細かい制御を可能にしたり、他の IBM Cloud アカウント内のイメージへのアクセスを可能にしたりする方法](https://cloud.ibm.com/docs/openshift?topic=openshift-registry#imagePullSecret_migrate_api_key)

[IBM Cloud Container Registry にイメージをプッシュするように内部レジストリーのビルドをセットアップする](https://cloud.ibm.com/docs/openshift?topic=openshift-registry#builds_registry)