Spring-Bootアプリケーションのbootable jarをOpenShiftにデプロイする

こんにちは。Red Hatのソリューションアーキテクトの瀬戸です。

OpenShiftはCI/CDに関わる機能も備えており、OpenShift上でGitHub等から直接ソースコードを取得してビルドをし、デプロイすることができます。

しかしながら、すでにGitHub ActionsなどCI/CD基盤が外部に構築されており、OpenShiftをアプリケーション稼働環境としてだけ動作させたい場合もあります。

その場合にどうやってコマンドラインでデプロイするのかについて説明します。

コマンドラインツールのインストール

OpenShiftをコマンドラインで操作するためにはoc コマンドが必要です。

OpenShift Container Platform ダウンロードページ からダウンロードすることができます。

バージョンドロップダウンメニューで適切なバージョンを選択し、動作させたいOSを選択してダウンロードしてください。

ocコマンドのダウンロード

アカウントがない場合は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(サーバー)の右上をクリックすることでアプリケーションにアクセスすることができます。

Pod

アプリケーションの画面

アプリケーションを入れ替えたい場合(jarを更新したい場合)は以下のコマンドを再実行します。

oc start-build spring-petclinic --from-dir=target  --follow

自動的にアプリケーションが更新されるはずです。

まとめ

簡単にjarのコマンドラインでのアップロード方法を説明しました。既存のアプリケーションをOpenShiftで試しに動かしてみたい場合等に使用する事ができます。 OpenShift環境がなくても試したい場合はOpenShift Developer Sandboxで無料で試すことができます。また、ローカルで確認したい場合はOpenShift Localを使用する事もできます。

OpenShift Localの場合、デフォルトでかなり小さいインスタンスサイズになってますのでいくつか追加で設定をすると快適に使用できます。使用する場合はこちらの記事を参考にしてみてください。

rheb.hatenablog.com

ちなみに、jarを指定しての起動はOpenShift上のGUIから実行することもできます。コマンドラインで実行する場合に比べてさらにお手軽です。こちらの記事を参考にしてみてください。

qiita.com

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。