我有一个使用 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。事实上,不可能像那样恢复安装。