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. 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
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 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:
$ 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
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
--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
Last modified 1yr ago