移动或更改卷命名空间

Fra*_*iat 4 storage volume kubernetes kubernetes-pvc

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

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

Fra*_*iat 6

这是无证的。

在本示例中,我们使用 VMware 存储提供程序,但它应该适用于任何存储类。

准备

做一个 *备份*备份*备份*备份*备份* !!!

让我们设置一些环境变量并备份现有的 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
Run Code Online (Sandbox Code Playgroud)

更改 PV 的 ReclaimPolicy

如果您的持久卷(或存储提供程序)具有persistentVolumeReclaimPolicy=Delete,请确保将其更改为“保留”以避免在删除下面的 PVC 时丢失数据。

运行这个:

kubectl patch pv "$PV" -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
Run Code Online (Sandbox Code Playgroud)

然后检查:

kubectl describe pv "$PV" | grep -e Reclaim
Run Code Online (Sandbox Code Playgroud)

去除PVC

手动删除持久卷声明(您有副本,对吗?)。

kubectl delete -n "$NAMESPACE1" "$PVC"
Run Code Online (Sandbox Code Playgroud)

修改持久卷 (PV)

当 PVC 首次使用 PV 时,它会附加到命名空间。此外,PV 变得“附加”到 PVC(uid:根据它的名称,而不是它的名称)。

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

"kubectl patch pv "$PV" -p '{"spec":{"claimRef":{"namespace":"'$NAMESPACE2'","name":"'$PVC'","uid":null}}}'
Run Code Online (Sandbox Code Playgroud)

检查我们现在有什么:

kubectl get pv "$PV" -o yaml | grep -e Reclaim -e namespace -e uid: -e name: -e claimRef | grep -v " f:"
Run Code Online (Sandbox Code Playgroud)

创建新的 PVC

在新命名空间中创建 PVC。确保明确选择要使用的 PV(不要使用 StorageClass 来配置卷)。通常,您可以复制原始 PVC YAML,但将namespace:selfLink:uid:放在 部分中metadata:

这个命令应该可以工作(它重新使用以前的 PVC),但你可以使用你自己的kubectl apply命令。

grep -v -e "uid:" -e "resourceVersion:" -e "namespace:" -e "selfLink:"  /tmp/pvc.yml | kubectl -n "$NAMESPACE2" apply -f -
Run Code Online (Sandbox Code Playgroud)

将 PVC 分配给 PV

此时,PV绑定到以前的PVC的名称(但它可能不起作用,并且不是标准配置)。运行kubectl describe -n "$NAMESPACE2" pvc "$PVC"将抱怨Status: Lost和/或Warning ClaimMisbound。所以让我们解决这个问题:

检索新 PVC 的 uid:

PVCUID=$( kubectl get -n "$NAMESPACE2" pvc "$PVC" -o custom-columns=UID:.metadata.uid --no-headers )
Run Code Online (Sandbox Code Playgroud)

然后相应地更新 PV:

kubectl patch pv "$PV" -p '{"spec":{"claimRef":{"uid":"'$PVCUID'","name":null}}}'
Run Code Online (Sandbox Code Playgroud)

几秒钟后,PV 应该是Status: Bound

恢复 PV ReclaimPolicy=删除

一旦 PVBound再次处于状态,您可以恢复回收策略:

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

## Check :
kubectl get pv $PV -o yaml | grep -e Reclaim -e namespace
Run Code Online (Sandbox Code Playgroud)