Compartir vía


Inclusión en contenedores de las aplicaciones Java para Kubernetes

En este artículo se describe cómo incluir en contenedores las aplicaciones Java para su implementación en Kubernetes.

Para obtener instrucciones sobre la memoria del contenedor, la memoria del montón de JVM, los recolectores de elementos no utilizados (GCs) y los núcleos de vCPU, consulte Containerize your Java applications (Containerize your Java applications).

Determinación de la SKU de máquina virtual adecuada para el grupo de nodos de Kubernetes

Determine si el grupo de nodos de Kubernetes o los grupos que están disponibles para el clúster pueden ajustarse a la memoria de contenedor y los núcleos de vCPU que quiere usar. Si el grupo de nodos puede hospedar la aplicación, continúe. De lo contrario, aprovisione un grupo de nodos adecuado para la cantidad de memoria del contenedor y el número de núcleos de vCPU que tenga como destino.

Tenga en cuenta que el costo de una SKU de máquina virtual es proporcional al número de núcleos y la cantidad de memoria. Después de determinar el punto de partida en términos de vCPU y memoria para una instancia de contenedor, determine si solo puede satisfacer las necesidades de la aplicación mediante el escalado horizontal. Para sistemas confiables y siempre activados, debe estar disponible un mínimo de dos réplicas. Escale y horizontalmente según sea necesario.

Establecimiento de solicitudes y límites de CPU

Si debe limitar la CPU, asegúrese de aplicar el mismo valor para y limitsrequests en el archivo de implementación. JVM no ajusta dinámicamente su tiempo de ejecución, como gc y otros grupos de subprocesos. JVM lee el número de procesadores disponibles solo durante el tiempo de inicio.

Sugerencia

Establezca el mismo valor para las solicitudes de CPU y los límites de CPU.

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

Descripción de los procesadores disponibles de JVM

Cuando HotSpot JVM en OpenJDK identifica que se ejecuta dentro de un contenedor, usa valores como cpu_quota y cpu_period para determinar cuántos procesadores están disponibles para él. En general, cualquier valor de hasta 1000m millicores se identifica como una sola máquina de procesador. Cualquier valor entre 1001m y 2000m se identifica como una máquina de procesador dual, etc. Esta información está disponible a través de LA API Runtime.getRuntime().availableProcessors(). Algunos de los GCs simultáneos también pueden usar este valor para configurar sus subprocesos. Otras API, bibliotecas y marcos también pueden usar esta información para configurar grupos de subprocesos.

Las cuotas de CPU de Kubernetes están relacionadas con la cantidad de tiempo que un proceso pasa en la CPU y no el número de CPU disponibles para el proceso. Los entornos de ejecución multiproceso, como JVM, pueden seguir usando varios procesadores simultáneamente, con varios subprocesos. Incluso si un contenedor tiene un límite de una vCPU, se puede indicar a JVM que vea dos o más procesadores disponibles.

Para informar al JVM del número exacto de procesadores que debe ver en un entorno de Kubernetes, use la siguiente marca JVM:

-XX:ActiveProcessorCount=N

Establecimiento de límites y solicitudes de memoria

Establezca los límites de memoria en la cantidad que haya determinado anteriormente. Asegúrese de que el número de límites de memoria es la memoria del contenedor y NO el valor de memoria del montón de JVM.

Sugerencia

Establezca las solicitudes de memoria iguales a los límites de memoria.

containers:
  - name: myimage
    image: myapp
    resources:
      limits:
        memory: "4Gi"
      requests:
        memory: "4Gi"

Establecimiento de los argumentos de JVM en el archivo de implementación

Recuerde establecer la memoria del montón de JVM en la cantidad que ha determinado anteriormente. Se recomienda pasar este valor como una variable de entorno para que pueda cambiarlo fácilmente sin necesidad de volver a generar la imagen de contenedor.

containers:
  - name: myimage
    image: myapp
    env:
    - name: JAVA_OPTS
      value: "-XX:+UseParallelGC -XX:MaxRAMPercentage=75"

Pasos siguientes