Kubernetes implementiert Cronjob, um regelmäßig Shell-Skripte auszuführen
Kubernetes Cronjob führt regelmäßig die Rolle von Shell-Skripten aus
Viele bestehende Tutorials erklären nur, wie man einen Befehl regelmäßig über Cronjob ausführt, aber bei der tatsächlichen Produktion und Verwendung von Cronjob, insbesondere wenn eine große Anzahl von Shell-Befehlen ausgeführt werden muss, kann es die Anforderungen oft nicht erfüllen. Durch Ausführen eines mit configmap verknüpften Shell-Skripts können Sie die Befehle im Shell-Skript flexibel anpassen und Cronjob erfüllen, um komplexere Shell-Befehle auszuführen.
Ein CronJob, der regelmäßig ein Shell-Skript in Kubernetes ausführt, hat viele Verwendungszwecke, wie zum Beispiel:
- Regelmäßige Wartung: CronJob kann so eingestellt werden, dass bestimmte Wartungsaufgaben regelmäßig durchgeführt werden, z. B. das Bereinigen alter Protokolldateien, das Aktualisieren von Datenbanken, das Verwalten von Indizes usw.
- Datensicherung und -wiederherstellung: Sie können einen CronJob erstellen, um die Datenbank oder das Dateisystem regelmäßig zu sichern und bei Bedarf Wiederherstellungsvorgänge durchzuführen.
- Periodische Datenverarbeitung: Wenn Ihr System regelmäßig Daten verarbeiten muss (z. B. jede Nacht), können Sie einen CronJob erstellen, um diese Aufgaben zu verarbeiten.
- Überwachung und Berichterstellung: CronJob kann regelmäßig Überwachungsaufgaben durchführen, z. B. die Überprüfung des Systemzustands oder die Erstellung von Berichten.
- Automatische Skalierung und Skalierung: Sie können CronJobs erstellen, die die Anzahl der ausgeführten Pods je nach Bedarf basierend auf der prognostizierten Systemlast automatisch nach oben oder unten skalieren.
- CronJob: Mit CronJob können Sie auch jede beliebige Aufgabe ausführen, die Sie zu einem bestimmten Zeitpunkt ausführen möchten.
1. Implementierungsprozess
1.1 Definieren Sie die Konfigurationskarte
cat <<EOF > script-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: script-configmap
data: #shell 脚本的命令,可以根据实际情况创建更复杂的命令
myscript.sh: |
#!/bin/bash
echo "Hello, Kubernetes!"
EOF
1.2 Cronjob definieren
cat <<EOF > my-cronjob.yaml
apiVersion: batch/v1 #kubernetes 1.21版本后请使用batch/v1,1.21前使用batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "*/1 * * * *" #每分钟执行一次
concurrencyPolicy: Allow #并发策略,允许并发运行
jobTemplate:
spec:
template:
spec:
volumes:
- name: script-volume
configMap:
name: script-configmap
containers:
- name: my-container
image: centos
volumeMounts:
- name: script-volume
mountPath: /scripts
command: ["/bin/bash", "/scripts/myscript.sh"]
restartPolicy: OnFailure
EOF
Häufig konfigurierte API-Parameter für Cronjob:
- spec.schedule: Scheduling, Pflichtfeld, gibt den Task-Laufzyklus an, das Format ist das gleiche wie bei Cron
- spec.jobTemplate: Jobvorlage, erforderliches Feld, gibt die auszuführende Aufgabe an, das Format ist das gleiche wie bei Job
- spec.startingDeadlineSeconds: Die Frist für den Start des Jobs (in Sekunden). Dieses Feld ist optional. Wenn die geplante Zeit aus irgendeinem Grund versäumt wird, wird der Job, der die Ausführungszeit versäumt hat, als fehlgeschlagen betrachtet. Wenn nicht angegeben, keine Frist
- spec.concurrencyPolicy: Parallelitätsrichtlinie, dieses Feld ist ebenfalls optional. Es gibt an, wie mit der gleichzeitigen Ausführung von Jobs umgegangen wird, die von Cron Job erstellt wurden. Es darf nur eine der folgenden Strategien angegeben werden:
a.Allow (Standard): Gleichzeitige Ausführung von Jobs
zulassen b.Forbid: Gleichzeitige Ausführung verbieten. Wenn die vorherige nicht abgeschlossen wurde, überspringen Sie die nächste direkt
c.Replace: Brechen Sie den aktuell ausgeführten Job ab und ersetzen Sie ihn durch einen neuen
Beachten Sie, dass die aktuelle Richtlinie nur auf Jobs angewendet werden kann, die von demselben Cron-Job erstellt wurden. Wenn mehrere Cron-Jobs vorhanden sind, dürfen die von ihnen erstellten Jobs immer gleichzeitig ausgeführt werden.
- spec.suspend: suspend, dieses Feld ist ebenfalls optional. Wenn der Wert auf „true“ gesetzt ist, werden alle nachfolgenden Ausführungen ausgesetzt. Es hat keine Auswirkungen auf Jobs, deren Ausführung bereits begonnen hat. Der Standardwert ist false
- spec.successfulJobsHistoryLimit und .spec.failedJobsHistoryLimit: Verlaufslimit, ist ein optionales Feld. Sie geben an, wie viele abgeschlossene und fehlgeschlagene Jobs beibehalten werden können
1.3 Überprüfen Sie, ob der Cronjob korrekt läuft
#查看cronjob状态
kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
my-cronjob */5 * * * * False 2 19s 23m
#查看job状态
kubectl get jobs
NAME COMPLETIONS DURATION AGE
my-cronjob-28096067 1/1 34s 3m38s
my-cronjob-28096068 1/1 34s 2m38s
my-cronjob-28096069 1/1 34s 98s
#查看pod状态
kubectl get po
NAME READY STATUS RESTARTS AGE
my-cronjob-28096067-qxtqg 0/1 Completed 0 5m54s
my-cronjob-28096068-7scqd 0/1 Completed 0 4m54s
my-cronjob-28096069-gtlzg 0/1 Completed 0 3m54s