本文档介绍了如何使用 Kubernetes 卷克隆在 Google Kubernetes Engine (GKE) 集群中克隆永久性卷。
概览
克隆是新的独立卷,即现有 Kubernetes 卷的副本。克隆与卷快照类似,因为它是特定时间点的卷副本。但是,卷克隆会使用来源卷中的所有数据预配克隆,而不是从来源卷创建快照对象。
要求
如需在 GKE 上使用卷克隆,必须满足以下要求:
- 来源 PersistentVolumeClaim 必须与目标 PersistentVolumeClaim 位于同一命名空间中。
- 使用支持卷克隆的 CSI 驱动程序。树内永久性磁盘驱动程序不支持卷克隆。
- Compute Engine 永久性磁盘 CSI 驱动程序 1.4.0 版及更高版本支持克隆,并且默认安装在运行 GKE 1.22 版或更高版本的新 Linux 集群上。您还可以在现有集群上启用 Compute Engine 永久性磁盘 CSI 驱动程序。
如需验证 Compute Engine 永久性磁盘 CSI 驱动程序版本,请在 gcloud CLI 中运行以下命令:
kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"
如果输出显示 1.4.0
之前的版本,请手动升级控制平面以获取最新版本。
限制
- 两个卷必须使用相同的卷模式。默认情况下,GKE 会将 VolumeMode 设置为
ext4
。 - 在 Compute Engine 上通过现有磁盘创建磁盘克隆的所有限制也适用于 GKE。
- 您可以通过可用区级磁盘创建区域级磁盘克隆,但您应该了解此方法的限制。
- 必须在兼容的可用区中完成克隆。使用 allowedTopologies 将预配卷的拓扑限制为特定可用区。或者,nodeSelectors 或亲和性和反亲和性可用于限制 pod,使其受限于在兼容可用区中运行的特定节点上运行。
- 对于从可用区到可用区的克隆,克隆可用区必须与来源磁盘可用区匹配。
- 对于从可用区到区域的克隆,克隆的一个副本可用区必须与来源磁盘的可用区匹配。
使用卷克隆
如需预配卷克隆,请将对同一命名空间中现有 PersistentVolumeClaim 的引用添加到新 PersistentVolumeClaim 的 dataSource
字段中。以下练习展示了如何使用数据预配来源卷,创建卷克隆以及使用克隆。
创建来源卷
如需创建来源卷,请按照使用适用于 Linux 集群的 Compute Engine 永久性磁盘 CSI 驱动程序中的说明创建 StorageClass、PersistentVolumeClaim 和 Pod 以使用新卷。您将使用创建的 PersistentVolumeClaim 作为卷克隆的来源。
将测试文件添加到来源卷
将测试文件添加到来源卷。您可以在卷克隆中查找此测试文件,以验证克隆成功。
在 Pod 中创建测试文件:
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
将
POD_NAME
替换为使用来源卷的 Pod 的名称。例如,如果您按照使用适用于 Linux 集群的 Compute Engine 永久性磁盘 CSI 驱动程序中的说明操作,请将POD_NAME
替换为web-server
。验证文件是否存在:
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
输出内容类似如下:
Hello World!
克隆来源卷
将以下清单保存为
podpvc-clone.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc-clone spec: dataSource: name: PVC_NAME kind: PersistentVolumeClaim accessModes: - ReadWriteOnce storageClassName: STORAGE_CLASS_NAME resources: requests: storage: STORAGE
替换以下内容:
PVC_NAME
:您在创建来源卷中创建的来源 PersistentVolumeClaim 的名称。STORAGE_CLASS_NAME
:要使用的 StorageClass 的名称,必须与来源 PersistentVolumeClaim 的 StorageClass 相同。STORAGE
:要请求的存储空间容量,必须至少为来源 PersistentVolumeClaim 的大小。
应用清单:
kubectl apply -f podpvc-clone.yaml
创建使用克隆卷的 Pod
以下示例会创建一个 Pod,该 Pod 使用您创建的卷克隆。
将以下清单保存为
web-server-clone.yaml
:apiVersion: v1 kind: Pod metadata: name: web-server-clone spec: containers: - name: web-server-clone image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc-clone readOnly: false
应用清单:
kubectl apply -f web-server-clone.yaml
验证测试文件是否存在:
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
输出内容类似如下:
Hello World!
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除
Pod
对象:kubectl delete pod POD_NAME web-server-clone
删除
PersistentVolumeClaim
对象:kubectl delete pvc podpvc podpvc-clone