こんにちは。Red Hatのソリューションアーキテクトの瀬戸です。
OpenShiftはCI/CDに関わる機能も備えており、OpenShift上でGitHub等から直接ソースコードを取得してビルドをし、デプロイすることができます。
しかしながら、すでにGitHub ActionsなどCI/CD基盤が外部に構築されており、OpenShiftをアプリケーション稼働環境としてだけ動作させたい場合もあります。
その場合にどうやってコマンドラインでデプロイするのかについて説明します。
コマンドラインツールのインストール
OpenShiftをコマンドラインで操作するためにはoc コマンドが必要です。
OpenShift Container Platform ダウンロードページ からダウンロードすることができます。
バージョンドロップダウンメニューで適切なバージョンを選択し、動作させたいOSを選択してダウンロードしてください。
アカウントがない場合はRed Hat Developer Programでアカウントを作成することができます。
ダウンロードしたら、解凍をし、PATHの通った場所に設定してください。
ocコマンドからのOpenShiftへのログイン
ログインするためのコマンドは OpenShiftのWebコンソールにログインした後に右上のユーザー名をクリックすることで表示されます。
アクセスできるプロジェクトが表示されます。プロジェクトはOpenShift内でまとめて管理される単位です。名前空間(namaspace)とも呼ばれます。
デフォルトで指定されている場合もありますが、指定されていない場合はどのプロジェクトで操作するのか(jarをデプロイするのか)を指定する必要があります。
この例ではsseto-devというのがあるので、以下のコマンドでプロジェクトを切り替えます。
oc project sseto-dev
新しくプロジェクトを作成したい場合は以下のコマンドを実施します。
oc new-project [新しいプロジェクト名]
jarのデプロイ
これで環境の設定が終わったのでjarをデプロイしていきます。
今回はspring-petclinicを使用します。ローカルにダウンロードして、次のコマンドで実行可能jarを作成できます。
mvnw package -Dmaven.test.skip
NOTE:自分のアプリケーションを使用する場合はポート番号:8080でウェブサーバーが実行されるように設定してください。
ここまで来たらいくつかのコマンドを実行するだけでデプロイすることができます。
最初にどのコンテナイメージを使用してビルドをするのかの設定を行います。ここでいうビルドはJavaのビルドではなく、コンテナイメージのビルドです。
oc new-build --name=spring-petclinic --binary=true --image-stream=openshift/ubi8-openjdk-21:1.18 --strategy=source
ここではコマンドの詳細な解説はしませんが、openjdk-21のイメージを使用しています。openjdk-17 のイメージを使用する事もできます。
使用しているイメージストリームとは何かに興味がある場合はこちら。
設定したら、コンテナイメージのビルドを行います。
oc start-build spring-petclinic --from-dir=target --follow
※--from-dirにはjarの含まれているディレクトリを指定してください。
Dockerやpodmanでコンテナイメージのビルドをしたことがる人はログを眺めれば何が行われているかわかるのではないかと思います。
oc start-build spring-petclinic --from-dir=target --follow Uploading directory "target" as binary input for the build ... ........ Uploading finished build.build.openshift.io/spring-petclinic-1 started Receiving source from STDIN as archive ... time="2024-10-25T01:29:24Z" level=info msg="Not using native diff for overlay, this may cause degraded performance for building images: kernel has CONFIG_OVERLAY_FS_REDIRECT_DIR enabled" I1025 01:29:24.537537 1 defaults.go:112] Defaulting to storage driver "overlay" with options [mountopt=metacopy=on]. Caching blobs under "/var/cache/blobs". Trying to pull image-registry.openshift-image-registry.svc:5000/openshift/ubi8-openjdk-21@sha256:4f35566977c35306a8f2102841ceb7fa10a6d9ac47c079131caed5655140f9b2... Getting image source signatures Copying blob sha256:dc35b837139a95d1b9f7f7b0435a024a74ab972416bdc248f3f608c9f917a753 Copying blob sha256:eca9236fb686825c1ec7ba1f1b339f6300ed2d4fffdf50611dde66cb8f6eeaa9 Copying config sha256:6cc5e74a214a5396231402ca4386dceb067e112b8aad022961c5b51ded628172 Writing manifest to image destination Generating dockerfile with builder image image-registry.openshift-image-registry.svc:5000/openshift/ubi8-openjdk-21@sha256:4f35566977c35306a8f2102841ceb7fa10a6d9ac47c079131caed5655140f9b2 Adding transient rw bind mount for /run/secrets/rhsm STEP 1/9: FROM image-registry.openshift-image-registry.svc:5000/openshift/ubi8-openjdk-21@sha256:4f35566977c35306a8f2102841ceb7fa10a6d9ac47c079131caed5655140f9b2 STEP 2/9: LABEL "io.openshift.build.image"="image-registry.openshift-image-registry.svc:5000/openshift/ubi8-openjdk-21@sha256:4f35566977c35306a8f2102841ceb7fa10a6d9ac47c079131caed5655140f9b2" "io.openshift.build.source-location"="/tmp/build/inputs" "io.openshift.s2i.destination"="/tmp" STEP 3/9: ENV OPENSHIFT_BUILD_NAME="spring-petclinic-1" OPENSHIFT_BUILD_NAMESPACE="megascus-dev" STEP 4/9: USER root STEP 5/9: COPY upload/src /tmp/src STEP 6/9: RUN chown -R 185:0 /tmp/src STEP 7/9: USER 185 STEP 8/9: RUN /usr/local/s2i/assemble INFO S2I source build with plain binaries detected INFO Copying binaries from /tmp/src to /deployments ... (中略) INFO Cleaning up source directory (/tmp/src) STEP 9/9: CMD /usr/local/s2i/run COMMIT temp.builder.openshift.io/megascus-dev/spring-petclinic-1:4f08c806 Getting image source signatures Copying blob sha256:1053d00b8e292c8a36bef630a0f4977b29da4e2fd60ac9425e0fcd1f7c1108d5 Copying blob sha256:5526728ef275eaed3e27ae09fdc66e4f9e0a1f07785a8425376b961dc531ce91 Copying blob sha256:d3ff415f0a4679ddb9520781578f8a82a9f74cf4fa6a9d0c266f9fba8ff69914 Copying config sha256:869623b4df3f7c0abc8957cc40d220b9083570115d534af95f36bbe5bb86654a Writing manifest to image destination --> 869623b4df3f Successfully tagged temp.builder.openshift.io/megascus-dev/spring-petclinic-1:4f08c806 869623b4df3f7c0abc8957cc40d220b9083570115d534af95f36bbe5bb86654a Pushing image image-registry.openshift-image-registry.svc:5000/megascus-dev/spring-petclinic:latest ... Getting image source signatures Copying blob sha256:d3ff415f0a4679ddb9520781578f8a82a9f74cf4fa6a9d0c266f9fba8ff69914 Copying blob sha256:dc35b837139a95d1b9f7f7b0435a024a74ab972416bdc248f3f608c9f917a753 Copying blob sha256:eca9236fb686825c1ec7ba1f1b339f6300ed2d4fffdf50611dde66cb8f6eeaa9 Copying config sha256:869623b4df3f7c0abc8957cc40d220b9083570115d534af95f36bbe5bb86654a Writing manifest to image destination Successfully pushed image-registry.openshift-image-registry.svc:5000/megascus-dev/spring-petclinic@sha256:89d446804522d1a49c278bc72b5644eee11afd7de50ab452cfdff7183a731351 Push successful
ビルドが完了したらコンテナイメージを基にPod(サーバー)を立てます。
oc new-app spring-petclinic
OpenShiftではPod(サーバー)を実行した後に外部からアクセスできるようにする設定が必要になります。 次のコマンドを実行します。
oc create route edge --service=spring-petclinic
動作確認はウェブコンソールから行った方がやりやすいのでウェブコンソールにアクセスします。 左のメニューからトポロジーを開いてみてください。デプロイしたPod(サーバー)が表示されているはずです。
Pod(サーバー)の右上をクリックすることでアプリケーションにアクセスすることができます。
アプリケーションを入れ替えたい場合(jarを更新したい場合)は以下のコマンドを再実行します。
oc start-build spring-petclinic --from-dir=target --follow
自動的にアプリケーションが更新されるはずです。
まとめ
簡単にjarのコマンドラインでのアップロード方法を説明しました。既存のアプリケーションをOpenShiftで試しに動かしてみたい場合等に使用する事ができます。 OpenShift環境がなくても試したい場合はOpenShift Developer Sandboxで無料で試すことができます。また、ローカルで確認したい場合はOpenShift Localを使用する事もできます。
OpenShift Localの場合、デフォルトでかなり小さいインスタンスサイズになってますのでいくつか追加で設定をすると快適に使用できます。使用する場合はこちらの記事を参考にしてみてください。
ちなみに、jarを指定しての起動はOpenShift上のGUIから実行することもできます。コマンドラインで実行する場合に比べてさらにお手軽です。こちらの記事を参考にしてみてください。