將適用於 Kubernetes 的 Java 應用程式容器化
本文說明如何將 Java 應用程式容器化,以在 Kubernetes 上部署。
如需容器記憶體、JVM 堆積記憶體、垃圾收集行程和 vCPU 核心的指引,請參閱 將 Java 應用程式容器化。
判斷 Kubernetes 節點集區的適當 VM SKU
判斷叢集可用的 Kubernetes 節點集區或集區是否符合您想要使用的容器記憶體和 vCPU 核心。 如果節點集區可以裝載應用程式,請繼續進行。 否則,請布建適用於容器記憶體數量和目標 vCPU 核心數目的節點集區。
請記住,VM SKU 的成本會與核心數目和記憶體數量成正比。 在判斷一個容器實例的 vCPU 和記憶體起點之後,請僅藉由水平調整來判斷您是否符合應用程式的需求。 針對可靠的 Always-On 系統,至少必須有兩個複本可供使用。 視需要相應增加和相應放大。
設定 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
millicores的值會識別為單一處理器電腦。 和 2000m
之間的1001m
任何值會識別為雙處理器計算機等等。 此資訊可透過 API Runtime.getRuntime()availableProcessors()取得。 某些並行 DC 可能也會使用此值來設定其線程。 其他 API、連結庫和架構也可以使用此資訊來設定線程集區。
Kubernetes CPU 配額與進程花費在 CPU 中的時間量有關,而不是進程可用的 CPU 數目。 多線程運行時間,例如 JVM 仍可同時使用多個處理器,並搭配多個線程。 即使容器有一個 vCPU 的限制,JVM 仍可指示查看兩個或多個可用的處理器。
若要通知 JVM 應該在 Kubernetes 環境中看到的確切處理器數目,請使用下列 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