在Kubernetes集群中,我希望能够安排一个作业(带有一个CronJob),它将装载与给定StatefulSet的1 Pod相同的卷。哪个Pod是运行时的决定,取决于计划作业时在Pod上设置的标签。
我想许多人会想知道为什么,因此,描述一下我们正在做和试图做的事情:
电流设置
我们有一个StatefulSet,它服务于PostgreSQL数据库。(一个主要的、多个副本)我们希望能够从StatefulSet的一个荚创建一个备份。
对于PostgreSQL,我们已经可以使用pg_basebackup在网络上进行备份,但是我们正在运行多TB PostgreSQL数据库,这意味着完全流备份(使用pg_basebackup)是不可行的。
我们目前使用pgBackRest备份数据库,这允许增量备份。
由于pgBackRest的增量备份需要访问数据卷和WAL卷,我们需要在与PostgreSQL实例相同的Kubernetes节点上运行备份容器,因此我们甚至在单独的容器中在同一个Pod中运行它。
在容器中,一个小api环绕着pgBackRest,可以通过向api发送POST请求来触发,这种触发目前是使用CronJobs完成的。
不利方面
pgBackRest上使用一个小型包装器建议的设置
有一个CronJob计划--一个与StatefulSet的一个Pod具有相同卷的Pod。这将允许备份使用这些卷。
但是,它需要哪些卷是运行时决定的:我们可能希望在连接到主卷的卷上运行备份,或者希望使用副本的卷进行备份。主/副本在任何时候都可能发生变化,因为PostgreSQL主服务器的自动故障转移是解决方案的一部分。
目前,这是不可能的,因为我无法在CronJob规范中找到使用来自k8s api的任何信息的方法。
什么是有效的,但不是很好:
例如,为了让作业使用以下运行时信息创建另一个作业,我们可以这样做:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: schedule-backup
spec:
schedule: "13 03 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup-trigger
image: bitnami/kubectl
command:
- sh
- -c
- |
PRIMARYPOD=$(kubectl get pods -l cluster-name=<NAME>,role=master -o custom-columns=":metadata.name" --no-headers)
kubectl apply -f - <<__JOB__
apiVersion: batch/v1
kind: Job
metadata:
name: test
spec:
volumes:
name: storage-volume
persistentVolumeClaim:
claimName:
data-volume-${PRIMARYPOD}
[...]
__JOB__以上内容最好由操作员来提供,而不是只使用CronJob,但我想知道是否有人有解决上述问题的解决方案。
不利方面
摘要
说来话长,但这些都是我们想要满足的限制:
发布于 2020-01-02 13:37:11
好吧,简单而简短的回答是:你通常不能。
但让我们暂时保持创造力吧:)
非常有限的存储后端支持RWX (读写很多)访问,在大多数情况下,这些都是您在数据库使用时想要避免的较慢的访问。这意味着,除非您将备份包装器作为一个侧包运行(您现在这样做了),否则您无法在不同的POD (期间)中真正访问PVs。
我可能会坚持您最初的方法,进行一些调整(比如确保您不会因为备份/配置更改而关闭主服务器)。
在最新的K8S集群和支持的基础设施提供程序上,您可能可以查看基于快照的备份的VolumeSnapshots,并可能使用快照作为源来拆分增量备份作业。不过听起来有点纠结。
您还可以使用有限的资源(没有活动流量)运行备份专用postgres副本荚,并且只在Pod中嵌入备份逻辑。
https://stackoverflow.com/questions/59562718
复制相似问题