Kubernetes Oomkilled

Kubernetes Oomkilled
Quando o Kubernetes funciona, é incrível, mas quando não, como quando o seu aplicativo trava devido a preocupações com a memória, você deve saber como solucionar com o Oomkilled. Se você trabalhou com Kubernetes antes, quase certamente encontrou o erro Oomkilled. Se você não entende como funciona, depurar pode ser uma experiência frustrante. Veremos o problema Oomkilled com mais detalhes nesta postagem.

Pré -requisito

Para usar os serviços Kubernetes, você precisará de um cluster Minikube. Você terá que configurar um cluster Minikube em seu sistema para fazer com que essa técnica funcione. Para configurar um cluster Minikube, use o terminal da linha de comando. Pode ser usado de duas maneiras. Procure "Terminal" na seção de pesquisa de programas do seu sistema. Ctrl+alt+t é um atalho de teclado que pode ser usado para isso:

Pelo menos 300 mib de memória devem estar disponíveis em cada nó em seu cluster. Você precisará ter o serviço de métricas-servidores em execução em seu cluster para algumas tarefas nesta página. Você pode pular essas etapas se o servidor das métricas já estiver funcionando. Agora, digite o seguinte comando anexado.

Agora use o comando anexado.

A resposta orienta as métricas.K8S.io se a API de métricas de recurso estiver acessível, conforme mostrado na captura de tela acima.

Etapas para criar um espaço para nome

Faça um espaço para nome para os recursos que você criará aqui para separá -los do restante do seu cluster.

Um novo pod é formado, como você pode ver abaixo.

Forneça os recursos: solicitações de campo no manifesto do recurso do contêiner para definir uma solicitação de memória. Inclua recursos: limites para definir um limite de RAM. Você vai projetar uma vagem com um contêiner. O contêiner tem uma solicitação de memória de 100 MIB e um limite de memória de 200 MIB. O arquivo de configuração do pod é o seguinte:

Quando o contêiner inicia, a seção Args do arquivo de configuração fornece seus parâmetros. As opções “-vm-bytes” e “150m” instruem o contêiner a alocar 150 mib.

Abaixo você pode ver que criamos o pod:

Este comando verificará se o contêiner de pod está em funcionamento:

De acordo com o resultado, o recipiente único do pod tem uma solicitação de memória de 100 MIB e um limite de memória de 200 MIB.

Para obter as métricas do pod, execute o comando Kubectl Top.

Como o limite de memória de um contêiner pode ser excedido?

Se o nó parecer ter memória suficiente, um contêiner pode superar sua solicitação de memória. Por outro lado, um contêiner não pode usar mais memória do que tem. Se um contêiner tiver mais memória do que atribuído, ele será encerrado. O contêiner será removido se continuar a usar a memória sobre seu limite. O Kubelet reinicia um contêiner terminado, se puder ser retomado, como qualquer outra forma de falha de tempo de execução.

Aqui vamos criar uma vagem. Este pod vai tentar alocar mais memória do que já tem.

O arquivo de configuração de um pod com um contêiner e uma solicitação de memória de 50 MIB e um limite de memória de 100 MIB é o seguinte:

De acordo com a seção Args do arquivo de configuração, o contêiner tentará alocar 250 MIB da RAM, significativamente acima do limite de 100 MIB.

Novamente, criamos o pod aqui.

Aqui você pode ver as informações abrangentes do pod. O contêiner está funcionando ou não neste momento. A repetição do comando anterior até que o contêiner seja morto é necessário:

Veja mais detalhadamente o status do contêiner. De acordo com a saída, o contêiner foi destruído porque ficou sem memória.

Neste exemplo, o kubelet reinicia o recipiente porque pode ser reiniciado. Repita este comando várias vezes para garantir que o contêiner seja morto e reiniciado regularmente. De acordo com a saída, o contêiner é morto, restaurado, morto novamente, iniciado novamente, etc.

O comando a seguir permite visualizar informações abrangentes relacionadas à história da vagem.

O resultado revela que o contêiner começa constantemente e para:

Aqui você pode ver as informações detalhadas sobre os nós do seu cluster:

Um registro do contêiner sendo morto devido a um problema fora da memória está incluído na saída:

Este comando exclui o pod, como você pode ver abaixo.

O que você deve fazer se tiver uma solicitação de memória que seja muito grande para seus nós?

Solicitações e limitações de memória geralmente estão ligadas a recipientes, mas também é útil pensar nos pods como tendo solicitações e restrições de memória. A solicitação de memória é definida como o total de todas as necessidades de memória para todos os contêineres na vagem.
As vagens são agendadas e mantidas por meio de solicitações.

Aqui vamos construir uma vagem com uma solicitação de memória maior do que qualquer nó na capacidade do seu cluster.

Aqui está o arquivo de configuração para um pod, incluindo um contêiner e uma necessidade de memória de 1000 gib, que provavelmente é mais do que qualquer nó em seu cluster pode gerenciar.

O comando Apply Apply seguinte cria o pod, como você pode ver.

Agora use o comando 'Get Pod'. O status da vagem está pendente (consulte a saída). O pod não está pronto para ser executado em nenhum nó e permanecerá pendente indefinidamente.

Este comando ajudará você a visualizar mais detalhes sobre o pod, incluindo os próximos eventos:

A saída demonstra que o contêiner não pode ser agendado porque os nós não têm memória suficiente:

O que acontece se você não especificar um limite de memória?

Um dos seguintes cenários ocorre se você não definir um limite de memória para um contêiner:

  • O contêiner não tem limite de quanto aríete pode utilizar. O assassino da OOM poderia ser acionado se o contêiner consumir toda a memória disponível no nó onde está sendo executado. Além disso, o Acontainer sem restrições de recursos terá um risco maior de ser morto no caso de uma matança de OOM.
  • O contêiner é executado em um espaço de nome com um limite de memória padrão e o limite padrão é aplicado ao contêiner automaticamente. Os administradores de cluster podem usar um limitrange para definir um número padrão para o limite de memória.

Conclusão:

Demos uma olhada mais de perto o erro de Kubernetes Oomkilled neste artigo. Ajuda a Kubernetes no gerenciamento da memória enquanto agende vagens e decidindo quais pods destruir quando os recursos se tornam escassos.