Kubernetes で Jakarta EE(Payara)業務システムを動かすときの考慮点と注意点
近年、業務システムでも「コンテナ化して Kubernetes で可用性と運用性を上げたい」という要望が増えています。しかし、Jakarta EE(特に Payara Server)を単純にコンテナへ入れるだけでは、Kubernetes の恩恵を最大化できません。
この記事では、業務システムを Payara Server で構築している場合に Kubernetes 化する際、必ず押さえるべきポイントをまとめます。クラウド環境としては Oracle Cloud(OKE)を前提にしていますが、考え方自体はどのK8sにも共通します。
1. 「Payara Server をそのままクラスタリング」は原則しない
GlassFish 系の標準的なクラスタリング(DAS を中心としたドメイン管理)は、**「ノードが固定される前提」**の設計です。一方 Kubernetes では Pod は“消えるもの”であり、再スケジュールされ、IP も入れ替わります。
そのため、Kubernetes では以下の方式が定石です。
- Payara Server の各Podを独立インスタンスとして動かす(non-DAS構成)
- 設定は Docker イメージ内 or preboot/postboot スクリプトで再現可能にする
- クラスタ管理は Kubernetes(Deployment/ReplicaSet)に任せる
DASごとコンテナ化してPod内で起動する構成は、Kubernetesとの相性が悪く非推奨です。
2. コンテナ化で重要なのは「ステートレス化」
Kubernetes での可用性向上の本質は、「アプリをいつでもどこにでも再配置できる状態にする」ことです。そのカギが ステートレス化 です。
ステートレス化の要件
- セッションを外に出す / JWT化する
- HttpSession を使うなら Sticky Session や外部ストア(Redis など)が必要
- 最も可用性が高いのは JWT などの完全ステートレス方式
- ファイルはローカルに置かない
- “アップロードをローカルに保存”は Pod の再配置で必ず壊れる
- Object Storage(クラウドストレージ)に保存するのがベスト
- 設定ファイルを不変にする
- ConfigMap/Secret で定義し、イメージ内の設定を最小化
Payara を複数 Pod として動かすためには、このあたりの調整が必須です。
3. ファイルアップロードは Object Storage または 共有ファイルシステム(FSS)に逃がす
業務システムでよくある“ファイルアップロード”は、Kubernetes では最大の落とし穴になります。
X アップロードをローカル(/tmp や /opt/payara/...)に保存
→ Pod が落ちた瞬間に消えるため、冗長化できない
- Object Storage(OCI Object Storage など)へ直接保存
- Podが消えても影響ゼロ
- OKEとの相性が良い
- 可用性を最も高くできる
さらに、100MiBを超えるファイルなら OCI はマルチパートアップロード推奨なので、大容量対応も容易です。
DBにはメタデータだけを保存する
例:
- bucket
- objectName
- size
- contentType
- status(UPLOADING / AVAILABLE / FAILED)
この構造にしておけば、アップロード失敗時の再試行や整合性チェックも容易です。
4. Payara Server のヘルスチェックは必ず設計する
Payara Server は起動に時間がかかるため、Probe(ヘルスチェック)設計が非常に重要です。
特に重要な3つ
1. startupProbe
- 「起動完了まで liveness を無効化」
- これが無いと、Payara は起動途中で liveness に殺されて再起動ループになります
2. readinessProbe
- アプリが「リクエストを受けられる状態」になってからONLY トラフィックを流す
- DB疎通が完了してから 200 を返すのが理想
3. livenessProbe
- ハングしたら再起動
- ただし過敏にしない(false positive で再起動→SLA低下)
Payara では MicroProfile Health を使った
/health/ready /health/live
がベストです。
5. Kubernetes での可用化に必須の K8s リソース
Deployment(replicas 2+)
- Kubernetes が自動復旧
- RollingUpdateで無停止に近いデプロイ
Service(ClusterIP)
- Ingress からアプリを安定して参照するための内部固定ポイント
Ingress(Nginx / OCI Native Ingress)
- ロードバランシング
- SSL終端
- パス/ホスト単位のルーティング
PodDisruptionBudget(PDB)
- ノードメンテ時に「全部のPodが同時に落ちる」事故を防ぐ
6. OCI環境なら Workload Identity は必ず検討
OCIでは、2024以降 Workload Identity が推奨です。
メリット
- APIキーをPodに置かない(Secret不必要)
- Kubernetesの serviceAccount を IAM とひも付け可能
- Object Storage などを安全に叩ける
典型的な利用例
- Payara アプリから OCI Object Storage へアップロード(PUT)
- Pre-Authenticated Request(PAR)を発行
- メタデータ更新
APIキー方式よりも安全で運用負荷が低いので 強く推奨 です。
7. DB は Kubernetes の外で管理するのが現実的
業務システムでは DB の可用性が重要ですが、KubernetesにDBを載せると「ストレージHA」「フェイルオーバー」「スナップショット」「チューニング」を自前でやる必要があります。
そのため、以下が実務では定石です:
- DBはマネージド(または既存のHA構成)
- アプリ層だけ Kubernetes 化して可用性を高める
Kubernetes の可用性は “アプリ層のセルフヒーリング+スケールアウト” が中心です。
8. Payara ServerをDocker化するときの注意点
- domain ディレクトリは不変に
- postboot.asadmin / preboot.asadmin に設定反映を集約
- JVM オプションも環境変数化(ConfigMap / Secret)
- ログは 標準出力へ(K8sログ収集と相性が良い)
- ローカルファイル保存は禁止(temporary用途なら emptyDir のみ)
まとめ:業務システムを Kubernetes 化するなら「ステートレス化」が成功の鍵
Payara Server の業務システムを OKE(Kubernetes)で可用化するとき、最も重要なのは アプリを“Kubernetesにお任せできる状態”にすることです。
ポイントを整理すると…
- Payara Server は 独立Pod として動かす(DASは使わない)
- セッションは外部化 or JWT化
- ファイルアップロードは Object Storage または FSSを使用
- Probe(startup / readiness / liveness)設計は必須
- 設定値は ConfigMap/Secret に分離
- DBは無理にK8sへ入れず、外部のHA構成を利用
- OCIなら Workload Identity で Object Storage に安全アクセス
これらを押さえることで、高可用・低運用負荷の Jakarta EE(Payara)アプリケーション基盤が実現できます。