Cloning block volumes
Objective: Clone a Virtual Server block volume between storage classes, or regions.
Overview: This guide details using the clone_block_volume
function from the Kubernetes Cloud repository to clone between two example datacenter regions.
This guide requires kubectl
and a valid access token. View Getting Started for more details.
Volume Cloning
Storage Classes
Storage on CoreWeave Cloud is delineated by storage classes, in the notation of <storage type block|shared>
-<storage medium hdd|nvme>
-<region ord1|las1|etc>
. For example:
block-nvme-ewr1
block-nvme-las1
block-nvme-lga1
block-nvme-ord1
CSI Volume Cloning allows an existing volume to be duplicated:
Cloning via CLI within the same Storage Class
Cloning a block volume within the same storage class is easily done using our PVC cloning script, or with a simple PVC manifest:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: destination-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: block-nvme-ord1
volumeMode: Block
resources:
requests:
storage: 1234Gi
dataSource:
kind: PersistentVolumeClaim
name: source-pvc
Cloning via Web UI within the same Storage Class
Cloning within the same storage class can also be accomplished via the CoreWeave Cloud Storage UI:
Cloning via CLI between Storage Classes
Cloning a block volume between storage classes, as done when cloning between regions, requires data within the volume to be manually duplicated, as it cannot be zero-copied.
To automate the process of cloning a Virtual Server root disk block volume, we provide a block volume cloning script. This script creates a Kubernetes Job along with a new volume in the destination region, and uses dd
to clone between source as destination.
First, we identify the Virtual Server root disk volume we'd like to clone, located on CoreWeave's GitHub.
kubectl get pvc vs-example
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
vs-example Bound pvc-78d4950a-e1ba-476f-815e-b9c32e9c8b27 40Gi RWO block-nvme-ewr1 3m11s
Ensure it's not running:
kubectl get vs vs-example
NAME STATUS REASON STARTED INTERNAL IP EXTERNAL IP
vs-example VirtualServerStopped VirtualServerStopped False
Download and source the script:
curl https://raw.githubusercontent.com/coreweave/kubernetes-cloud/master/virtual-server/clone_block_volume.sh -o ~/clone_block_volume.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4109 100 4109 0 0 27211 0 --:--:-- --:--:-- --:--:-- 27211
source ~/clone_block_volume.sh
Initiate a clone:
clone_block_volume --source vs-example --destination vs-example --region lga1
persistentvolumeclaim/vs-example-lga1 created
job.batch/clone-vs-example-lga1 created
No resources found in namespace.
pod/clone-vs-example-lga1-rn55n condition met
job.batch/clone-vs-example-lga1 condition met
42945478656 bytes (43 GB, 40 GiB) copied, 54 s, 795 MB/s
40960+0 records in
40960+0 records out
42949672960 bytes (43 GB, 40 GiB) copied, 54.0091 s, 795 MB/s
job.batch "clone-vs-example-lga1" deleted
Script Workflow
In the clone example above, the following actions were performed:
- A new PVC in the destination namespace was created -
vs-example-lga1
- A cloning job was created -
clone-vs-example-lga1
- The script pauses until a worker pod is spun up -
clone-vs-example-lga1-rn55n
- The script pauses until the job reports a completed status
- Stats from the copy job are printed
- The Job (and its worker pod) are cleaned up and deleted
Script Arguments
--source
- Name of the root disk volume being cloned
--destination
- Desired name of new volume
- Region will always be appended as
-region
, e.gnew-vol-lga1
--region
- Name of destination region
- Storage class is automatically derived as
block-nvme-region