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
- Strategieën voor Java-containerisatie
- Jakarta EE in Azure-containerruntimes
- Oracle WebLogic Server
- IBM WebSphere Liberty, Open Liberty en traditionele WebSphere