【发布时间】:2021-01-28 23:22:10
【问题描述】:
从头开始:这里是 Kubernetes 的初学者。
我(想)知道如何为我的StatefulSet 创建一个卷以保持持久性。为此,我有
volumeMounts:
- name: db
mountPath: /var/lib/mydb
和
- metadata:
name: db
labels:
app: myapp
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
我认为这会给我的 pod 每个 (?) 50GB 空间来保存它们的东西。
这有助于我在数据库为空并从头开始时测试我的应用程序。我想,如果 pod 关闭并重新启动,它将能够重用数据库 - 这就是我理解这种持久性的方式。
但是,我希望能够使用具有历史记录的数据库进行测试,可能已经有几个 GB 大小。这意味着,每个 pod 都将挂载一个现有的数据库并从那里开始。因此每个 pod 都需要访问文件但也需要独立且独占地挂载它。我不能只挂载现有的卷并在 pod 之间共享它。
数据库应该是磁盘上的键值对存储,例如leveldb。
这将允许从数据库的不同现有状态测试应用程序。
这可能吗?
【问题讨论】:
-
安装现有数据库对您意味着什么?你可以在启动 Statefulset 之前初始化你的 PVC,注入正确的数据。如果没有找到卷,Statefulset 要么从头开始,要么只加载它找到的内容。假设您首先创建所有 PVC,启动一些 init Pod,然后
kubectl cp您的数据库文件到每个卷,关闭 init Pod 并创建您的 Statefulset:它应该从那里开始。 -
是的,这听起来像我需要的。通过挂载现有的数据库,我的意思是将现有的 LevelDB 复制到每个 pod 中,以便每个 pod 都可以使用自己的副本并从那里继续。那有意义吗?在启动 StatefulSet 之前,我该如何“发明正确的数据”?
-
当第一次启动你的 statefulset 时,它会创建一些以你的 STS 命名的 PVC。假设我的 STS 称为
toto,有 2 个副本,volumeClaimTemplate 创建了一个datavolume。然后,我可以创建一对 PVC,data-toto-0和data-toto-1,甚至在创建我的 StatefulSet 之前。接下来,创建一个作业、一个 Pod,...... 可以安装您的卷并自动设置它,或者让您连接,以您想要的方式提取数据,......一旦卷准备好,关闭您的 init Pod,并创建您的 STS。您将重新使用准备好的 PVC,而不是新的 PVC。 -
在执行此操作时(使用数据预置 PVC),您应该注意权限。首先,检查运行数据库容器的 UID 是什么。当您初始化 PVC 时,请确保使用相同的 ID,尝试重现您在运行设置中看到的权限,...
标签: kubernetes persistent-volumes kubernetes-statefulset persistent-volume-claims