Kubernetes 用に Java アプリケーションをコンテナー化する
この記事では、Kubernetes でデプロイメント用に Java アプリケーションをコンテナー化する方法について説明します
コンテナー メモリ、JVM ヒープ メモリ、ガベージ コレクター (GC)、および vCPU コアに関するガイダンスについては、「Java アプリケーションをコンテナー化する」を参照してください。
Kubernetes ノード プールに適した VM SKU を決定する
クラスターで使用できる Kubernetes ノード プールが、使用するコンテナー メモリと vCPU コアに適合できるかどうかを判断します。 ノード プールがアプリケーションをホストできる場合は、続行します。 それ以外の場合は、コンテナー メモリの量とターゲットとする vCPU コアの数に適したノード プールをプロビジョニングします。
VM SKU のコストは、コアの数とメモリの量に比例します。 1 つのコンテナー インスタンスの vCPU とメモリの観点から開始点を決定した後、水平方向のスケーリングのみでアプリケーションのニーズを満たすことができるかどうかを判断します。 信頼性の高い常時接続システムの場合は、少なくとも 2 つのレプリカを使用できる必要があります。 必要に応じてスケール アップとスケール アウトを行います。
CPU の要求と制限を設定する
CPU を制限する必要がある場合は、デプロイ ファイルの limits
と requests
の両方に同じ値を適用してください。 JVM では、GC やその他のスレッド プールなどのランタイムを動的に調整しません。 JVM は、起動時にのみ使用可能なプロセッサの数を読み取ります。
ヒント
CPU 要求と CPU 制限に同じ値を設定します。
containers:
- image: myimage
name: myapp
resources:
limits:
cpu: "2"
requests:
cpu: "2"
JVM で使用可能なプロセッサについて
OpenJDK の HotSpot JVM がコンテナー内で実行されていることを識別すると、cpu_quota
や cpu_period
のような値を使用して使用可能なプロセッサの数を決定します。 一般に、1000m
ミリコアまでの値は 1 つのプロセッサ マシンとして識別されます。 1001m
と 2000m
の間の値は、デュアル プロセッサ マシンなどのように識別されます。 この情報は、API Runtime.getRuntime().availableProcessors() から入手できます。 この値は、スレッドを構成するために、同時実行 GC の一部でも使用できます。 他の API、ライブラリ、フレームワークでも、この情報を使用してスレッド プールを構成できます。
Kubernetes CPU クォータは、プロセスで使用できる CPU の数ではなく、プロセスが CPU に費やす時間に関連します。 JVM などのマルチスレッド ランタイムでは、複数のプロセッサを複数のスレッドで同時に使用できます。 コンテナーに vCPU は 1 つという制限がある場合でも、JVM で 2 つ以上の使用可能なプロセッサを確認するように指示される場合があります。
Kubernetes 環境に表示される必要があるプロセッサの正確な数を JVM に通知するには、次の JVM フラグを使用します。
-XX:ActiveProcessorCount=N
メモリ要求と制限を設定する
メモリ制限を、以前に決定した量に設定します。 メモリ制限の数が、JVM ヒープ メモリの値ではなくコンテナー メモリであることを確認してください。
ヒント
メモリ要求は、メモリ制限と等しくなるように設定します。
containers:
- name: myimage
image: myapp
resources:
limits:
memory: "4Gi"
requests:
memory: "4Gi"
デプロイ ファイルに JVM 引数を設定します。
JVM ヒープ メモリーは、必ず以前に決定した量に設定してください。 コンテナー イメージを再構築しなくても簡単に変更できるように、この値を環境変数として渡すことをお勧めします。
containers:
- name: myimage
image: myapp
env:
- name: JAVA_OPTS
value: "-XX:+UseParallelGC -XX:MaxRAMPercentage=75"
次のステップ
- Java コンテナー化戦略
- Azure コンテナー ランタイムでの Jakarta EE
- Oracle WebLogic Server
- IBM WebSphere Liberty、Open Liberty、および従来の WebSphere