TomcatからはじめるコンテナとOpenShift (その1)

TomcatからはじめるコンテナとOpenShiftということで、
今年はこのお題目で記事を書いていこうと思います。

記事の目的は、Tomcatを題材にして、コンテナ化して、OpenShiftに持っていったら、
デプロイ、tomcatの設定、NW等がどうなるのを書いていこうと思います。

## 書いていくもの(予定)

・基礎編
　・tomcatのコンテナって (今回)
　・デプロイ
・通信関係
　・OpenShiftで負荷分散(mod_jkやmod_clusterは使わない)
・設定関係
　・tomcatの設定(server.xml)
　・JavaVMの設定
・運用関係
　・稼働統計(メトリクス)
　・ヘルスチェック(LivelinessとReadiness)
　・アクセスログ
　・トラシュー用のログ
　・分散トレーシング
・オペレータを使ってみる

## Red Hatでのtomcatの取り扱い

 Red Hatでは、tomcatのサポートを提供しています。
名称としては、JBoss Web Server(略して、JWS)がRed Hatが提供するtomcatになります。(JBossの冠がつくので、初見はややこしいですね)
　JWSは、単独のサブスクリプションだけでなく、バンドル製品であるRuntimesに含まれています。
また、、OpenShiftのサブスクリプションに含まれているので、ざっくり言うと、OpenShift買えば、ついきます。

参考：Red Hat OpenShift subscription guide

https://www.redhat.com/en/technologies/cloud-computing/openshift/subscription-guide#openshift-container-platform

## Red Hatでのtomcatの提供形態

　 JWSは、コンテナでない場合はrpm、zipやインストーラ形態などで提供しています。
JWS for OpenShiftという呼び方でコンテナイメージも提供しています。
　　　この記事を記載した時点では、以下のイメージが提供されています。
・JBoss Web Server 5.x (OpenJDK8) on UBI 8： tomcat9系(OpenJDK8) on  RHEL8のUBI イメージ
・JBoss Web Server 5.x (OpenJDK11) on UBI 8： tomcat9系(OpenJDK11) on  RHEL8のUBI イメージ

参考：コンテナイメージ

https://catalog.redhat.com/software/containers/search

## JWS for OpenShiftを速攻で動かしてみる。

マニュアルにあるwebsocket-chatというアプリをベースに、速攻でOpenShiftで動かしてみます。

#### サンプルアプリをビルドしておく(warにする)

サンプルアプリのソースをgithubから取得して、ビルドします。warであれば何でもよいです。

```sh
$ git clone https://github.com/jboss-openshift/openshift-quickstarts.git
$ cd openshift-quickstarts/tomcat-websocket-chat/
$ mvn clean package
```
ocp/deploymentsディレクトリを作成して、webアプリをそこにコピーします。

```sh
$ pwd
<任意のパス>/openshift-quickstarts/tomcat-websocket-chat
$ ls
README.md	ocp		pom.xml		src		target
$ mkdir -p ocp/deployments
$ cp target/websocket-chat.war ocp/deployments/
```

#### OpenShiftにデプロイする

今回は、OpenShiftのImageStreamを使って、デプロイします。
さきほどと同じディレクトリで作業します。

ocコマンドでログインして、プロジェクトなどを作っていきます。

```sh
$ oc login -u <user> -p <pass>  <openshift url>
$ oc new-project jws-bin-demo
```

JWSのImageStreamを探します。

```sh
$ oc get is -n openshift | grep ^jboss-webserver | cut -f1 -d ' '
jboss-webserver31-tomcat7-openshift
jboss-webserver31-tomcat8-openshift
jboss-webserver54-openjdk11-tomcat9-openshift-rhel7
jboss-webserver54-openjdk11-tomcat9-openshift-ubi8
jboss-webserver54-openjdk8-tomcat9-openshift-rhel7
jboss-webserver54-openjdk8-tomcat9-openshift-ubi8
jboss-webserver55-openjdk8-tomcat9-openshift-ubi8
```
なんか、いっぱい出てきましたが、今回は、この中で一番新しいjboss-webserver55-openjdk8-tomcat9-openshift-ubi8を使うことにします。

JWSのImageStreamとアプリ名(jws-wsch-appとします)を指定して、ビルド設定を作ります。

```sh
$ oc new-build --binary=true --image-stream=jboss-webserver55-openjdk8-tomcat9-openshift-ubi8:latest --name=jws-wsch-app
--> Found image ce4291c (3 months old) in image stream "openshift/jboss-webserver55-openjdk8-tomcat9-openshift-ubi8" under tag "latest" for "jboss-webserver55-openjdk8-tomcat9-openshift-ubi8:latest"

    JBoss Web Server 5.5 OpenJDK8 
    ----------------------------- 
    Platform for building and running web applications on JBoss Web Server 5.5 with OpenJDK8 - Tomcat v9

    Tags: builder, java, tomcat9

    * A source build using binary input will be created
      * The resulting image will be pushed to image stream tag "jws-wsch-app:latest"
      * A binary build was created, use 'oc start-build --from-dir' to trigger a new build

--> Creating resources with label build=jws-wsch-app ...
    imagestream.image.openshift.io "jws-wsch-app" created
    buildconfig.build.openshift.io "jws-wsch-app" created
--> Success
```

ビルドします。

```sh
$ oc start-build jws-wsch-app --from-dir=./ocp --follow
Uploading directory "ocp" as binary input for the build ...
.......
Uploading finished
build.build.openshift.io/jws-wsch-app-1 started
Receiving source from STDIN as archive ...
・・・・・<長いので省略>
Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/jws-bin-demo/jws-wsch-app@sha256:f77f3e3c233918f0ca2ad58eea9ec23d366b191d25f0f41cb7533e2cefcbde55
Push successful
```

できたイメージをもとにアプリケーションを作成します。

```sh
$ oc new-app jws-wsch-app
--> Found image d3bd00e (20 seconds old) in image stream "jws-bin-demo/jws-wsch-app" under tag "latest" for "jws-wsch-app"

    JBoss Web Server 5.5 OpenJDK8 
    ----------------------------- 
    Platform for building and running web applications on JBoss Web Server 5.5 with OpenJDK8 - Tomcat v9

    Tags: builder, java, tomcat9


--> Creating resources ...
    deployment.apps "jws-wsch-app" created
    service "jws-wsch-app" created
--> Success
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose service/jws-wsch-app' 
    Run 'oc status' to view your app.
```

できたアプリを公開して、アクセスできるようにします。

```sh
$ oc get svc -o name
service/jws-wsch-app
$ oc expose svc/jws-wsch-app
route.route.openshift.io/jws-wsch-app exposed
$ oc get routes --no-headers -o custom-columns='host:spec.host' jws-wsch-app
<ルートのアドレス>
```

以下でアクセスできます。
http://<ルートのアドレス>/websocket-chat

今回は、入りということで、Red Hatでのtomcatの取り扱いと提供形態をメインで記載しました。
今後、細かい設定周りに触れていきたいと思います。
また、手順を誰でも試せる環境で動かせるようにしていきたいと考えています。