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

本文介绍如何容器化 Java 应用程序以在 Kubernetes 上进行部署。

有关容器内存、JVM 堆内存、垃圾回收器(GCs)和 vCPU 核心的指南,请参阅 容器化 Java 应用程序

确定 Kubernetes 节点池的相应 VM SKU

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

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

设置 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 的值都标识为单个处理器计算机。 介于 1001m2000m 者之间的任何值都标识为双处理器计算机,依此类推。 此信息可通过 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"

后续步骤