Kubernetes 移动或更改卷命名空间

Kubernetes 移动或更改卷命名空间,kubernetes,storage,volume,kubernetes-pvc,Kubernetes,Storage,Volume,Kubernetes Pvc,我们在Kubernetes中重新组织名称空间。我们希望将storageclass创建的持久卷声明从一个命名空间移动到另一个命名空间 (我们的备份工具没有帮助)。这是未记录的 在本例中,我们使用VMware storage provider,但它应该适用于任何storageClass 准备 进行*备份*备份*备份*备份*备份* 让我们设置一些环境变量并备份现有的PV和PVC资源 NAMESPACE1=XXX NAMESPACE2=XXX PVC=mypvc kubectl get pvc -n

我们在Kubernetes中重新组织名称空间。我们希望将storageclass创建的持久卷声明从一个命名空间移动到另一个命名空间

(我们的备份工具没有帮助)。

这是未记录的

在本例中,我们使用VMware storage provider,但它应该适用于任何storageClass

准备 进行*备份*备份*备份*备份*备份*

让我们设置一些环境变量并备份现有的PV和PVC资源

NAMESPACE1=XXX
NAMESPACE2=XXX
PVC=mypvc

kubectl get pvc -n $NAMESPACE1 $PVC -o yaml | tee /tmp/pvc.yaml

PV=pvc-XXXXXXXXXXXXX-XXXXXXXXXXXX

kubectl get pv  $PV -o yaml | tee /tmp/pv.yaml
改变光伏政策 如果您的永久卷(或存储提供程序)具有PersistentVolumeClaImpolicy=Delete,请确保将其更改为“Retain”,以避免在删除下面的PVC时丢失数据

运行以下命令:

kubectl patch pv "$PV" -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
然后检查:

kubectl describe pv "$PV" | grep -e Reclaim
移除PVC 手动删除持久卷声明(您有一个副本,对吗?)

修改持久卷(PV) 当PVC首次使用PV时,它会附加到名称空间。此外,PV被“连接”到PVC(通过它的
uid:
,而不是通过它的名称)

更改PV的命名空间。临时使用PVC“名称”来“锁定”该PVC的PV(而不是PVC uid)

检查我们现在拥有的:

kubectl get pv "$PV" -o yaml | grep -e Reclaim -e namespace -e uid: -e name: -e claimRef | grep -v " f:"
创建新的PVC 在新名称空间中创建PVC。确保明确选择要使用的PV(不要使用StorageClass来配置卷)。通常,您可以复制原始PVC YAML,但请在
元数据部分中删除
名称空间:
自链接:
uid:

此命令应该可以工作(它重复使用以前的PVC),但您可以使用自己的
kubectl apply
命令

grep -v -e "uid:" -e "resourceVersion:" -e "namespace:" -e "selfLink:"  /tmp/pvc.yml | kubectl -n "$NAMESPACE2" apply -f -
将PVC分配给PV 在这一点上,PV被限定为前PVC的名称(但它可能不起作用,并且不是标准配置)。运行
kubectl description-n“$NAMESPACE2”pvc“$pvc”
将投诉
状态:丢失
和/或
警告类错误
。那么,让我们来解决这个问题:

检索新PVC的uid:

PVCUID=$( kubectl get -n "$NAMESPACE2" pvc "$PVC" -o custom-columns=UID:.metadata.uid --no-headers )
然后相应地更新PV:

kubectl patch pv "$PV" -p '{"spec":{"claimRef":{"uid":"'$PVCUID'","name":null}}}'
几秒钟后,PV应为
状态:绑定

恢复策略=删除 PV再次处于
绑定
状态后,您可以恢复回收策略:

kubectl patch pv "$PV" -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

## Check :
kubectl get pv $PV -o yaml | grep -e Reclaim -e namespace

你使用什么备份工具?我想知道在
Velero
中是否可能。Velero似乎支持。我不使用它@马修
kubectl patch pv "$PV" -p '{"spec":{"claimRef":{"uid":"'$PVCUID'","name":null}}}'
kubectl patch pv "$PV" -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

## Check :
kubectl get pv $PV -o yaml | grep -e Reclaim -e namespace