この記事では、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 ミリコアまでの値は、単一のプロセッサ マシンとして識別されます。
1001m と 2000m の間の値は、デュアル プロセッサ マシンとして識別されます。 この情報は、API Runtime.getRuntime().availableProcessors()から入手できます。 一部の同時実行 PC では、この値を使用してスレッドを構成することもできます。 他の API、ライブラリ、フレームワークでも、この情報を使用してスレッド プールを構成する場合があります。
Kubernetes CPU クォータは、プロセスで使用できる CPU の数ではなく、プロセスが CPU に費やす時間に関連します。 JVM などのマルチスレッド ランタイムでは、複数のプロセッサが同時に使用され、複数のスレッドが使用される場合があります。 コンテナーに 1 つの vCPU の制限がある場合でも、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コマンドランチャーを使用して JVM チューニングを簡略化する
前のセクションでは、JVM フラグを使用して、プロセッサ数、ヒープ サイズ、および GC を手動で設定します。 これらの設定を維持しない場合は、jazでクラウドネイティブの既定値を適用できます。 起動時にコンテナーの cgroup メモリと CPU の制限を読み取り、最適なヒープ サイズ設定と GC フラグを自動的に選択します。
このツールを使用するには、 java コマンドをコンテナーの起動コマンドの jaz に置き換えます。 このツールは、Microsoft Build of OpenJDKのコンテナー イメージに含まれているため、追加のセットアップは必要ありません。
# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu
# Add your application.jar
COPY application.jar /application.jar
# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]
インストール オプション、サポートされている環境、構成の詳細については、Javaのコマンド ランチャー Azure参照してください。
次の手順
- Java コンテナー化戦略
- Java用Azureコマンド ランチャー
- Azure コンテナー ランタイム上の Jakarta EE
- Oracle WebLogic Server
- IBM WebSphere Liberty、Open Liberty、および従来の WebSphere