【问题标题】:Periodic database backup in kubernetes?Kubernetes中的定期数据库备份?
【发布时间】:2020-03-29 07:29:36
【问题描述】:

如何在 Kubernetes 中设置定期数据库备份?我在 kubernetes 中部署了一个 postgres 数据库作为 StatefulSet 并安装了一个 PersistantVolume 来存储数据。现在要定期备份已安装的卷,我找到了三个选项,

  1. 在 kubernetes 中设置一个CronJob 并执行 pg_dump 并上传到存储位置。
  2. 我已经在我的项目中使用了 celery。所以现在添加一个新任务来备份 postgres 数据并上传到存储位置。
  3. 卷快照。这看起来更像是 Kubernetes 的方式。但我找不到定期自动执行此操作的方法。

在 kubernetes 中进行定期卷备份的推荐方法是什么?

[编辑] 我更喜欢不使用运算符的解决方案。

【问题讨论】:

    标签: django database postgresql kubernetes


    【解决方案1】:

    在 kubernetes 中进行定期卷备份的推荐方法是什么?

    我会推荐VolumeSnapshots,但您需要记住,这不是正常的备份,您将无法将数据恢复到以前的状态。

    许多存储系统(如 Google Cloud Persistent Disks、Amazon Elastic Block Storage 和许多本地存储系统)都可以创建持久卷的“快照”。快照表示卷的时间点副本。快照可用于配置新卷(预填充快照数据)或将现有卷恢复到以前的状态(由快照表示)。

    它易于使用,截至 2019 年 12 月,它已移至测试版 Kubernetes 1.17 Feature: Kubernetes Volume Snapshot Moves to Beta。

    一旦你指定VolumeSnapshotClass

    例如,下面的 VolumeSnapshotClass 告诉 Kubernetes 集群一个 CSI 驱动程序 testdriver.csi.k8s.io 可以处理卷快照,并且当这些快照被创建时,它们的删除策略应该是删除。

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshotClass
    metadata:
     name: test-snapclass
    driver: testdriver.csi.k8s.io
    deletionPolicy: Delete
    parameters:
     csi.storage.k8s.io/snapshotter-secret-name: mysecret
     csi.storage.k8s.io/snapshotter-secret-namespace: mysecretnamespace
    

    普通快照控制器保留参数键csi.storage.k8s.io/snapshotter-secret-name和csi.storage.k8s.io/snapshotter-secret-namespace。如果指定,它将获取引用的 Kubernetes 机密并将其设置为卷快照内容对象上的注释。 CSI external-snapshotter sidecar 从内容注释中检索它,并在快照创建期间将其传递给 CSI 驱动程序。

    卷快照的创建由 VolumeSnapshot API 对象的创建触发。

    VolumeSnapshot 对象必须指定以下源类型:persistentVolumeClaimName - 要快照的 PVC 的名称。请注意,VolumeSnapshot 对象的源 PVC、PV 和 VolumeSnapshotClass 必须指向同一个 CSI 驱动程序。

    您可以创建VolumeSnapshot,在本例中将创建名为test-pvc的PVC快照:

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: test-snapshot
    spec:
      volumeSnapshotClassName: test-snapclass
      source:
        persistentVolumeClaimName: test-pvc
    

    当调用卷快照创建时,通用快照控制器首先创建一个 VolumeSnapshotContent 对象,其中包含 volumeSnapshotRef、源 volumeHandle、volumeSnapshotClassName(如果指定)、driver 和 deletionPolicy。

    您可以从卷快照恢复 PersistentVolumeClaim:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restore-pvc
    spec:
      storageClassName: csi-hostpath-sc
      dataSource:
        name: test-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    

    要支持从卷快照数据源恢复卷,请在 apiserver 和控制器管理器上启用 VolumeSnapshotDataSource 功能门。

    有什么限制?

    • 不支持将现有卷恢复到由快照表示的早期状态(测试版仅支持从快照配置新卷)。
    • 除了存储系统提供的任何保证(例如崩溃一致性)之外,没有快照一致性保证。这些是更高级别的 API/控制器的职责

    编辑:

    要自动执行此过程,您需要设置 CronJob 或使用 Python client library for kubernetes 编写 Python 代码,并根据需要更改例如 python/examples/custom_object.py。

    您还可以使用已开发的应用程序,例如stash.run。

    【讨论】:

    • 但是如何定期自动化呢?我想每天服用VolumeSnapshot。不使用任何操作符怎么可能?
    • @NirmalRaghavan,我已经编辑了答案以提供更多信息。
    • 如何使用CronJob执行VolumeSnapshot?我无法联系起来。我从没想过使用 Kubernetes 客户端库。谢谢!
    • 如果你创建一个yaml 来创建快照,它可以通过kubectl 命令使用,但是你可以在pod 中执行相同的操作,该kubectl 安装了二进制文件。您将需要处理该 pod 的 ServiceAccount 和角色,以便它可以创建资源。
    • @Crou 这是一个很好的回应,但你真的尝试过你在编辑部分写的内容吗?如果我没记错的话,我不知道如何设置这些东西,因为 python 客户端不理解snapshot.storage.k8s.io/v1beta1。请看我的问题stackoverflow.com/questions/61958371/…
    【解决方案2】:

    Velero 确实提供定期卷快照。我可能会从那里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2021-07-27
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多