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:
- criando seus próprios webhooks de admissão de validação (consulte ValidatingAdmissionWebhook na documentação do Kubernetes)
- aplicando cotas de recursos do Kubernetes (consulte Cotas de Recursos na documentação do Kubernetes)
- aplicando políticas de validação de admissão do Kubernetes (consulte Validando a Política de Admissão na documentação do Kubernetes)
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:
-
Altere o valor da anotação
Managednooke-resource-leak-protectionConfigMap 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' -
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:
-
Altere o valor da anotação
Managednooke-resource-leak-protectionConfigMap 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.comainda não existir, ele será criado.