我有一个使用静态NFS PV的弹性簇。我如何将这些数据移动到另一台服务器上有更多空间(already did, just copy it)
,并且让应用程序应用新的备份数据而无需重新安装所有内容。
我在Centos 7(没有VM Sphere)上使用Rancher。
NFS path
和limitStorage
更新到新的备份服务器,但k8不允许。错误消息:
#持久卷声称“ data-core-container-log-elasticsearch-data-0”无效:
#*规范:禁止:创建后除了资源,绑定声明请求之外都是不变的
答案 0 :(得分:2)
可能有几种解决方案,这对我来说是可以解决您在上述情况下提到的所有问题的。
假设nfs驱动器已装满,请在10.20.4.101
处使用nfs批量声明的状态集。我重新放置了所有数据并将其复制到另一个虚拟机10.20.4.102
。
现在,在保留旧配置的同时,我在同一命名空间中使用10.20.4.102
创建了一个新PV,并使用了与原始标签不同的标签
New Settings
metadata:
name: my-pv-1
namespace: pv-test
labels:
volume-type: pv-1
Old Settings
metadata:
name: my-pv
namespace: pv-test
labels:
volume-type: pv
这会在您的命名空间中创建一个新的PV,您可以在kubectl get pv
中看到状态为Available
,其他状态为Bound
现在将您的statefulset yaml文件字段volume-type
更新为新字段,与新pv
中的标签相同,并将volumeClaimTemplates
中的名称更改为新名称。现在不要应用此设置。
New
volumeClaimTemplates:
- metadata:
name: pv-data-1
namespace: pv-test
selector:
matchLabels:
volume-type: pv-1
Old
volumeClaimTemplates:
- metadata:
name: pv-data
namespace: pv-test
selector:
matchLabels:
volume-type: pv
您肯定不能直接申请,这将引发类似Forbidden: updates to statefulset spec for fields other than `replicas`, `template` and `updateStrategy` are forbidden.
之类的错误。
现在,您都可以删除并重新创建整个statefulset
,而停机时间很小。或者您可以使用--cascade=false
标志
kubectl delete statefulset mystatefulset -n pv-test --cascade=false
这只会删除状态集而不是有状态集中的Pod,如果您监视名称空间中的所有资源,它将删除状态集,但不会删除Pod或任何资源。使所有应用程序仍然可以访问正在运行的应用程序。
现在apply
更新了状态集,这将创建具有不同pvc的新状态集。但是您的广告连播仍会引用旧的pvc和pv。
现在只需使用kubectl delete pod mypod-0 -n pv-test
这将删除Pod,但是在后台的statefulset会在删除时使用新的pvc创建一个新的Pod。现在,如果您kubectl pv和pvc,您将发现会有另外一个pvc,并且带有Available
的pv将变成Bound
并由pvc声明。
手动删除所有吊舱,有状态集负责娱乐。完成所有操作后,请先手动删除旧的pvc,然后再删除旧的pv。
您可能已经尝试了所有这些方法,并且都知道它们,只是为了清楚起见,我在这里写下了所有步骤,而不是隐约地解释。
希望这会有所帮助。