Ponz Dev Log

ゆるくてマイペースな開発日記

TomcatのHealth Check Valveでヘルスチェックを有効化する

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)
  • *1 Red HatTomcatであるJBoss Web Server (以下、JWS) を使用します。
  • *2 OpenShift Local (crc 2.13.1) を利用します。

Health Check Valveの設定方法

server.xml タグを1行を足すだけでHealth Check Valveを有効化できます。

<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コンテナのビルドとデプロイを試しました。 この記事ではヘルスチェックを設定していなかったので、ヘルスチェックを有効化してみます。

ponzmild.hatenablog.com

しかし上記のような 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
...

以上。