有没有办法将现有卷(我刚从快照中恢复的卷)附加到 PVC?

有没有办法将现有卷(我刚从快照中恢复的卷)附加到 PVC?

我有一个使用 helm chart 创建的 mongodb-replicaset。该 chart 根据我提供的 StorageClass 创建 PVC。我使用快照卷的 cron 作业获取的标签注释我的卷。

如果我需要从备份快照中恢复,比如在另一个集群中,我知道我可以从快照中创建一个卷,但我不知道如何将该卷变成 StatefulSet 所期望的 PVC 并可以从中重新启动。

答案1

我了解到,StatefulSet将查找具有特定名称的 PVC。我从以下文档中了解到了这一点https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#limitations其中写道:

给定 Pod 的存储必须由 PersistentVolume Provisioner 根据请求的存储类进行配置,或者由管理员预先配置。

通过实验,我发现预先配置只是意味着创建PersistentVolumeClaim具有预期名称的 s。

我能够将 EBS 快照还原到卷,创建一个PersistentVolume直接引用已还原卷 ID 的卷,然后创建一个PersistentVolumeClaim具有正确名称的卷。例如,此 mongo 安装需要名为 的卷datadir-pii-mongodb-replicaset-[0-2],在将 EBS 快照还原到卷后,我使用以下 yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  labels:
    failure-domain.beta.kubernetes.io/region: us-west-2
    failure-domain.beta.kubernetes.io/zone: us-west-2a
  name: pv-a
  namespace: larksettings-pii
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 320Gi
  awsElasticBlockStore:
    fsType: xfs
    volumeID: aws://us-west-2a/vol-xxxxxxxxxxxxx
  storageClassName: mongo-xfs

---

apiVersion: v1
kind: PersistentVolumeClaim

metadata:
  labels:
    app: mongodb-replicaset
    release: pii
  name: datadir-pii-mongodb-replicaset-0
  namespace: larksettings-pii
spec:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 320Gi
    storageClassName: mongo-xfs
    volumeName: pv-a

注意可用性区域。由于我跨越了 3 个区域,因此我需要将三个快照还原到不同的区域,并确保规范PersistentVolume反映了这一点。

答案2

当您使用 StatefulSet(或 ReplicaSet)时,它会动态创建卷,因为 StatufulSet 使用 PVC 模板并基于该模板创建多个卷。因此,您无法指定哪个卷将被 PVC 声明。在这种情况下,可以基于快照创建 PV,但他只能在快照上声明。例如,副本 1 的快照可以安装到副本 3。事实上,不可能像那样恢复安装。

相关内容