Compartilhar via


Conteinerizar seus aplicativos Java para Kubernetes

Este artigo descreve como colocar em contêiner seus aplicativos Java para implantação no Kubernetes. Para obter diretrizes sobre memória de contêiner, memória de heap JVM, GCs (coletores de lixo) e núcleos de vCPU, consulte Conteinerizar seus aplicativos Java.

Determinar a SKU de VM apropriada para o pool de nós de Kubernetes

Determine se o pool de nós do Kubernetes ou os pools disponíveis para o cluster podem se ajustar à memória do contêiner e aos núcleos de vCPU que você pretende usar. Se o pool de nós puder hospedar o aplicativo, continue. Caso contrário, provisione um pool de nós apropriado para a quantidade de memória do contêiner e o número de núcleos de vCPU que você pretende utilizar.

Tenha em mente que o custo de um SKU de VM é proporcional ao número de núcleos e à quantidade de memória. Depois de determinar seu ponto de partida em termos de vCPUs e memória para uma instância de contêiner, determine se você pode atender às necessidades do aplicativo apenas dimensionando horizontalmente. Para sistemas confiáveis e sempre ativos, no mínimo duas réplicas devem estar disponíveis. Expandir vertical e horizontal conforme necessário.

Definir solicitações e limites da CPU

Se você precisar limitar a CPU, aplique o mesmo valor para limits e requests no arquivo de implantação. A JVM não ajusta dinamicamente seu runtime, como o GC e outros pools de threads. A JVM lê o número de processadores disponíveis somente durante o tempo de inicialização.

Dica

Defina o mesmo valor para solicitações de CPU e limites de CPU.

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

Entender os processadores disponíveis para JVM

Quando a JVM do HotSpot no OpenJDK identifica que está em execução dentro de um contêiner, ela usa valores como cpu_quota e cpu_period para determinar quantos processadores estão disponíveis para ele. Em geral, qualquer valor até 1000m milicores é identificado como uma máquina de processador único. Qualquer valor entre 1001m e 2000m é identificado como um computador processador duplo e assim por diante. Essas informações estão disponíveis por meio da API Runtime.getRuntime().availableProcessors(). Alguns dos GCs simultâneos também podem usar esse valor para configurar seus threads. Outras APIs, bibliotecas e estruturas também podem usar essas informações para configurar pools de threads.

As cotas de CPU do Kubernetes estão relacionadas à quantidade de tempo que um processo gasta na CPU e não ao número de CPUs disponíveis para o processo. Runtimes multi-threaded, como a JVM, ainda podem usar vários processadores simultaneamente, com vários threads. Mesmo que um contêiner tenha um limite de uma vCPU, a JVM poderá ser instruída a ver dois ou mais processadores disponíveis.

Para informar a JVM do número exato de processadores que ele deve ver em um ambiente do Kubernetes, use o seguinte sinalizador JVM:

-XX:ActiveProcessorCount=N

Definir a solicitação de memória e os limites

Defina os limites de memória para a quantidade que você determinou anteriormente. Verifique se o número de limites de memória é a memória do contêiner e não o valor de memória de heap JVM.

Dica

Defina as solicitações de memória iguais aos limites de memória.

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

Definir os argumentos JVM no arquivo de implantação

Lembre-se de definir a memória do heap da JVM para o valor que você determinou anteriormente. Recomendamos que você passe esse valor como uma variável de ambiente para que você possa alterá-lo facilmente sem a necessidade de recompilar a imagem do contêiner.

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

Próximas etapas