从 Kubernetes 导出 PersistentVolumes 和 PersistentVolumesClaims API

Exporting PersistentVolumes and PersistentVolumesClaims from Kubernetes API

在 GKE 上,我创建了一个包含 volumeClaimTemplatesstatefulset。然后所有相关的 PersistentVolumesClaims, PersistentVolumesGoogle Persistent Disks 自动创建:

kubectl get pvc
NAME                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
        76m
qserv-data-qserv-worker-0      Bound    pvc-c5e060dc-88cb-4630-8229-c4b1fcb4f64b   3Gi        RWO            qserv          76m
qserv-data-qserv-worker-1      Bound    pvc-5dfffc24-165c-4e2c-a1fa-fa11dd45616f   3Gi        RWO            qserv          76m
qserv-data-qserv-worker-2      Bound    pvc-14aa9a63-fae0-4328-aaaa-17db2dee4b79   3Gi        RWO            qserv          76m
qserv-data-qserv-worker-3      Bound    pvc-8b701396-42ab-4d15-8b68-9b03ce5a2d07   3Gi        RWO            qserv          76m
qserv-data-qserv-worker-4      Bound    pvc-7c49e7a0-fd73-467d-b677-820d899f41ee   3Gi        RWO            qserv          76m
kubectl get pv
pvc-14aa9a63-fae0-4328-aaaa-17db2dee4b79   3Gi        RWO            Retain           Bound      default/qserv-data-qserv-worker-2      qserv                   77m
pvc-5dfffc24-165c-4e2c-a1fa-fa11dd45616f   3Gi        RWO            Retain           Bound      default/qserv-data-qserv-worker-1      qserv                   77m
pvc-7c49e7a0-fd73-467d-b677-820d899f41ee   3Gi        RWO            Retain           Bound      default/qserv-data-qserv-worker-4      qserv                   77m
pvc-8b701396-42ab-4d15-8b68-9b03ce5a2d07   3Gi        RWO            Retain           Bound      default/qserv-data-qserv-worker-3      qserv                   77m
pvc-c5e060dc-88cb-4630-8229-c4b1fcb4f64b   3Gi        RWO            Retain           Bound      default/qserv-data-qserv-worker-0      qserv                   77m
gcloud compute disks list                                                                                                                   
NAME                                           LOCATION       LOCATION_SCOPE  SIZE_GB  TYPE         STATUS
...
pvc-14aa9a63-fae0-4328-aaaa-17db2dee4b79       us-central1-c  zone            3        pd-balanced  READY
pvc-5dfffc24-165c-4e2c-a1fa-fa11dd45616f       us-central1-c  zone            3        pd-balanced  READY
pvc-7c49e7a0-fd73-467d-b677-820d899f41ee       us-central1-c  zone            3        pd-balanced  READY
pvc-8b701396-42ab-4d15-8b68-9b03ce5a2d07       us-central1-c  zone            3        pd-balanced  READY
pvc-c5e060dc-88cb-4630-8229-c4b1fcb4f64b       us-central1-c  zone            3        pd-balanced  READY

是否有一种简单的方法来提取 PVC/PV yaml 文件,以便我可以使用相同的 Google 磁盘重新创建所有 PVs/PVCs。 (如果我删除当前集群,这可能有助于将数据移动到新的 GKE 集群,或者如果有人不小心删除了 PVCs/PVs)

kubectl get pv,pvc -o yaml > export.yaml

以上命令不起作用,因为在运行时设置了太多技术字段,导致 kubectl apply -f export.yaml 无法运行。您知道从 export.yaml

中删除这些字段的方法吗

如问题中所问:

Is there a simple way to extract PVC/PV yaml file so that I can re-create all PVs/PVCs using the same Google Disks.

需要一些脚本来提取可以轻松使用的清单。

我发现了一个关于类似问题(如何导出清单)的 Whosebug 线程:

A side note!

I also stumbled upon kubectl neat (a plugin for kubectl) which will be referenced later in that answer.

As correctly pointed by the author of the post, kubectl neat will show the message at the time of installation:

WARNING: You installed plugin "neat" from the krew-index plugin repository.

These plugins are not audited for security by the Krew maintainers. Run them at your own risk.

我会考虑使用一些备份解决方案作为更可行的选择,因为数据持久性和一般数据保护以防出现任何故障。

从备份解决方案方面你可以看这里:

PVGKE 中实际上是 Google Persistent Disks。您可以创建一个 snapshot/image 磁盘作为备份措施。您还可以使用此功能来测试您的迁移行为:


请考虑以下示例作为解决方法。

我已经成功地将示例 Statefulset 从一个集群迁移到另一个集群,数据存储在 gce-pd

再一次,我鼓励您查看此文档,了解如何使用 GKE 中已有的磁盘来创建 Statefulset:

假设您使用了官方 Kubernetes 站点的清单:

您可以通过以下方式将其迁移到另一个集群:

  • 将每个 PV 上的 ReclaimPolicy 设置为 Retain 。 <-- 重要
  • 使用kubectl neat提取所需的清单
  • 编辑之前提取的清单
  • 删除旧集群上的现有工作负载
  • 正在新集群上创建工作负载

在每个 PV 使用时将 ReclaimPolicy 设置为 Retain

您需要检查您的 PV ReclaimPolicy 是否设置为 Retain。这将在 PVCPV 从集群中删除后停止删除 gce-pd。您可以按照 Kubernetes 文档进行操作:

更多参考:

使用kubectl neat提取所需的清单

有很多方法可以从 Kubernetes 中提取清单 API。我偶然发现 kubectl neat here. kubectl-neat 将删除清单中的一些字段。

我是这样使用的:

  • $ kubectl get statefulset -o yaml | kubectl neat > final-sts.yaml
  • $ kubectl get pvc -o yaml | kubectl neat > final-pvc.yaml
  • $ kubectl get pv -o yaml | kubectl neat > final-pv.yaml

Disclaimer!

This workaround will use the names of the dynamically created disks in GCP. If you were to create new disks (from snapshot for example) you would need to modify whole setup (use preexsiting disks guide referenced earlier).

以上命令将存储 Kubernetes 示例中使用的 StatefulSet 的清单。

编辑之前提取的清单

您需要编辑此清单以用于新创建的集群。这部分可以自动化:

  • final-pv.yaml - 删除.spec
  • 中的.claimRef

正在删除旧集群上的现有工作负载

您需要释放使用过的磁盘,以便新集群可以使用它们。您将需要删除此 Statefulset 以及随附的 PVCPV。请确保 PVreclaimPolicy 设置为 Retain.

正在新集群上创建工作负载

您将需要使用之前创建的清单并将它们应用于新集群:

  • $ kubectl apply -f final-pv.yaml
  • $ kubectl apply -f final-pvc.yaml
  • $ kubectl apply -f final-sts.yaml

至于导出清单,您还可以查看(如果可行)Kubernetes 客户端库:

这是一个示例脚本,它替换了 kubectl neat 和清单文件的手动编辑(删除了 .spec.claimRef 字段)以导出 PVC、PV 和 Google 之间的映射永久性磁盘。

https://github.com/k8s-school/skateful/blob/Whosebug/main.go

使用方法:

git clone https://github.com/k8s-school/skateful.git
git checkout Whosebug
# Requirements: go >= 1.14.7 and a kubeconfig file
make
./skateful

它将创建一个 pvc-pv.yaml 文件,该文件可以应用于任何新的 GKE kubernetes 集群,以便将现有的 Google 个永久磁盘附加到新的 PVCs/PVs。