从 Kubernetes 导出 PersistentVolumes 和 PersistentVolumesClaims API
Exporting PersistentVolumes and PersistentVolumesClaims from Kubernetes API
在 GKE 上,我创建了一个包含 volumeClaimTemplates
的 statefulset
。然后所有相关的 PersistentVolumesClaims
, PersistentVolumes
和 Google 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.
我会考虑使用一些备份解决方案作为更可行的选择,因为数据持久性和一般数据保护以防出现任何故障。
从备份解决方案方面你可以看这里:
- Portwortx.com: How to migrate stateful application from one gcp region to another with portwortx kubemotion
- Velero.io
PV
在 GKE
中实际上是 Google Persistent Disks
。您可以创建一个 snapshot/image 磁盘作为备份措施。您还可以使用此功能来测试您的迁移行为:
- Cloud.google.com: Compute: Docs: Disks: Create snapshots
- Cloud.google.com: Compute: Docs: Images: Create delete deprecate private images
请考虑以下示例作为解决方法。
我已经成功地将示例 Statefulset
从一个集群迁移到另一个集群,数据存储在 gce-pd
。
再一次,我鼓励您查看此文档,了解如何使用 GKE
中已有的磁盘来创建 Statefulset
:
假设您使用了官方 Kubernetes 站点的清单:
您可以通过以下方式将其迁移到另一个集群:
- 将每个
PV
上的 ReclaimPolicy
设置为 Retain
。 <-- 重要
- 使用
kubectl neat
提取所需的清单
- 编辑之前提取的清单
- 删除旧集群上的现有工作负载
- 正在新集群上创建工作负载
在每个 PV
使用时将 ReclaimPolicy
设置为 Retain
您需要检查您的 PV
ReclaimPolicy
是否设置为 Retain
。这将在 PVC
和 PV
从集群中删除后停止删除 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
以及随附的 PVC
和 PV
。请确保 PV
的 reclaimPolicy
设置为 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。
在 GKE 上,我创建了一个包含 volumeClaimTemplates
的 statefulset
。然后所有相关的 PersistentVolumesClaims
, PersistentVolumes
和 Google 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.
我会考虑使用一些备份解决方案作为更可行的选择,因为数据持久性和一般数据保护以防出现任何故障。
从备份解决方案方面你可以看这里:
- Portwortx.com: How to migrate stateful application from one gcp region to another with portwortx kubemotion
- Velero.io
PV
在 GKE
中实际上是 Google Persistent Disks
。您可以创建一个 snapshot/image 磁盘作为备份措施。您还可以使用此功能来测试您的迁移行为:
- Cloud.google.com: Compute: Docs: Disks: Create snapshots
- Cloud.google.com: Compute: Docs: Images: Create delete deprecate private images
请考虑以下示例作为解决方法。
我已经成功地将示例 Statefulset
从一个集群迁移到另一个集群,数据存储在 gce-pd
。
再一次,我鼓励您查看此文档,了解如何使用 GKE
中已有的磁盘来创建 Statefulset
:
假设您使用了官方 Kubernetes 站点的清单:
您可以通过以下方式将其迁移到另一个集群:
- 将每个
PV
上的ReclaimPolicy
设置为Retain
。 <-- 重要 - 使用
kubectl neat
提取所需的清单 - 编辑之前提取的清单
- 删除旧集群上的现有工作负载
- 正在新集群上创建工作负载
在每个 PV
使用时将 ReclaimPolicy
设置为 Retain
您需要检查您的 PV
ReclaimPolicy
是否设置为 Retain
。这将在 PVC
和 PV
从集群中删除后停止删除 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
以及随附的 PVC
和 PV
。请确保 PV
的 reclaimPolicy
设置为 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。