Kubernetes 用に Java アプリケーションをコンテナー化する

この記事では、Kubernetes でデプロイメント用に Java アプリケーションをコンテナー化する方法について説明します

コンテナー メモリ、JVM ヒープ メモリ、ガベージ コレクター (GC)、および vCPU コアに関するガイダンスについては、「Java アプリケーションをコンテナー化する」を参照してください。

Kubernetes ノード プールに適した VM SKU を決定する

クラスターで使用できる Kubernetes ノード プールが、使用するコンテナー メモリと vCPU コアに適合できるかどうかを判断します。 ノード プールがアプリケーションをホストできる場合は、続行します。 それ以外の場合は、コンテナー メモリの量とターゲットとする vCPU コアの数に適したノード プールをプロビジョニングします。

VM SKU のコストは、コアの数とメモリの量に比例します。 1 つのコンテナー インスタンスの vCPU とメモリの観点から開始点を決定した後、水平方向のスケーリングのみでアプリケーションのニーズを満たすことができるかどうかを判断します。 信頼性の高い常時接続システムの場合は、少なくとも 2 つのレプリカを使用できる必要があります。 必要に応じてスケール アップとスケール アウトを行います。

CPU の要求と制限を設定する

CPU を制限する必要がある場合は、デプロイ ファイルの limitsrequests の両方に同じ値を適用してください。 JVM では、GC やその他のスレッド プールなどのランタイムを動的に調整しません。 JVM は、起動時にのみ使用可能なプロセッサの数を読み取ります。

ヒント

CPU 要求と CPU 制限に同じ値を設定します。

containers:
- image: myimage
  name: myapp
  resources:
    limits:
      cpu: "2"
    requests:
      cpu: "2"

JVM で使用可能なプロセッサについて

OpenJDK の HotSpot JVM がコンテナー内で実行されていることを識別すると、cpu_quotacpu_period のような値を使用して使用可能なプロセッサの数を決定します。 一般に、1000m ミリコアまでの値は 1 つのプロセッサ マシンとして識別されます。 1001m2000m の間の値は、デュアル プロセッサ マシンなどのように識別されます。 この情報は、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"

次のステップ