Apache TomcatはHealth Check Valveを使用することでヘルスチェックを有効化できます。 ヘルスチェック設定方法とOpenShift上のJWSコンテナで利用する方法を書きます。
Health Check Valveを利用可能なTomcatバージョン
Changelogを見る限り、Health Check Valveは比較的新しい機能のようです。 本記事執筆時点(2023/02)ではTomcat 8以下では利用できず、Tomcat 9以上が必要です。
Tomcat 9を利用する場合、ヘルスチェックの機能が揃っているバージョン9.0.39以上を利用することをおすすめします。 Red Hatが提供する商用TomcatであるJBoss Web Serverの場合、バージョン5.5.0以上に相当します。
参考リンク:
検証環境
コンポーネント | バージョン |
---|---|
JDK | 11 |
Tomcat | 9.0.50 (*1) |
OpenShift | 4.12.0 (*2) |
Health Check Valveの設定方法
server.xml
に
<Server ...> <Service name="Catalina"> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" ...> <!-- 以下の1行を追記 --> <Valve className="org.apache.catalina.valves.HealthCheckValve" /> </Host> </Engine> </Service> </Server>
デフォルトのヘルスチェックエンドポイントのURLは http[s]://<ホスト名>:<ポート番号>/health
となります。
パス部分 /health
を変更したい場合はValveに path
属性を指定すればOKです。
参考リンク:
OpenShift上のTomcatコンテナでヘルスチェックを利用する
以前のブログ記事でOpenShiftのS2Iを利用したTomcatコンテナのビルドとデプロイを試しました。 この記事ではヘルスチェックを設定していなかったので、ヘルスチェックを有効化してみます。
しかし上記のような server.xml
への設定追加は不要です。
なぜならJWSのベースイメージで提供される server.xml
に既にHealth Check Valveの設定が入っているからです。
稼働中のJWS Podに配置された server.xml
の中身を確認した結果は次のとおりです。
$ oc exec -i <Pod名> -- cat /opt/jws-5.6/tomcat/conf/server.xml | grep Valve ... <Valve className="org.apache.catalina.valves.RemoteIpValve" ... /> <Valve className="org.apache.catalina.valves.AccessLogValve" ... /> <Valve className="org.apache.catalina.valves.ErrorReportValve" ... /> <Valve className="org.apache.catalina.valves.HealthCheckValve" />
Podに対してヘルスチェックエンドポイントを呼び出してみます。
Tomcatが正常に起動していればレスポンスのJSON内に UP
と表示されます。
checks
プロパティに追加のチェック結果を指定できそうな匂いがしますが、ドキュメントで設定方法を見つけることができませんでした。
$ oc exec -i <Pod名> -- curl -s http://localhost:8080/health { "status": "UP", "checks": [] }
ヘルスチェックエンドポイントを呼び出せることを確認できたので、 OpenShiftのLiveness ProbeとReadiness Probeを設定して、ダウンしている際には再起動およびリクエストを流さないようにしてみます。 YAMLマニフェストでも設定できますが、OpenShift CLIではワンライナーで設定可能です。 次のコマンドを実行してTomcatのヘルスチェックエンドポイントを叩くように設定します。
$ oc set probe deployment/<アプリ名> --liveness --readiness --get-url=http://:8080/health --initial-delay-seconds=5 deployment.apps/<アプリ名> probes updated
設定後はアクセスログを確認すると10秒間隔でヘルスチェックエンドポイント /health
が呼びされていることがわかります。
Liveness ProbeとReadiness Probeで同じエンドポイントを設定しているので2回ずつ呼び出されます。
19-Feb-2023 09:05:20.262 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [1926] milliseconds 10.21.32.45 - - [19/Feb/2023:09:05:25 +0000] - "GET /health HTTP/1.1" 200 36 10.21.32.45 - - [19/Feb/2023:09:05:25 +0000] - "GET /health HTTP/1.1" 200 36 10.21.32.45 - - [19/Feb/2023:09:05:25 +0000] - "GET /health HTTP/1.1" 200 36 10.21.32.45 - - [19/Feb/2023:09:05:35 +0000] - "GET /health HTTP/1.1" 200 36 ...
以上。