Protegendo Clusters do Kubernetes contra Vazamentos de Recursos

Descubra como evitar a instabilidade do sistema, protegendo os clusters do Kubernetes que você criou usando o Kubernetes Engine (OKE) de vazar recursos.

O plano de controle de um cluster do Kubernetes pode se tornar instável quando um aplicativo implantado no cluster aciona a criação de recursos não intencional ou não controlada. À medida que os recursos de computação e memória se esgotam, o desempenho e a disponibilidade do cluster são severamente impactados.

Para manter a disponibilidade de planos de controle, o Kubernetes Engine pode proteger os clusters criados com base em tal 'vazamento' de recursos usando um webhook de admissão de validação chamado oke-resource-leak-protection.cluster.com. Um webhook de admissão de validação é um callback HTTP que recebe uma solicitação de admissão do kube-apiserver e envia uma resposta para saber se o kube-apiserver deve ou não aceitar essa solicitação.

O webhook oke-resource-leak-protection.cluster.com mantém uma contagem de determinados tipos de objetos do Kubernetes no cluster. Quando o webhook recebe um pedido de admissão para a criação de um novo objeto de um determinado tipo, o webhook determina se a criação do objeto violaria um limite interno para objetos desse tipo.

Por padrão, o Kubernetes Engine cria o webhook oke-resource-leak-protection.cluster.com em clusters que têm dez ou menos nós de trabalho. O webhook:

  • rejeita solicitações para criar pods adicionais, se o número total de pods no cluster exceder 10.000
  • rejeita solicitações para criar segredos adicionais, se o número total de segredos no cluster exceder 2.000

Quando o webhook oke-resource-leak-protection.cluster.com rejeita solicitações para criar objetos, ele emite uma mensagem de erro explicando por que a solicitação de criação foi rejeitada, semelhante à seguinte:

Error from server: error when creating "nginx-pod.yaml": admission webhook "oke-resource-leak-protection.cluster.com" denied the request: OKE resource leak protection was engaged. Cluster has 10000 pods and the limit is 10000. See documentation for details.

A mensagem de erro informa sobre um possível vazamento de recursos. Se você vir esta mensagem, recomendamos que tome as medidas apropriadas antes que a disponibilidade do plano de controle do cluster seja afetada. Por exemplo:

  • Se as solicitações de criação de objetos adicionais não forem o que você pretendia, examine o código do aplicativo para identificar e tratar a causa do vazamento de recursos.
  • Se as solicitações adicionais de criação de objeto forem o que você pretendia, desative a detecção de vazamento de recurso padrão e o webhook de validação de admissão (consulte Desativando a detecção de vazamento de recurso padrão).

Como alternativas para (ou além) usar o webhook oke-resource-leak-protection.cluster.com para controlar a criação de objetos, você também pode proteger clusters contra vazamentos de recursos:

Desativando a detecção de vazamento de recursos padrão

Para desativar a detecção de vazamento de recursos e o webhook de validação padrão do Kubernetes Engine:

  1. Altere o valor da anotação Managed no oke-resource-leak-protection ConfigMap para especificar que você não deseja que o webhook de admissão de validação padrão limite o número de objetos no cluster, digitando:

    kubectl -n kube-system  annotate --overwrite configmap oke-resource-leak-protection Managed='false' 
  2. Remova o webhook de validação padrão inserindo:

    kubectl delete validatingwebhookconfiguration oke-resource-leak-protection.oke.com

Reativando a detecção de vazamento de recursos

Para reativar a detecção de vazamento de recursos e o webhook de validação de admissão, ter desativado anteriormente:

  1. Altere o valor da anotação Managed no oke-resource-leak-protection ConfigMap para especificar que você deseja que o webhook de admissão de validação padrão retome a limitação do número de objetos no cluster, digitando:

    kubectl -n kube-system  annotate --overwrite configmap oke-resource-leak-protection Managed='true'

    Se o webhook oke-resource-leak-protection.oke.com ainda não existir, ele será criado.