这是我的总体目标:
我采取的方法:
这是配置的简化版本:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: some-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: do-block-storage
---
apiVersion: v1
kind: Service
metadata:
name: some-headless-service
labels:
app: my-app
spec:
ports:
- port: 27017
name: my-app-database
clusterIP: None
selector:
app: my-app
tier: database
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-app-database
labels:
app: my-app
tier: database
spec:
serviceName: some-headless-service
replicas: 1
selector:
matchLabels:
app: my-app
tier: database
template:
metadata:
labels:
app: my-app
tier: database
spec:
containers:
- name: my-app-database
image: mongo:latest
volumeMounts:
- name: some-volume
mountPath: /data
ports:
- containerPort: 27017
name: my-app-database
volumes:
- name: some-volume
persistentVolumeClaim:
claimName: some-pvc
这是按预期工作的。我可以将副本降速到 0:
kubectl scale —replicas=0 statefulset/my-app-database
旋转它回来:
kubectl scale —replicas=1 statefulset/my-app-database
并且数据会一直存在。。
但是有一次,当我上下调整 statefulset 时,我遇到了这个错误:
Volume is already exclusively attached to one node and can't be attached to another
作为 k8s 的新手,我删除了 PVC 并“重新创建”了相同的 PVC:
kubectl delete pvc some-pvc
kubectl apply -f persistent-volume-claims/
statefulset
用新 PV 旋转备份,旧 PV 被删除为 persistentVolumeReclaimPolicy
被设置为 Delete
默认情况下。我设置了这个新PV
persistentVolumeReclaimPolicy
至 Retain
以确保数据不会被自动删除……我意识到:我不确定如何回收该 PV。早些时候为了解决“卷附件”错误,我删除了 PVC,这将使用我拥有的设置创建另一个新 PV,现在我的数据留在了 Released
光伏。我的主要问题是:
claimRef
到动态创建的 PV,然后使用该 claimRef 重新创建一个新的 PVC,如下所述:Can a PVC be bound to a specific PV? statefulset
PVC 居然用那个旧的 PV? 最佳答案
如果您想使用 StatefulSet
有了可扩展性,您的存储也应该支持这一点,有两种方法可以解决这个问题:
do-block-storage
存储类支持 ReadWriteMany
,然后将所有 pod 的数据放在一个卷中。 volumeClaimTemplate
给您的 StatefulSet.spec
,然后 k8s 将创建 PVC,如
some-pvc-{statefulset_name}-{idx}
自动:spec:
volumeClaimTemplates:
- metadata:
name: some-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: do-block-storage
更新:
StatefulSet
复制品必须使用 mongodb replication 部署,然后是 StatefulSet
中的每个 pod将具有相同的数据存储。所以当容器运行时
mongod
命令,您必须添加选项 --replSet={name}
.当所有 Pod 都启动后,执行命令 rs.initiate()
告诉mongodb如何处理数据复制。放大或缩小时 StatefulSet
, 执行命令 rs.add()
或 rs.remove()
告诉mongodb成员已经改变。
关于kubernetes - 如何在 Kubernetes 中重新附加已发布的 PersistentVolume,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368453/