こんにちは、Red Hat Partner Technical Account Managerのイアンです。
サポートケース対応の中では、お客様が遭遇している事象を再現するためのサンプルアプリを自前で作ることが多いです。 ミドルウェア単体の問題であれば、Red Hat Customer Portalから対象製品をダウンロードし、すぐアプリをデプロイできます。 でも、お客様はOpenShiftの環境を使っているときはどうしましょうか?
当シリーズでは、ローカルPC下のサンプルアプリをそのまま使って、OpenShiftに手軽にデプロイする方法を紹介します。
当シリーズ
- OpenShiftの再現環境作成のコツ - 第1回 Quickstarts紹介
- OpenShiftの再現環境作成のコツ - 第2回 一からビルド
- OpenShiftの再現環境作成のコツ - 第3回 ランタイムイメージの利用
目次
OpenShiftが本当に必要?
まずは、OpenShift環境が本当に必要かどうかを切り分けましょう。
OpenShift特有の機能を使っていなければ、ミドルウェア単体で再現することは可能かもしれません。
また、OpenShiftで利用しているコンテナイメージはRed Hat Container Registryからダウンロード可能であり、ローカルで Podman や Docker でそのまま使えます。 そのやり方については、以前投稿したローカルでのSource-To-Image (s2i)の検証をご参照ください。
残念ながら、BuildConfig、Deployment/DeploymentConfigの挙動確認、コンテナのライフサイクルフックの動作確認などの場合は、OpenShift環境が必要になります。
でも、割と手軽にOpenShift環境を入手できます!
OpenShiftの検証環境の入手
OpenShiftの検証環境を入手する方法はいくつか存在しています。
- 身近な環境(社内、校内、ご自宅など)をそのまま利用する
AWS, Azure, GCP上のOpenShift環境
大手クラウドサービスで手軽にOpenShift環境を起動できますが、有償になります。
Red Hat提供のDeveloper Sandbox for Red Hat OpenShift
Red Hat Developer のアカウントをお持ちであれば、30日間無償でご利用できる環境を使えます。詳細は上記のリンクをご覧ください。
OpenShift Local(旧名: CodeReady Containers (CRC))
ローカルPCにOpenShift環境を起動する方法です。 簡単に導入できますが、最低限の必要スペックは高いです:
- 4 CPUコア以上
- 9 GBメモリ以上
- 35 GBディスク以上
当記事では、OpenShift Localを利用しますが、他の環境でも使えるはずです。
環境の用意ができたら、サンプルアプリのデプロイの仕方を見てみましょう。
OpenShift Localの性能向上
ローカルPCで起動するときは、私は以下のコマンドを事前に実行し、性能を向上させます。 もちろん、自分の環境に合わせて設定を変更してください。
8コアまで利用する
crc config set cpus 8
14GBメモリまで利用する
crc config set memory 14336
Quickstarts
サンプルアプリを作りたい場合は、一から作るのが大変でしょう。 EJBのアノテーションは何でしたっけ? どうやってデータベース接続を用意すればいいの? RESTのWebサービスをどう定義すればいいでしょうか?
ご安心ください!一から作成する必要が全くありません!
Red Hatは、Quickstartと呼ばれる高度な機能をすぐ使えるためのサンプルアプリを提供しています。
EAPの場合は、80個弱のQuickstartがあり、EJB、MDB、JPA、CXF、Resteasy などの技術を使っているサンプルもあります。
kitchensink (流し台)のQuickstartは複数機能を用いて、一般的なWebアプリに近いサンプルですが、再現アプリのベースとしては若干複雑です。
単純なアプリを作りたい場合は helloworld-* のQuickstartをベースにすることがお勧めです。
Quickstart の詳細は以下のリンクをご覧ください。
- Red Hatカスタマーポータル上のJBoss EAP quickstart examples
- GitHub上のjboss-developer/jboss-eap-quickstarts
OpenShiftでのデプロイ
QuickstartのサンプルアプリをOpenShiftにデプロイする時の手順は以下の感じです。
- OpenShift上のプロジェクトを作成する
- 必要なリソースをインポートする
- テンプレートを用いてEAP 7.4のアプリを作成する
この手順の詳細は第2章 JBoss EAP for OpenShift イメージでの Java アプリケーションのビルドおよび実行に記載されています。
プロジェクト作成
oc new-project quickstart
コマンドで新しいOpenShiftプロジェクトを作成する。
当記事では quickstart という名前を使っていますが、任意に決めていいです。別の名前を使った場合は、これからのコマンド例に quickstart を置き換えてください。
$ oc new-project quickstart Now using project "quickstart" on server "https://api.crc.testing:6443". You can add applications to this project with the 'new-app' command. For example, try: oc new-app rails-postgresql-example to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application: kubectl create deployment hello-node --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 -- /agnhost serve-hostname
ImageStreamのインポート
最新版のJBoss EAP 7のImageStreamを quickstart プロジェクトにインポートします。 この例には、JDK 11用のイメージを利用します。
$ oc create -f \ https://raw.githubusercontent.com/jboss-container-images/jboss-eap-openshift-templates/eap74/eap74-openjdk11-image-stream.json
Templateのインポート
EAPアプリを簡単にデプロイするためのテンプレートが用意されています。 テンプレート情報を quickstart プロジェクトにインポートします。
NOTE: テンプレートを使わない方法は後で紹介します。
for resource in \ eap74-amq-persistent-s2i.json \ eap74-amq-s2i.json \ eap74-basic-s2i.json \ eap74-https-s2i.json \ eap74-sso-s2i.json do oc create -f \ https://raw.githubusercontent.com/jboss-container-images/jboss-eap-openshift-templates/eap74/templates/${resource} done
NOTE: コマンドを貼り付ける場合は、$\{resource\}
にならないようにご注意ください。
アプリの作成
先程のテンプレートを使って、Quickstartのアプリをデプロイします。
$ oc new-app --template=eap74-basic-s2i \ -p IMAGE_STREAM_NAMESPACE=quickstart \ -p EAP_IMAGE_NAME=jboss-eap74-openjdk11-openshift:7.4.0 \ -p EAP_RUNTIME_IMAGE_NAME=jboss-eap74-openjdk11-runtime-openshift:7.4.0 \ -p SOURCE_REPOSITORY_URL=https://github.com/jboss-developer/jboss-eap-quickstarts \ -p SOURCE_REPOSITORY_REF=7.4.x \ -p CONTEXT_DIR=helloworld-rs \ -p GALLEON_PROVISION_LAYERS=jaxrs-server \ -e ENABLE_ACCESS_LOG=true
NOTE: quickstart 以外のプロジェクト名を使った場合は、IMAGE_STREAM_NAMESPACE
の値をプロジェクト名に変更してください。
なお、各環境変数の詳細は2.5. JBoss EAP S2I (Source-to-Image) アプリケーションの OpenShift へのデプロイまでご参照ください。
ビルドとデプロイ
ここまでできたら、OpenShift上に指定したQuickstartのアプリがビルドとデプロイされます。
全体の状況を oc status
コマンドで確認できます。
ビルドが完了したら、アプリの動作を確認しましょう。
稼働確認
以下のコマンドでアプリのホスト名を取得します。
oc get route/eap-app -o jsonpath='{.spec.host}'
curl
を使って、httpsでアプリにアクセスします。
$ curl -k -w '\n' https://<host>/rest/json {"result":"Hello World!"}
できました!
次のステップ
Quickstartのサンプルアプリを簡単にOpenShiftにデプロイできました!
でも、ここで一つ疑問がありませんか? どうやってアプリのコードを編集しますか?
QuickstartをGitHubからデプロイしましたが、GitHubのレポジトリをフォークし、ローカルにクローンし、修正し、またプッシュするのはかなり手間がかかります。
ローカルのソースコードからビルドする方法を説明します。
Quickstartアプリのコード修正
コードを修正するためには、ローカルにコードを用意する必要があります。
- jboss-eap-quickstartsをローカルにクローンする。
- jboss-eap-quickstarts ディレクトリに移動する。
7.4.x
ブランチに切り替える。
準備ができたら、コードを編集します。
先に helloworld-rs を利用したため、 helloworld-rs の中の HelloService.java を以下のように変更します。
RESTサービスの応答の Hello
を Hi
に切り替えます。
変更前
public class HelloService { String createHelloMessage(String name) { return "Hello " + name + "!"; } }
変更後
public class HelloService { String createHelloMessage(String name) { return "Hi " + name + "!"; } }
編集できたら、アプリをOpenShiftにデプロイしましょう!
- jboss-eap-quickstarts ディレクトリに戻る
ビルドを開始する
oc start-build eap-app-build-artifacts --from-dir=.
oc start-build
の--from-dir
オプションを使って、ローカルディレクトリ内のファイルを圧縮し、OpenShiftへ転送することが可能です。ビルドとデプロイが完了したら、サイトをアクセスする
$ curl -k -w '\n' https://<host>/rest/json {"result":"Hi World!"}
start-build
に --from-dir
オプションを使えば、ローカルのソースコードをそのままOpenShiftに転送し、ビルドできます。
ただし、アプリを作成したときは、 CONTEXT_DIR=helloworld-rs
を指定しましたので、 helloworld-rs のディレクトリがソースコードにないと、ビルドがエラーになります。
あまり柔軟性がありませんね。
また、このやり方では、ビルド時には jboss-eap-quickstarts を全部まとめてOpenShiftに転送する必要があります。 これも少し無駄が多いです。
色々できましたが、まだ少し物足りません。
まとめと次回の予告
弊社が提供しているQuickstartをベースにしたサンプルアプリをOpenShiftに簡単にデプロイする方法を紹介しました。 また、そのアプリを修正し、再デプロイする方法も説明しました。
次回は、テンプレートとGitHubを使わずに、既にローカルにあるソースコードのデプロイ方法を勉強します。