Kontejnerizace aplikací v Javě pro Kubernetes

Tento článek popisuje, jak kontejnerizovat aplikace Java pro nasazení v Kubernetes.

Pokyny k paměti kontejneru, paměti haldy JVM, paměti uvolňování paměti (GC) a jader vCPU najdete v tématu Kontejnerizace aplikací v Javě.

Určení příslušné skladové položky virtuálního počítače pro fond uzlů Kubernetes

Určete, jestli fond uzlů Kubernetes nebo fondy, které jsou pro váš cluster dostupné, odpovídají paměti kontejneru a jádrům virtuálních procesorů, které chcete použít. Pokud fond uzlů může hostovat aplikaci, pokračujte dál. Jinak zřiďte fond uzlů, který je vhodný pro velikost paměti kontejneru a počet jader vCPU, na která cílíte.

Mějte na paměti, že náklady na skladovou položku virtuálního počítače jsou úměrné počtu jader a množství paměti. Jakmile určíte výchozí bod z hlediska virtuálních procesorů a paměti pro jednu instanci kontejneru, určete, jestli můžete vyhovět potřebám vaší aplikace pouze horizontálním škálováním. V případě spolehlivých systémů always-on musí být k dispozici minimálně dvě repliky. Podle potřeby vertikálně navyšte a navyšte kapacitu.

Nastavení požadavků a omezení procesoru

Pokud musíte omezit využití procesoru, ujistěte se, že použijete stejnou hodnotu pro oba limits i requests v souboru nasazení. Prostředí JVM dynamicky neupravuje svůj modul runtime, například GC a další fondy vláken. Prostředí JVM čte počet procesorů, které jsou k dispozici pouze během spouštění.

Tip

Nastavte stejnou hodnotu pro požadavky procesoru a omezení procesoru.

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

Vysvětlení dostupných procesorů JVM

Když hotSpot JVM v OpenJDK identifikuje, že běží uvnitř kontejneru, používá hodnoty, jako cpu_quota je a cpu_period k určení, kolik procesorů je k dispozici. Obecně platí, že jakákoli hodnota až 1000m milicores se identifikuje jako jeden procesorový počítač. Jakákoli hodnota mezi 1001m počítačem s duálním procesorem a 2000m tak dále je identifikována jako počítač s duálním procesorem. Tyto informace jsou k dispozici prostřednictvím rozhraní API Runtime.getRuntime().availableProcessors(). Tuto hodnotu mohou také použít některé souběžné řadiče zásad skupiny ke konfiguraci jejich vláken. Další rozhraní API, knihovny a architektury můžou tyto informace použít také ke konfiguraci fondů vláken.

Kvóty procesoru Kubernetes se vztahují k množství času stráveného procesem v procesoru, a ne počtu procesorů dostupných pro tento proces. Moduly runtime s více vlákny, jako je JVM, můžou současně používat více procesorů s více vlákny. I když má kontejner limit jednoho virtuálního procesoru, může být JVM instruován, aby viděl dva nebo více dostupných procesorů.

Pokud chcete informovat JVM o přesném počtu procesorů, které by se měl zobrazit v prostředí Kubernetes, použijte následující příznak JVM:

-XX:ActiveProcessorCount=N

Nastavení požadavků na paměť a omezení

Nastavte limity paměti na množství, které jste určili dříve. Ujistěte se, že číslo omezení paměti je paměť kontejneru a NE hodnota paměti haldy JVM.

Tip

Nastavte požadavky na paměť, které se rovnají limitům paměti.

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

Nastavení argumentů JVM v souboru nasazení

Nezapomeňte nastavit paměť haldy JVM na velikost, kterou jste určili dříve. Tuto hodnotu doporučujeme předat jako proměnnou prostředí, abyste ji mohli snadno změnit, aniž byste museli znovu sestavit image kontejneru.

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

Další kroky