OpenShiftの再現環境作成のコツ - 第1回 Quickstarts紹介

こんにちは、Red Hat Partner Technical Account Managerのイアンです。

サポートケース対応の中では、お客様が遭遇している事象を再現するためのサンプルアプリを自前で作ることが多いです。 ミドルウェア単体の問題であれば、Red Hat Customer Portalから対象製品をダウンロードし、すぐアプリをデプロイできます。 でも、お客様はOpenShiftの環境を使っているときはどうしましょうか?

当シリーズでは、ローカルPC下のサンプルアプリをそのまま使って、OpenShiftに手軽にデプロイする方法を紹介します。

当シリーズ

目次

OpenShiftが本当に必要?

まずは、OpenShift環境が本当に必要かどうかを切り分けましょう。

OpenShift特有の機能を使っていなければ、ミドルウェア単体で再現することは可能かもしれません。

また、OpenShiftで利用しているコンテナイメージはRed Hat Container Registryからダウンロード可能であり、ローカルで Podman や Docker でそのまま使えます。 そのやり方については、以前投稿したローカルでのSource-To-Image (s2i)の検証をご参照ください。

残念ながら、BuildConfig、Deployment/DeploymentConfigの挙動確認、コンテナのライフサイクルフックの動作確認などの場合は、OpenShift環境が必要になります。

でも、割と手軽にOpenShift環境を入手できます!

OpenShiftの検証環境の入手

OpenShiftの検証環境を入手する方法はいくつか存在しています。

  1. 身近な環境(社内、校内、ご自宅など)をそのまま利用する
  2. AWS, Azure, GCP上のOpenShift環境

    大手クラウドサービスで手軽にOpenShift環境を起動できますが、有償になります。

  3. Red Hat提供のDeveloper Sandbox for Red Hat OpenShift

    Red Hat Developer のアカウントをお持ちであれば、30日間無償でご利用できる環境を使えます。詳細は上記のリンクをご覧ください。

  4. 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 の詳細は以下のリンクをご覧ください。

OpenShiftでのデプロイ

QuickstartのサンプルアプリをOpenShiftにデプロイする時の手順は以下の感じです。

  1. OpenShift上のプロジェクトを作成する
  2. 必要なリソースをインポートする
  3. テンプレートを用いて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アプリのコード修正

コードを修正するためには、ローカルにコードを用意する必要があります。

  1. jboss-eap-quickstartsをローカルにクローンする。
  2. jboss-eap-quickstarts ディレクトリに移動する。
  3. 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にデプロイしましょう!

  1. jboss-eap-quickstarts ディレクトリに戻る
  2. ビルドを開始する

     oc start-build eap-app-build-artifacts --from-dir=.
    

    oc start-build の --from-dir オプションを使って、ローカルディレクトリ内のファイルを圧縮し、OpenShiftへ転送することが可能です。

  3. ビルドとデプロイが完了したら、サイトをアクセスする

     $ 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を使わずに、既にローカルにあるソースコードのデプロイ方法を勉強します。

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