Como limpar jobs antigos do Kubernetes

0
43


Os trabalhos do Kubernetes criam pods repetidamente até que um número especificado de contêineres seja concluído com êxito. Os trabalhos geralmente são usados ​​com o mecanismo CronJob de nível superior que inicia automaticamente novos trabalhos em um agendamento recorrente.

O uso regular de Jobs e CronJobs geralmente resulta em um grande número de objetos restantes em seu cluster. Os trabalhos e seus pods são mantidos intencionalmente indefinidamente após a conclusão. Isso é para que você possa inspecionar o status do trabalho e recuperar seus registros no futuro. No entanto, muitos trabalhos concluídos poluem a saída do Kubectl quando você executa comandos como kubectl get pods qualquer kubectl get jobs. Isso pode dificultar o foco na atividade relevante.

Neste artigo, compartilharemos alguns métodos para limpar trabalhos antigos. Você poderá remover objetos redundantes de seu cluster, automaticamente ou sob demanda.

Limites de retenção do histórico do CronJob

A limpeza automática é compatível com trabalhos criados por um CronJob desde o Kubernetes v1.6. Esse método permite definir limites de exclusão separados para trabalhos concluídos e com falha.

Habilite a estratégia de limpeza configurando o spec.successfulJobsHistoryLimit S spec.failedJobsHistoryLimit campos em seu objeto CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

O CronJob mostrado acima reterá os objetos Job de suas 10 execuções com falha mais recentes, bem como das cinco execuções bem-sucedidas mais recentes.

Você terá no máximo 15 trabalhos antigos em seu cluster a qualquer momento. Esses 15 serão mantidos por tempo indeterminado. Eles só serão excluídos quando forem substituídos por um trabalho mais recente que termine com o mesmo status.

Os limites de histórico padrão do CronJob se aplicam quando você omite valores personalizados em seu manifesto. O Kubernetes normalmente retém três jobs bem-sucedidos e um job com falha. O valor 0 há suporte para excluir trabalhos imediatamente após o término, sem manter nenhum.

TTL de trabalhos concluídos

Os TTLs de trabalho são uma adição mais recente do Kubernetes que foi estabilizada na v1.23. Os TTLs são definidos diretamente em seus objetos de trabalho, portanto, você não precisa usar CronJobs. O TTL diz ao Kubernetes para matar o trabalho e seus pods após um tempo fixo, independentemente do status de conclusão do trabalho.

Você pode habilitar este mecanismo configurando o spec.ttlSecondsAfterFinished campo em seus objetos de trabalho:

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
spec:
  ttlSecondsAfterFinished: 300
  template:
    spec:
      containers:
        - name: demo-cron
          image: busybox:latest
          command: ["/bin/sh", "-c", "Job complete!"]

Se seu trabalho for definido como parte de um CronJob, certifique-se de aninhar o campo dentro do jobTemplate:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      ttlSecondsAfterFinished: 300
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

Os exemplos acima marcarão os trabalhos como elegíveis para exclusão cinco minutos (300 segundos) após a conclusão. Isso ocorre independentemente de o trabalho terminar em um estado Completo ou Com Falha.

As exclusões com base nesse mecanismo são gerenciadas por um controlador dedicado em seu cluster. O controlador monitora os objetos de trabalho, detecta quando um TTL expirou e, em seguida, toma medidas para limpar o trabalho afetado e seus recursos dependentes. Pode haver um pequeno atraso entre a expiração do TTL e a intervenção do controlador para decretar a exclusão.

Defina o TTL de um trabalho para 0 tornará você elegível para exclusão assim que terminar. Você deve considerar se isso é apropriado para cada uma de suas tarefas. Não manter nenhum histórico pode dificultar a depuração de problemas, pois você não poderá recuperar os logs do contêiner.

a ttlSecondsAfterFinished o campo é mutável. Você pode alterá-lo em trabalhos existentes a qualquer momento. No entanto, não é garantido que as modificações afetem execuções que já foram criadas. Estender o TTL de um trabalho ainda pode eliminar execuções que foram agendadas enquanto o valor antigo foi aplicado.

Exclusão manual de jobs

Você sempre pode excluir manualmente um trabalho usando o Kubectl. Primeiro, recupere sua lista de trabalhos:

$ kubectl get jobs
NAME                 COMPLETIONS   DURATION   AGE
demo-cron-27549499   1/1           2s         36s

próximo número em delete job comando com o nome do seu trabalho selecionado:

$ kubectl delete job demo-cron-27549499
job.batch "demo-cron-27549499" deleted

Isso removerá o trabalho e limpará os pods e outros objetos associados a ele.

Exclusões em lote sob demanda

Você pode limpar rapidamente vários trabalhos filtrando com seletores de campo. Aqui está um exemplo que removerá todos os trabalhos bem-sucedidos em seu namespace ativo:

$ kubectl delete jobs --field-selector status.successful=1
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

Isso é muito menos trabalhoso do que excluir trabalhos individuais em sequência.

Para remover todos os trabalhos associados a um CronJob específico, é melhor definir uma tag nesses trabalhos que identifique o CronJob pai. Defina a tag usando seu CronJob spec.jobTemplate.metadata.labels campo:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  jobTemplate:
    metadata:
      labels:
        cron-job: demo-cron
    spec:
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

Você pode excluir trabalhos criados por esta versão do demo-cron CronJob usando o seguinte comando:

$ kubectl delete jobs -l cron-job=demo-cron
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

Combinar este exemplo com um seletor de campo permite remover demo-cron raças que estão em um estado particular:

$ kubectl delete jobs -l cron-job=demo-cron --field-selector status.successful=0
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

Este comando remove trabalhos com falha que foram agendados pelo demo-cron CronJob.

Resumo

Os jobs do Kubernetes geralmente permanecem no cluster depois de concluídos. Esse comportamento permite que você recupere seus registros em momentos futuros arbitrários, mas rapidamente leva a um acúmulo excessivo de objetos.

Os CronJobs vêm com limites de retenção ativados por padrão e oferecem suporte a configurações separadas para execuções bem-sucedidas e com falha. Este deve ser seu mecanismo preferido para gerenciar trabalhos agendados. Outros tipos de trabalho são melhor configurados com um TTL que limpará os recursos automaticamente após um período de tempo fixo.

Embora o Kubernetes tenha historicamente mantido trabalhos antigos indefinidamente, agora é recomendado que você use o mecanismo TTL sempre que possível. Ter muitos trabalhos antigos em seu cluster pode causar degradação de desempenho, pois o plano de controle precisa monitorar os objetos e pods que eles criaram.