Udostępnij za pomocą


Konteneryzowanie aplikacji Java dla platformy Kubernetes

W tym artykule opisano sposób konteneryzowania aplikacji Java na potrzeby wdrażania na platformie Kubernetes. Aby uzyskać wskazówki dotyczące pamięci kontenera, pamięci sterty JVM, kolektorów pamięci (GCs) i rdzeni vCPU, zobacz Konteneryzacja aplikacji Java.

Określanie odpowiedniego SKU maszyny wirtualnej dla puli węzłów Kubernetes

Ustal, czy dostępne dla klastra pule węzłów Kubernetes mogą pomieścić pamięć kontenera i rdzenie procesorów wirtualnych, które zamierzasz użyć. Jeśli pula węzłów może hostować aplikację, kontynuuj. W przeciwnym razie skonfiguruj pulę węzłów odpowiednią do ilości pamięci kontenera i liczby rdzeni procesorów wirtualnych, które są docelowe.

Należy pamiętać, że koszt jednostki SKU maszyny wirtualnej jest proporcjonalny do liczby rdzeni i ilości pamięci. Po określeniu punktu początkowego pod względem wirtualnych procesorów i pamięci dla jednego wystąpienia kontenera sprawdź, czy potrzeby aplikacji można spełnić tylko poprzez skalowanie poziome. W przypadku niezawodnych systemów zawsze włączonych muszą być dostępne co najmniej dwie repliki. Skalowanie w górę i w poziomie zgodnie z potrzebami.

Ustaw żądania i limity CPU

Jeśli musisz ograniczyć CPU, upewnij się, że zastosowano tę samą wartość dla limits i requests w pliku wdrożenia. JVM nie dostosowuje dynamicznie swojego czasu wykonywania, na przykład GC i innych pul wątków. JVM odczytuje liczbę procesorów dostępnych tylko w czasie uruchamiania.

Wskazówka

Ustaw tę samą wartość dla żądań CPU i limitów procesora.

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

Omówienie dostępnych procesorów JVM

Gdy funkcja JVM hotSpot w zestawie OpenJDK identyfikuje, że działa wewnątrz kontenera, używa wartości, takich jak cpu_quota i cpu_period do określenia, ile procesorów jest dostępnych. Ogólnie rzecz biorąc, każda wartość do 1000m milicory jest uznawana za maszynę z jednym procesorem. Każda wartość między 1001m i 2000m jest identyfikowana jako maszyna z podwójnym procesorem itd. Te informacje są dostępne za pośrednictwem interfejsu API Runtime.getRuntime().availableProcessors(). Niektóre współbieżne kontrolery domeny mogą również używać tej wartości do konfigurowania ich wątków. Inne interfejsy API, biblioteki i struktury mogą również używać tych informacji do konfigurowania pul wątków.

Limity przydziału procesora KUBernetes są związane z ilością czasu spędzanego przez proces w procesorze CPU, a nie liczbą procesorów dostępnych dla tego procesu. Środowiska uruchomieniowe wielowątowe, takie jak JVM, mogą nadal używać wielu procesorów jednocześnie z wieloma wątkami. Nawet jeśli kontener ma limit jednego procesora wirtualnego, maszyna wirtualna JVM może być poinstruowana, aby wyświetlić co najmniej dwa dostępne procesory.

Aby poinformować maszynę wirtualną JVM o dokładnej liczbie procesorów, które powinny być widoczne w środowisku Kubernetes, użyj następującej flagi JVM:

-XX:ActiveProcessorCount=N

Ustawianie żądań i limitów pamięci

Ustaw limity pamięci na określoną wcześniej ilość. Upewnij się, że liczba limitów pamięci to pamięć kontenera, a nie wartość pamięci stertowej JVM.

Wskazówka

Ustaw żądania pamięci równe limitom pamięci.

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

Ustawianie argumentów JVM w pliku wdrożenia

Pamiętaj, aby ustawić pamięć stert JVM na wcześniej określoną wartość. Zalecamy przekazanie tej wartości jako zmiennej środowiskowej, aby można było ją łatwo zmienić bez konieczności ponownego kompilowania obrazu kontenera.

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

Dalsze kroki