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
ミリコアまでの値は、単一のプロセッサ マシンとして識別されます。 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 コンテナー ランタイム上の Jakarta EE
- Oracle WebLogic Server
- IBM WebSphere Liberty、Open Liberty、および従来の WebSphere