容器化适用于 Kubernetes 的 Java 应用程序

本文介绍如何容器化 Java 应用程序以在 Kubernetes 上进行部署。 有关容器内存、JVM 堆内存、垃圾回收器(DC)和 vCPU 核心的指南,请参阅 容器化 Java 应用程序。

为 Kubernetes 节点池确定合适的 VM SKU

确定可用于群集的 Kubernetes 节点池或池是否适合要使用的容器内存和 vCPU 核心。 如果节点池可以托管应用程序,请继续。 否则,请预配一个适合容器内存量和目标 vCPU 内核数量的节点池。

VM SKU 的成本与核心数和内存量成正比。 确定一个容器实例的 vCPU 和内存的起点后,请确定仅通过水平缩放是否能够满足应用程序的需求。 对于可靠且始终可用的系统,必须至少提供两个副本。 根据需要纵向扩展和横向扩展。

设置 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()获取。 一些并发 GC 也可能使用此值来配置其线程。 其他 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 命令启动器简化 JVM 优化

前面的部分通过 JVM 标志手动设置处理器计数、堆大小和 GC。 如果不想维护这些设置,Java() 的 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"]

有关安装选项、支持的环境和配置详细信息,请参阅Azure命令启动器Java。

后续步骤