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 voor hulp bij containergeheugen, JVM heap-geheugen, garbagecollections (GCs) en vCPU-kernen Containerize uw Java-toepassingen.
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 op en breid uit naar behoefte.
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.
Fooi
Stel dezelfde waarde in voor CPU-aanvragen en CPU-limieten.
containers:
- image: myimage
name: myapp
resources:
limits:
cpu: "2"
requests:
cpu: "2"
Begrijp de beschikbare JVM-processors
Wanneer de HotSpot JVM in OpenJDK identificeert dat deze wordt uitgevoerd in een container, worden waarden zoals cpu_quota
en cpu_period
gebruikt om te bepalen hoeveel processors er beschikbaar zijn. Over het algemeen wordt elke waarde tot 1000m
millicores beschouwd als een computer met een enkele processor. Elke waarde tussen 1001m
en 2000m
wordt geïdentificeerd als een dubbele processormachine, enzovoort. Deze informatie is beschikbaar via de API Runtime.getRuntime().availableProcessors(). Sommige parallelle GCs kunnen deze waarde ook gebruiken om hun 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.
Fooi
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
- Java-containerisatiestrategieën
- Jakarta EE op Azure-container runtimes
- Oracle WebLogic Server
- IBM WebSphere Liberty, Open Liberty en traditionele WebSphere