我有一个带有三个节点的kubernetes集群。我需要将mysql服务器部署到群集,并且需要该mysql的持久性。因此,当我重新部署或重新启动Pod时,它不会擦除数据。
但是,如果我使用的存储类使用的是Azure磁盘,它将仅安装到主机上。
metadata:
name: mysql-storage
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "managed-premium"
resources:
requests:
storage: 5Gi
因此,如果我删除或重新部署Pod,它可以在未安装磁盘的另一台主机上启动,然后我的数据就消失了。
我尝试将accessModes更改为ReadWriteMany,但是在声明该卷时失败。说它只支持ReadWriteOnce。
答案 0 :(得分:0)
您无法真正解决此问题。有几种解决此问题的方法,例如您可以在托管磁盘上创建一个软件存储系统并使用该存储系统来存储数据,可以使用azure文件持久存储,可以从任何Pod(以及从多个Pod)挂载该文件。
受管磁盘只能安装到一个节点上(但是我认为该节点上的所有Pod都可以访问该磁盘),因此ReadWriteMany毫无意义。您可以使用StatefulSets来定义mysql,它将始终挂载到同一节点上,但是我认为您并不是真正需要它,PVC应该重新挂载到托管您的pod的节点上,唯一的缺点是它需要1分钟左右的时间将托管磁盘重新连接到另一个节点。
答案 1 :(得分:0)
您应该将StatefulSet与PersistentVolumeClaims(PVC)配合使用。
以下指南提供了一个很好的示例,说明了如何准确地执行所需的操作。
kubernetes.io: Run a Replicated Stateful Application
在指南中,您需要注意一些事项:
StatefulSet 提供有关这些Pod的顺序和唯一性的保证。并且定义包含一个 volumeClaimTemplates
volumeClaimTemplates 将确保每个吊舱都获得一个 PersistentVolumeClaims ,他们可以在其中写入数据。
PersistentVolumeClaims 保留存储,然后将其附加/挂载到POD
另一个细节,如果要保留数据和完整性,则不应删除资源,而应该升级。