K8s nfs static pv full,如何使用新的备份 nfs static pv 更新 "pvc/pv" 而无需重新安装所有
K8s nfs static pv full, how to update "pvc/pv" using new backup nfs static pv without reinstall all
问题:
我有一个使用静态 NFS PV 的弹性集群。我如何将这些数据移动到另一台服务器有更多 space (already did, just copy it)
和 保持应用程序应用新的备份数据而无需重新安装所有内容 。
我在 Centos 7 上使用 Rancher(没有 VM Sphere)。
我的尝试:
- 更新 PV
NFS path
和 limitStorage
到新的备份服务器,但 k8s 不允许。
- 在新的备份服务器上使用新的PV更新现有的PVC,但k8s仍然不允许。
错误信息:
# persistentvolumeclaims "data-core-container-log-elasticsearch-data-0" was not valid:
# * spec: Forbidden: is immutable after creation except resources.requests for bound claims
可能有多种解决方案,这对我来说是解决了你在上述场景中提到的所有问题。
假设 nfs 驱动器已满,在 10.20.4.101
处获取了一个带有 nfs 卷声明的有状态集。我将所有数据重新定位并复制到另一个虚拟机 10.20.4.102
.
现在,在我保留旧配置的同时,我在同一命名空间中创建了一个新的 PV 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
flag
来做这个小技巧
kubectl delete statefulset mystatefulset -n pv-test --cascade=false
这只会删除有状态集而不是有状态集中的 pods,如果您监视命名空间中的所有资源,它将删除有状态集而不是 pods 或任何资源.保持所有应用程序仍在访问应用程序 运行.
现在 apply
更新的 statefulset 这将创建具有不同 pvc 的新 statefulset。但是你的 pods 仍然指的是旧的 pvc 和 pv.
现在只需使用 kubectl delete pod mypod-0 -n pv-test
删除 pod
这将删除 pod,但 statefulset 在后台创建一个带有新 pvc 的新 pod,因为它被删除。现在,如果你使用 kubectl pv 和 pvc,你会观察到会有一个额外的 pvc,带有 Available
的 pv 将变成 Bound
并由 pvc 声明。
手动删除所有 pods,statefulset 负责重新创建。一切完成后,先手动删除旧的pvc,然后再删除旧的pv。
您可能已经尝试了所有这些并且了解所有这些,为了清楚起见,我在这里写下了所有步骤,而不是含糊地解释。
希望这对您有所帮助。
问题:
我有一个使用静态 NFS PV 的弹性集群。我如何将这些数据移动到另一台服务器有更多 space (already did, just copy it)
和 保持应用程序应用新的备份数据而无需重新安装所有内容 。
我在 Centos 7 上使用 Rancher(没有 VM Sphere)。
我的尝试:
- 更新 PV
NFS path
和limitStorage
到新的备份服务器,但 k8s 不允许。 - 在新的备份服务器上使用新的PV更新现有的PVC,但k8s仍然不允许。
错误信息:
# persistentvolumeclaims "data-core-container-log-elasticsearch-data-0" was not valid:
# * spec: Forbidden: is immutable after creation except resources.requests for bound claims
可能有多种解决方案,这对我来说是解决了你在上述场景中提到的所有问题。
假设 nfs 驱动器已满,在 10.20.4.101
处获取了一个带有 nfs 卷声明的有状态集。我将所有数据重新定位并复制到另一个虚拟机 10.20.4.102
.
现在,在我保留旧配置的同时,我在同一命名空间中创建了一个新的 PV 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
flag
kubectl delete statefulset mystatefulset -n pv-test --cascade=false
这只会删除有状态集而不是有状态集中的 pods,如果您监视命名空间中的所有资源,它将删除有状态集而不是 pods 或任何资源.保持所有应用程序仍在访问应用程序 运行.
现在 apply
更新的 statefulset 这将创建具有不同 pvc 的新 statefulset。但是你的 pods 仍然指的是旧的 pvc 和 pv.
现在只需使用 kubectl delete pod mypod-0 -n pv-test
这将删除 pod,但 statefulset 在后台创建一个带有新 pvc 的新 pod,因为它被删除。现在,如果你使用 kubectl pv 和 pvc,你会观察到会有一个额外的 pvc,带有 Available
的 pv 将变成 Bound
并由 pvc 声明。
手动删除所有 pods,statefulset 负责重新创建。一切完成后,先手动删除旧的pvc,然后再删除旧的pv。
您可能已经尝试了所有这些并且了解所有这些,为了清楚起见,我在这里写下了所有步骤,而不是含糊地解释。
希望这对您有所帮助。