首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用与StatefulSet中的其他一个Pod相同的PVC计划作业

使用与StatefulSet中的其他一个Pod相同的PVC计划作业
EN

Stack Overflow用户
提问于 2020-01-02 11:38:33
回答 1查看 1.4K关注 0票数 2

在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完成的。

不利方面

  • 每个PostgreSQL实例在Pod中都有多个容器,一个用于为Postgres服务,一个用于在pgBackRest上使用一个小型包装器
  • 作业日志只显示成功的备份触发器,实际备份日志是备份容器的一部分。
  • 将运行备份的Pod可能运行在相对较旧的配置上,更改备份配置需要重新安排Pod,这可能意味着PostgreSQL主服务器的故障转移。

建议的设置

有一个CronJob计划--一个与StatefulSet的一个Pod具有相同卷的Pod。这将允许备份使用这些卷。

但是,它需要哪些卷是运行时决定的:我们可能希望在连接到主卷的卷上运行备份,或者希望使用副本的卷进行备份。主/副本在任何时候都可能发生变化,因为PostgreSQL主服务器的自动故障转移是解决方案的一部分。

目前,这是不可能的,因为我无法在CronJob规范中找到使用来自k8s api的任何信息的方法。

什么是有效的,但不是很好:

  • 使用计划作业的CronJob
  • 此作业查询k8s api并计划另一个作业

例如,为了让作业使用以下运行时信息创建另一个作业,我们可以这样做:

代码语言:javascript
复制
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,但我想知道是否有人有解决上述问题的解决方案。

不利方面

  • 作业日志只显示成功的备份触发器,实际备份日志是另一个作业的一部分
  • 作业需要调度Pod的权限,还需要另一个角色/角色绑定
  • 在Bash中使用遗传使事物更难阅读/解析/理解。

摘要

说来话长,但这些都是我们想要满足的限制:

  • 运行PostgreSQL数据库的备份
  • 这些是多TB数据库。
  • 因此,需要增量备份。
  • 因此,我们需要安装一个已经在运行的Pod的相同的PV。
  • 因此,我们需要在与PV相同的K8s节点上运行Pod (或容器)
  • 我们希望能够在CronJob规范中表达这一点,而不是必须执行运行时kubernetes api调用。
EN

回答 1

Stack Overflow用户

发布于 2020-01-02 13:37:11

好吧,简单而简短的回答是:你通常不能。

但让我们暂时保持创造力吧:)

非常有限的存储后端支持RWX (读写很多)访问,在大多数情况下,这些都是您在数据库使用时想要避免的较慢的访问。这意味着,除非您将备份包装器作为一个侧包运行(您现在这样做了),否则您无法在不同的POD (期间)中真正访问PVs。

我可能会坚持您最初的方法,进行一些调整(比如确保您不会因为备份/配置更改而关闭主服务器)。

在最新的K8S集群和支持的基础设施提供程序上,您可能可以查看基于快照的备份的VolumeSnapshots,并可能使用快照作为源来拆分增量备份作业。不过听起来有点纠结。

您还可以使用有限的资源(没有活动流量)运行备份专用postgres副本荚,并且只在Pod中嵌入备份逻辑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59562718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档