Executando tarefas automatizadas com CronJob
Esta página mostra como executar tarefas automatizadas usando o objeto CronJob no kubernetes.
Antes de você começar
Você precisa ter um cluster do Kubernetes e a ferramenta de linha de comando kubectl deve estar configurada para se comunicar com seu cluster. É recomendado executar esse tutorial em um cluster com pelo menos dois nós que não estejam atuando como hosts de camada de gerenciamento. Se você ainda não possui um cluster, pode criar um usando o minikube ou pode usar um dos seguintes ambientes:
Criando um CronJob
Cron jobs requerem um arquivo de configuração. Aqui está um manifesto para CronJob que executa uma tarefa de demonstração simples a cada minuto:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Execute o exemplo de CronJob usando o seguinte comando:
kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml
A saída é semelhante a esta:
cronjob.batch/hello created
Após criar o cron job, obtenha o status usando este comando:
kubectl get cronjob hello
A saída é semelhante a esta:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 10s
Como você pode ver pelos resultados do comando, o cron job ainda não agendou ou executou uma tarefa ainda. Observe que a tarefa será criada em cerca de um minuto:
kubectl get jobs --watch
A saída é semelhante a esta:
NAME COMPLETIONS DURATION AGE
hello-4111706356 0/1 0s
hello-4111706356 0/1 0s 0s
hello-4111706356 1/1 5s 5s
Agora você viu uma tarefa em execução agendada pelo cron job "hello". Você pode parar de observá-lo e visualizar o cron job novamente para ver que ele agendou a tarefa:
kubectl get cronjob hello
A saída é semelhante a esta:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 50s 75s
Você deve ver que o cron job hello
agendou uma tarefa com sucesso no tempo especificado em
LAST SCHEDULE
. Existem atualmente 0 tarefas ativas, o que significa que a tarefa foi concluída ou falhou.
Agora, encontre os pods da última tarefa agendada criada e veja a saída padrão de um dos pods.
Nota:
O nome da tarefa é diferente do nome do pod.# Replace "hello-4111706356" with the job name in your system
pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items[*].metadata.name})
Veja os logs do pod:
kubectl logs $pods
A saída é semelhante a esta:
Fri Feb 22 11:02:09 UTC 2019
Hello from the Kubernetes cluster
Deletando um CronJob
Quando você não precisar mais de um cron job, exclua-o com kubectl delete cronjob <cronjob name>
:
kubectl delete cronjob hello
Excluindo o cron job remove todas as tarefas e pods que ele criou e impede a criação de novas tarefas. Você pode ler mais sobre como remover tarefas em garbage collection.