Containerizzare le applicazioni Java per Kubernetes
Questo articolo descrive come inserire in contenitori le applicazioni Java per la distribuzione in Kubernetes.
Per indicazioni sulla memoria del contenitore, la memoria heap JVM, i Garbage Collector e i core vCPU, vedere Containerize your Java applications (Containerize your Java applications).
Determinare lo SKU di macchina virtuale appropriato per il pool di nodi Kubernetes
Determinare se il pool di nodi o i pool di nodi Kubernetes disponibili per il cluster possono adattarsi alla memoria del contenitore e ai core vCPU che si intende usare. Se il pool di nodi può ospitare l'applicazione, continuare. In caso contrario, effettuare il provisioning di un pool di nodi appropriato per la quantità di memoria del contenitore e il numero di core vCPU di destinazione.
Tenere presente che il costo di uno SKU di macchina virtuale è proporzionale al numero di core e alla quantità di memoria. Dopo aver determinato il punto di partenza in termini di vCPU e memoria per un'istanza del contenitore, determinare se è possibile soddisfare le esigenze dell'applicazione solo ridimensionando orizzontalmente. Per i sistemi always-on affidabili, è necessario che siano disponibili almeno due repliche. Aumentare e aumentare le prestazioni in base alle esigenze.
Impostare richieste e limiti della CPU
Se è necessario limitare la CPU, assicurarsi di applicare lo stesso valore sia per che limits
requests
nel file di distribuzione. La JVM non regola in modo dinamico il runtime, ad esempio GC e altri pool di thread. La JVM legge il numero di processori disponibili solo durante l'avvio.
Suggerimento
Impostare lo stesso valore per le richieste cpu e i limiti della CPU.
containers:
- image: myimage
name: myapp
resources:
limits:
cpu: "2"
requests:
cpu: "2"
Informazioni sui processori disponibili per JVM
Quando la JVM HotSpot in OpenJDK identifica che è in esecuzione all'interno di un contenitore, usa valori come cpu_quota
e cpu_period
per determinare il numero di processori disponibili. In generale, qualsiasi valore fino a 1000m
millicores viene identificato come una singola macchina a processore. Qualsiasi valore tra 1001m
e 2000m
viene identificato come un computer a doppio processore e così via. Queste informazioni sono disponibili tramite l'API Runtime.getRuntime().availableProcessors(). Questo valore può essere usato anche da alcuni controller di dominio simultanei per configurare i thread. Altre API, librerie e framework possono usare queste informazioni anche per configurare i pool di thread.
Le quote della CPU Kubernetes sono correlate alla quantità di tempo usata da un processo nella CPU e non al numero di CPU disponibili per il processo. I runtime multithread, ad esempio la JVM, possono comunque usare più processori contemporaneamente, con più thread. Anche se un contenitore ha un limite di una vCPU, la JVM può essere incaricata di visualizzare due o più processori disponibili.
Per informare la JVM del numero esatto di processori visualizzati in un ambiente Kubernetes, usare il flag JVM seguente:
-XX:ActiveProcessorCount=N
Impostare i limiti e le richieste di memoria
Impostare i limiti di memoria sulla quantità determinata in precedenza. Assicurarsi che il numero di limiti di memoria sia la memoria del contenitore e NON il valore di memoria heap JVM.
Suggerimento
Impostare le richieste di memoria uguali ai limiti di memoria.
containers:
- name: myimage
image: myapp
resources:
limits:
memory: "4Gi"
requests:
memory: "4Gi"
Impostare gli argomenti JVM nel file di distribuzione
Ricordarsi di impostare la memoria dell'heap JVM sulla quantità determinata in precedenza. È consigliabile passare questo valore come variabile di ambiente in modo da poterlo modificare facilmente senza dover ricompilare l'immagine del contenitore.
containers:
- name: myimage
image: myapp
env:
- name: JAVA_OPTS
value: "-XX:+UseParallelGC -XX:MaxRAMPercentage=75"
Passaggi successivi
- Strategie di containerizzazione Java
- Jakarta edizione Enterprise nei runtime dei contenitori di Azure
- Oracle WebLogic Server
- IBM WebSphere Liberty, Open Liberty e WebSphere tradizionale