Uw Java-toepassingen in een container plaatsen voor Kubernetes

In dit artikel wordt beschreven hoe u uw Java-toepassingen kunt containeriseren voor implementatie in Kubernetes.

Zie Containerize uw Java-toepassingen voor hulp bij containergeheugen, JVM-heapgeheugen, garbagecollections (GCs) en vCPU-kernen.

De juiste VM-SKU voor de Kubernetes-knooppuntgroep bepalen

Bepaal of de Kubernetes-knooppuntgroep of -pools die beschikbaar zijn voor uw cluster, geschikt zijn voor het containergeheugen en de vCPU-kernen die u wilt gebruiken. Als de knooppuntgroep de toepassing kan hosten, gaat u verder. Anders richt u een knooppuntgroep in die geschikt is voor de hoeveelheid containergeheugen en het aantal vCPU-kernen dat u wilt instellen.

Houd er rekening mee dat de kosten van een VM-SKU evenredig zijn met het aantal kernen en de hoeveelheid geheugen. Nadat u uw beginpunt hebt bepaald in termen van vCPU's en geheugen voor één containerinstantie, bepaalt u of u alleen aan de behoeften van uw toepassing kunt voldoen door alleen horizontaal te schalen. Voor betrouwbare, always-on systemen moet minimaal twee replica's beschikbaar zijn. Schaal naar behoefte omhoog en uit.

CPU-aanvragen en -limieten instellen

Als u de CPU moet beperken, moet u ervoor zorgen dat u dezelfde waarde toepast voor zowel limits als requests in het implementatiebestand. De JVM past de runtime niet dynamisch aan, zoals de GC en andere threadpools. De JVM leest het aantal processors dat alleen beschikbaar is tijdens het opstarten.

Tip

Stel dezelfde waarde in voor CPU-aanvragen en CPU-limieten.

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

Inzicht in beschikbare JVM-processors

Wanneer de HotSpot JVM in OpenJDK identificeert dat deze in een container wordt uitgevoerd, worden waarden gebruikt zoals cpu_quota en cpu_period om te bepalen hoeveel processors er beschikbaar zijn. Over het algemeen wordt elke waarde tot 1000m millicores geïdentificeerd als één processormachine. Elke waarde tussen 1001m en 2000m wordt geïdentificeerd als een dubbele processormachine, enzovoort. Deze informatie is beschikbaar via de API Runtime.getRuntime().availableProcessors(). Deze waarde kan ook worden gebruikt door een aantal gelijktijdige pc's om de threads te configureren. Andere API's, bibliotheken en frameworks kunnen deze informatie ook gebruiken om threadgroepen te configureren.

Kubernetes CPU-quota zijn gerelateerd aan de hoeveelheid tijd die een proces in de CPU besteedt, en niet het aantal CPU's dat beschikbaar is voor het proces. Runtimes met meerdere threads, zoals de JVM, kunnen nog steeds meerdere processors tegelijk gebruiken, met meerdere threads. Zelfs als een container een limiet van één vCPU heeft, kan de JVM worden geïnstrueerd om twee of meer beschikbare processors te zien.

Als u de JVM wilt informeren over het exacte aantal processors dat moet worden weergegeven in een Kubernetes-omgeving, gebruikt u de volgende JVM-vlag:

-XX:ActiveProcessorCount=N

Geheugenaanvraag en -limieten instellen

Stel de geheugenlimieten in op de hoeveelheid die u eerder hebt bepaald. Zorg ervoor dat het aantal geheugenlimieten het containergeheugen is en NIET de JVM heap-geheugenwaarde.

Tip

Stel de geheugenaanvragen in die gelijk zijn aan de geheugenlimieten.

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

De JVM-argumenten instellen in het implementatiebestand

Vergeet niet om het heapgeheugen van de JVM in te stellen op de hoeveelheid die u eerder hebt bepaald. We raden u aan deze waarde door te geven als een omgevingsvariabele, zodat u deze eenvoudig kunt wijzigen zonder dat u de containerinstallatiekopieën opnieuw hoeft te bouwen.

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

Volgende stappen