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 にあるイメージを使う
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が作成されたことを確認できました。
4.参考情報
IBM Cloud DOCの関連情報リンクは以下になります。
IBM Cloud Container Registry にイメージをプッシュするように内部レジストリーのビルドをセットアップする