运行 Kubernetes 中 Pod 内的计划任务
Run scheduled task inside Pod in Kubernetes
我的 kubernetes 集群中有一个 influxdb 运行ning 的小实例。
该实例的数据存储在持久存储中。
但我也想 运行 按预定时间间隔从 influx 备份命令。
influxd backup -portable /backuppath
我现在做的是执行到 pod 中,然后手动 运行 它。
有没有办法让我自动执行此操作?
您可以考虑 运行 一个带有 bitnami kubectl 的 CronJob,它将执行备份命令。这与 exec into the pod and run
相同,只是现在您使用 CronJob 将其自动化。
您可以 运行 它作为一个 cronjob 并设置图像以能够连接到数据库,或者您可以将它与您的数据库 pod 放在一起,并将其设置为 运行 cron
图像(即 运行 作为一个 mostly-idle 容器与您的数据库在同一个 pod 中)
CronJob 是去这里的方法。它的行为或多或少像一个 crontab,但对于 Kubernetes。
作为示例,您可以使用这个
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: 0 8 * * *
jobTemplate:
spec:
template:
spec:
containers:
- name: influxdb-backup
image: influxdb
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args:
- "-c"
- "influxd backup -portable /backuppath"
restartPolicy: Never
这将创建一个作业,每天在 08:00 执行 influxd backup -portable /backuppath
。当然,您必须相应地对其进行编辑,才能在您的环境中工作。
这是我对这个问题使用的解决方案
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-backupscript
namespace: influx
data:
backupscript.sh: |
#!/bin/bash
echo 'getting pod name'
podName=$(kubectl get pods -n influx --field-selector=status.phase==Running --output=jsonpath={.items..metadata.name})
echo $podName
#echo 'create backup'
kubectl exec -it $podName -n influx -- /mnt/influxBackupScript/influxbackup.sh
echo 'done'
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: backup-cron
namespace: influx
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
volumes:
- name: backup-script
configMap:
name: cm-backupscript
defaultMode: 0777
containers:
- name: kubectl
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- /mnt/scripts/backupscript.sh
volumeMounts:
- name: backup-script
mountPath: "/mnt/scripts"
restartPolicy: Never
我的 kubernetes 集群中有一个 influxdb 运行ning 的小实例。
该实例的数据存储在持久存储中。
但我也想 运行 按预定时间间隔从 influx 备份命令。
influxd backup -portable /backuppath
我现在做的是执行到 pod 中,然后手动 运行 它。
有没有办法让我自动执行此操作?
您可以考虑 运行 一个带有 bitnami kubectl 的 CronJob,它将执行备份命令。这与 exec into the pod and run
相同,只是现在您使用 CronJob 将其自动化。
您可以 运行 它作为一个 cronjob 并设置图像以能够连接到数据库,或者您可以将它与您的数据库 pod 放在一起,并将其设置为 运行 cron
图像(即 运行 作为一个 mostly-idle 容器与您的数据库在同一个 pod 中)
CronJob 是去这里的方法。它的行为或多或少像一个 crontab,但对于 Kubernetes。
作为示例,您可以使用这个
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: 0 8 * * *
jobTemplate:
spec:
template:
spec:
containers:
- name: influxdb-backup
image: influxdb
imagePullPolicy: IfNotPresent
command: ["/bin/sh"]
args:
- "-c"
- "influxd backup -portable /backuppath"
restartPolicy: Never
这将创建一个作业,每天在 08:00 执行 influxd backup -portable /backuppath
。当然,您必须相应地对其进行编辑,才能在您的环境中工作。
这是我对这个问题使用的解决方案
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-backupscript
namespace: influx
data:
backupscript.sh: |
#!/bin/bash
echo 'getting pod name'
podName=$(kubectl get pods -n influx --field-selector=status.phase==Running --output=jsonpath={.items..metadata.name})
echo $podName
#echo 'create backup'
kubectl exec -it $podName -n influx -- /mnt/influxBackupScript/influxbackup.sh
echo 'done'
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: backup-cron
namespace: influx
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
volumes:
- name: backup-script
configMap:
name: cm-backupscript
defaultMode: 0777
containers:
- name: kubectl
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- /mnt/scripts/backupscript.sh
volumeMounts:
- name: backup-script
mountPath: "/mnt/scripts"
restartPolicy: Never