System Administration Question #019e3a4f
Vamos supor que uma organização precisa processar grandes quantidades de dados em rajadas, em um cluster Kubernetes baseado em nuvem. Por exemplo: toda segunda-feira de manhã, eles precisam executar um lote de 1000 jobs computacionais de 1 hora cada, e esses jobs devem ser concluídos até segunda-feira à noite. Qual será o método mais econômico?
Executar um grupo de nós com o tamanho exato necessário para concluir o lote no prazo e usar uma combinação de taints, tolerations e nodeSelectors para reservar esses nós para os jobs em lote.
Aproveitar o Kubernetes Cluster Autoscaler para iniciar e parar nós automaticamente conforme necessário.
Comprometer-se com um nível específico de gastos para obter preços com desconto (com, por exemplo, "instâncias reservadas" ou mecanismos similares).
Usar PriorityClasses para que o job semanal em lote tenha prioridade sobre outras cargas de trabalho em execução no cluster e possa ser concluído no prazo.
Official Explanation / Community Explanations
O método mais econômico para lidar com cargas de trabalho em rajada em um cluster Kubernetes baseado em nuvem é usar o Kubernetes Cluster Autoscaler para iniciar e parar nós automaticamente conforme necessário. Essa abordagem ajusta dinamicamente o tamanho do cluster com base nos pods pendentes, garantindo que os recursos sejam provisionados apenas quando necessário e reduzidos durante períodos ociosos, minimizando custos.
Como Funciona
O Cluster Autoscaler monitora o status de agendamento dos pods. Quando os pods não podem ser agendados devido a recursos insuficientes, ele aciona a API do provedor de nuvem para adicionar novos nós. Por outro lado, quando os nós estão subutilizados por um período configurável, ele os remove. Isso alinha o consumo de recursos com a demanda real, eliminando desperdícios de superprovisionamento.
Por que a Resposta Correta está Certa
- Eficiência de Custos: O Cluster Autoscaler garante que os nós existam apenas quando necessário. Para o cenário de rajada, os nós serão adicionados na segunda-feira de manhã para lidar com os 1000 jobs e removidos após a conclusão, evitando cobranças por recursos ociosos.
- Automação: Nenhuma intervenção manual é necessária; o autoscaler reage automaticamente às mudanças na carga de trabalho.
- Integração Nativa com Nuvem: Funciona com os principais provedores de nuvem (AWS, GCP, Azure) e respeita tipos de instância, zonas e políticas de escalonamento.
Por que as Respostas Incorretas estão Erradas
- Executar um grupo de nós com o tamanho exato necessário usando taints, tolerations e nodeSelectors: Essa abordagem requer dimensionamento e provisionamento manuais. Se a carga de trabalho variar ou a estimativa estiver errada, os recursos podem ser desperdiçados ou insuficientes. Também carece de escalonamento dinâmico, levando a possível superprovisionamento.
- Comprometer-se com um nível específico de gastos com instâncias reservadas: Instâncias reservadas oferecem descontos para cargas de trabalho estáveis, mas são inflexíveis. Para cargas de trabalho em rajada, você paga por capacidade que fica ociosa a maior parte da semana, tornando-se antieconômico.
- Usar PriorityClasses para dar prioridade aos jobs em lote: PriorityClasses afetam a ordem de agendamento, mas não adicionam ou removem nós. Se o cluster não tiver capacidade, os pods de alta prioridade podem permanecer pendentes. Isso não aborda o provisionamento de recursos e pode levar a jobs incompletos ou preempção de outras cargas de trabalho sem economia de custos.